浅析 Servlet 执行原理

作者:Alan_beijing来源:https://www.cnblogs.com/wangjiming/p/10360327.html在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角色
 
浅析 Servlet 执行原理

文章插图
 
 
(二)控制器角色
jsp充当页面角色 , Servlet扮演控制器角色 , 两者组合构建基本的MVC三层架构模式
浅析 Servlet 执行原理

文章插图
 
 
四、Servlet在容器中的生命周期
下图为Servlet生命周期简要概图:
浅析 Servlet 执行原理

文章插图
 
 
分析:
第一步:容器先加载Servlet类 。
第二步:容器实例化Servlet(Servlet无参构造函数执行) 。
第三步:执行init()方法(在Servlet生命周期中 , 只执行一次 , 且在service()方法执行前执行) 。
第四步:执行service()方法 , 处理客户请求 , doPost()或doGet() 。
第五步:执行destroy() , 销毁线程 。

【浅析 Servlet 执行原理】


    推荐阅读