浅析Servlet执行原理

在JavaWeb学习研究中,Servlet扮演重要的做用,学好它,是后续JavaWeb学习的良好基础。不管是SSH,仍是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效果,本篇将主要分析Servlet的运行原理。html

一 UMLsql

下图为Servlet UML关系图。浏览器

从图中,能够看出:安全

1.抽象类HttpServlet继承抽象类GenericServlet,其有两个比较关键的方法,doGet()和doPost()服务器

2.GenericServlet实现接口Servlet,ServletConfig,Serializable架构

3.MyServlet(用户自定义Servlet类)继承HttpServlet,重写抽象类HttpServlet的doGet()和doPost()方法并发

注:任何一个用户自定义Servlet,只需重写抽象类HttpServlet的doPost()和doGet()便可,如上图的MyServletjsp

二 Servlet在容器中的执行过程分布式

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

分析:

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无参构造函数执行)

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

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

第五步:执行destroy(),销毁线程 欢迎工做一到五年的Java工程师朋友们加入Java群: 741514154 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!

相关文章
相关标签/搜索