博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
揭秘Java Web技术内幕---Servlet
阅读量:6772 次
发布时间:2019-06-26

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

在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(),销毁线程

 

转载:

转载于:https://www.cnblogs.com/technologykai/articles/10910739.html

你可能感兴趣的文章
读《Go并发编程实战》第4章 流程控制方式
查看>>
IT168:数据库安全审计用户需求调查报告
查看>>
Lync Server 2010不同规模拓扑图详解
查看>>
QQ群排名优化:“小百度”大蓝海有搞头
查看>>
写在毕业季(四):是做IT?IT?还是IT呢?
查看>>
Gtk-WARNING **: 无法在模块路径中找到主题引擎:“pixmap”
查看>>
验证控件收藏
查看>>
安装配置Varnish3.0手记
查看>>
舌尖上的职场(三)我来买单!
查看>>
HighChartS cpu利用率动态图(Java版)
查看>>
extern int *a与extern int a[]
查看>>
转: 测试云服务器的工具相关
查看>>
分布式事务 & 两阶段提交 & 三阶段提交
查看>>
linux下编译upx 3.93
查看>>
MySQL 优化
查看>>
MCMC采样理论的一点知识
查看>>
bram和dram差别
查看>>
让人头疼的关键用户
查看>>
poj2001 Shortest Prefixes
查看>>
在Eclipse中安装python插件的方法
查看>>