欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅析Servlet执行原理

程序员文章站 2023-09-20 16:47:59
在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础。无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效果,本篇将主要分析Servlet的运行原理。 一 UML 下图为Servlet UML关系图。 从图 ......

     在javaweb学习研究中,servlet扮演重要的作用,学好它,是后续javaweb学习的良好基础。无论是ssh,还是ssm,微服务javaweb技术,都应先学好servlet,从而达到事半功倍的效果,本篇将主要分析servlet的运行原理。

一 uml


 下图为servlet uml关系图。

浅析Servlet执行原理

从图中,可以看出:

1.抽象类httpservlet继承抽象类genericservlet,其有两个比较关键的方法,doget()和dopost()

2.genericservlet实现接口servlet,servletconfig,serializable

3.myservlet(用户自定义servlet类)继承httpservlet,重写抽象类httpservlet的doget()和dopost()方法

注:任何一个用户自定义servlet,只需重写抽象类httpservlet的dopost()和doget()即可,如上图的myservlet

二 servlet在容器中的执行过程


 servlet只有放在容器中,方可执行,且servlet容器种类较多,如tomcat,weblogic等。下图为简单的 请求响应 模型。

浅析Servlet执行原理

分析:

1.浏览器向服务器发出get请求(请求服务器servleta)

2.服务器上的容器逻辑接收到该url,根据该url判断为servlet请求,此时容器逻辑将产生两个对象:请求对象(httpservletrequest)和响应对象(httpservletresponce)

3.容器逻辑根据url找到目标servlet(本示例目标servlet为servleta),且创建一个线程a

4.容器逻辑将刚才创建的请求对象和响应对象传递给线程a

5.容器逻辑调用servlet的service()方法

6.service()方法根据请求类型(本示例为get请求)调用doget()(本示例调用doget())或dopost()方法

7.doget()执行完后,将结果返回给容器逻辑

8.线程a被销毁或被放在线程池中

注意:

1.在容器中的每个servlet原则上只有一个实例

2.每个请求对应一个线程

3.多个线程可作用于同一个servlet(这是造成servlet线程不安全的根本原因)

4.每个线程一旦执行完任务,就被销毁或放在线程池中等待回收

三 servlet在javaweb中扮演的角色


 servlet在javaweb中,扮演两个角色:页面角色和控制器角色。

有了jsp等动态页面技术后,servlet更侧重于控制器角色,jsp+servlert+model 形成基本的三层架构

(一)页面page角色

protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
        request.setcharacterencoding("utf-8");
        response.setcontenttype("text/html;charset=utf-8");
        printwriter out=response.getwriter();
        out.println("hello!servlet.");
    }

(二)控制器角色

 jsp充当页面角色,servlet扮演控制器角色,两者组合构建基本的mvc三层架构模式

浅析Servlet执行原理

 

四 servlet在容器中的生命周期


 下图为servlet生命周期简要概图

浅析Servlet执行原理

分析:

第一步:容器先加载servlet类

第二步:容器实例化servlet(servlet无参构造函数执行)

第三步:执行init()方法(在servlet生命周期中,只执行一次,且在service()方法执行前执行)

第四步:执行service()方法,处理客户请求,dopost()或doget()

第五步:执行destroy(),销毁线程

 五 版权区


 

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2098469527@qq.com。
  • 可以转载该博客,但必须著名博客来源。