博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析Servlet执行原理
阅读量:7243 次
发布时间:2019-06-29

本文共 1943 字,大约阅读时间需要 6 分钟。

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

一 UML

下图为Servlet UML关系图。

从图中,可以看出:

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等。下图为简单的 请求响应 模型。

分析:

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等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

转载于:https://blog.51cto.com/14084556/2350878

你可能感兴趣的文章
Linux学习 -->解决Ubuntu系统上 No command 'crond' found
查看>>
如何使core dump生效之unlimit及gdb相关命令(C++)
查看>>
运维部奖励员工之大连游记
查看>>
基于OHCI的USB主机开发 —— OHCI(控制端口写数据)
查看>>
自学人工智能:1-3 接触scrapy框架
查看>>
prototype中Hash的测试
查看>>
能删除Windows下“本地安装源 (Msocache)”吗?
查看>>
oracle卸载与安装
查看>>
Mysql半同步复制(Semi-synchronous Replication)
查看>>
[CTO札记]内容开放的思考
查看>>
Mocha BSM业务服务管理——业务服务定义与展现
查看>>
No curses/termcap library found
查看>>
iOS设备接入WiFi和3G网络安全性分析
查看>>
.NET领域驱动设计—初尝(三:穿过迷雾走向光明)
查看>>
iscsi Target (TGT)
查看>>
微软与VMWARE的桌面虚拟化简介
查看>>
基于hadoop2.7集群的Spark2.0,Sqoop1.4.6,Mahout0.12.2完全分布式安装
查看>>
B3-从http头中找到X-Forwarded-For发来的客户端ip 地址
查看>>
让榨汁机定时工作(C#+PLC)
查看>>
DNS服务
查看>>