浅析Servlet执行原理

原贴地址:
https://www.cnblogs.com/wangjiming/p/10360327.html

原作者画的图挺好.
自己之前看过iis的一些配置文档
但是发现自己只是知其然 不知其所以然(当然了现在也是)

看了下这个servlet 的简介 也明白了一点 iis里面的内容.

自己知道的事情还是太少 对这一块的东西理解的不是很深入 需要加紧学习. 

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

[转帖]浅析Servlet执行原理的更多相关文章

  1. 浅析Servlet执行原理

    在JavaWeb学习研究中,Servlet扮演重要的作用,学好它,是后续JavaWeb学习的良好基础.无论是SSH,还是SSM,微服务JavaWeb技术,都应先学好Servlet,从而达到事半功倍的效 ...

  2. 浅析laravel路由执行原理

    包头SEO:目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录 首先看入口 index.php 关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包 ...

  3. HTTP协议 Servlet入门 Servlet工作原理和生命周期 Servlet细节 ServletConfig对象

    1 HTTP协议特点   1)客户端->服务端(请求request)有三部份     a)请求行--请求行用于描述客户端的请求方式.请求的资源名称,以及使用的HTTP协议版本号 请求行中的GET ...

  4. Servlet工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  5. Servlet工作原理分析

    最近在看<Java Web技术内幕>的Servlet工作原理,有点深奥和难以理解,于是乎,想通过一个简单的Demo将书上的思路理一遍,对Servlet有个更透彻更深的了解. Servlet ...

  6. (4.1)Spring MVC执行原理和基于Java的配置过程

    一.Spring MVC执行原理和基于Java配置的配置过程 (一)Spring MVC执行过程,大致为7步. 所有的请求都会经过Spring的一个单例的DispacherServlet. Dispa ...

  7. Servlet底层原理、Servlet实现方式、Servlet生命周期

    Servlet简介 Servlet定义 Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序. Servlet的特点 (1)Servlet对像,由Servlet容器 ...

  8. Java web每天学之Servlet工作原理详情解析

    上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...

  9. Servlet运行原理以及生命周期

    一.Servlet生命周期: Servlet加载.实例化.初始化.服务.销毁. 1.初始化init(): 当服务启动时,Servlet被装入tomcat或者其他服务器容器时执行(服务器容器从启动到停止 ...

随机推荐

  1. 统计硬币 HDU - 2566 (三种解法:线性代数解法,背包解法,奇思妙想解法 >_< )

    题号放这里自己去找吧. HDU-2566 这题最开始用的dp,然后,被同学用奇思妙想过了.  >_<  开心! -_- !! 然后,被我线性代数给过了. 方法一:dp 将其化为01背包,只 ...

  2. c++ 启动exe(启动别的exe程序)

    http://blog.csdn.net/sdcxyz/article/details/13631613 1例程 1.1面向过程例程如下: #include <iostream> #inc ...

  3. Signature Request Warnings & eth_sign学习

    https://consensys.zendesk.com/hc/en-us/articles/360004427792-Signature-Request-Warnings-eth-sign Met ...

  4. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  5. 关于java中BufferedReader的read()及readLine()方法的使用心得

    BufferedReader的readLine()方法是阻塞式的, 如果到达流末尾, 就返回null, 但如果client的socket末经关闭就销毁, 则会产生IO异常. 正常的方法就是使用sock ...

  6. alios-things makefile

    https://blog.csdn.net/crazyskady/article/details/80849765 MAKEFILE下面这句:CFLAGS=-I/home/develop/includ ...

  7. java Switch中的case后面加上大括号({})和不加大括号的区别

    java基础求真之switch 的case 后面加上大括号和不加大括号的区别. 下面给出三段代码大家看一下有什么不同以及哪段代码能够编译通过那段代码编译不能通过,为什么?(Why?) 代码片段一: i ...

  8. Java多线程编程模式实战指南一:Active Object模式(下)

    Active Object模式的评价与实现考量 Active Object模式通过将方法的调用与执行分离,实现了异步编程.有利于提高并发性,从而提高系统的吞吐率. Active Object模式还有个 ...

  9. 如何应用ML的建议-下

    正则化与过拟合(highvariance)和欠拟合(highbias)的关系-部分(五) ML的诊断方法-部分(六) 如何采取下一步-部分(七) 部分(五) 从图中可以看出,正则化项可以用来影响模型函 ...

  10. [02] SpringBoot的项目属性配置

    1.application.properties 简述 配置文件的使用和调整都非常方便,直接在项目默认的classpath下的application.properties文件中做调整即可.例如Spri ...