浅析 Servlet 执行原理


在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角色


<code>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.");
   }/<code>


(二)控制器角色

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


浅析 Servlet 执行原理

四、Servlet在容器中的生命周期


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


浅析 Servlet 执行原理


分析:


第一步:容器先加载Servlet类


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


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


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


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


最后我自己是一名从事了多年开发的JAVA老程序员,今年年初我花了一个月整理了一份最适合2020年学习的java学习干货,想分享给每一位喜欢java的小伙伴,需要获取的可以关注我并在后台私信我:01,即可免费领取。


分享到:


相關文章: