Java Web每天学之Servlet的工作原理解析,上海尚学堂Java技术文章Java Web系列之二
上一篇文章Java Web每天学之Servlet的工作原理解析是之一,欢迎点击阅读。

Servlet 是 Server 与 Applet 的缩写,是服务端小程序的意思。 使用 Java 语言编写的服务器端程序,可以像生成动态的 WEB 页, Servlet 主要运行在服务器端,并由服务器调用执行,是一种按照 Servlet 标准来开发的类。 是 SUN 公司提供的一门用于开发动态 Web 资源的技术。

Servlet 本质上也是 Java 类,但要遵循 Servlet 规范进行编写,没有 main()方法,它的创建、使用、销毁都由 Servlet 容器进行管理(如 Tomcat)。

Servlet 是和 HTTP 协议是紧密联系的,其可以处理 HTTP 协议相关的所有内容。这也是 Servlet应用广泛的原因之一。提供了 Servlet 功能的服务器,叫做 Servlet 容器,其常见容器有很多,如 Tomcat, Jetty,WebLogic Server, Websphere, JBoss 等等。

作用:接收请求数据, 处理请求, 完成响应

1、请求处理工作原理

执行过程
客户端发出请求http://localhost:8080/xxx
根据Web.xml文件的配置,找到对应的
读取中的值
找到对应的
找到该class并加载执行该class,返回结果
由Web服务器将结果响应给客户端

2、Servlet的实现方式

SUN公司定义了一个接口和两个实现类,Servlet接口,GenericServlet和HttpServlet实现类,其中后者是前者的子类,子类在原有基础上添加了一些HTTP协议处理方法,HttpServlet比GenerricServlet功能更强大,所以我们一般将自己的类继承自HttpServlet,并重写doGet方法和doPost方法,或重写Service方法。以下三种方式都可以。
实现Servlet接口
继承GenericServlet类
继承HttpServlet类

3、Servlet的生命周期

Servlet没有main()方法,不能独立运行,它的运行完全由Servlet引擎来控制和调度。所谓生命周期,指的是servlet容器如何创建servlet实例、分配其资源、调用其方法、并销毁其实例的整个过程
在如下两种情况下会进行对象实例化。

阶段一: 实例化(就是创建servlet对象,调用构造器)

第一种情况:
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,才会创建实例。

第二种情况:
容器在启动时,或者新部署了某个应用时,会检查web.xml当中,servlet是否有load-on-starup配置。如果有,则会创建该servlet实例(仅仅被创建一次 默认为单例)。load-on-starup参数值越小,优先级越高(最小值为0,优先级最高)。

配置方式如下:

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.shsxt.controller.LoginController</servlet-class>
<!--容器启动时实例化当前servlet -->
<load-on-startup>1</load-on-startup>
</servlet>

阶段二: 初始化
为servlet分配资源,调用init(ServletConfig config);方法config对象可以用来访问servlet的初始化参数,父类方法init存在两个,如果重写父类所有init方法,初始化时仅仅会执行带参init方法 不会执行无参init方法

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.shsxt.controller.LoginController</servlet-class>
<!-- servlet 初始化参数配置 -->
<init-param>
<param-name>encode</param-name>
<param-value>utf-8</param-value>
</init-param>
<!--容器启动时实例化当前servlet -->
<load-on-startup>1</load-on-startup>
</servlet>

带参init方法获取初始化参数值

@Override
publicvoidinit(ServletConfig config)throwsServletException{
System.out.println("编码:"+config.getInitParameter("encode"));
}

阶段三: 就绪/调用(服务)
有请求到达容器,容器调用servlet对象的service()方法,处理请求的方法在整个声明周期中可以被多次调用;HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法。但是,这两个do方法默认情况下,会抛出异常,需要子类去override。
阶段四: 销毁容器依据自身的算法,将不再需要的servlet对象删除掉。
在删除之前,会调用servlet对象的destroy()方法。
destroy()方法用于释放资源。

在servlet的整个生命周期当中,init,destroy只会执行一次,而service方法会执行多次。

@Override
publicvoiddestroy(){
System.out.println("LoginController被销毁...");
}

Servlet的生命周期,简单的概括这就分为四步:servlet类加载-->实例化-->服务-->销毁。下面我们描述一下Tomcat与Servlet是如何工作的,看看下面的时序图.

1、Web Client 向Servlet容器(Tomcat)发出Http请求
2、Servlet容器接收Web Client的请求
3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中
4、Servlet容器创建一个HttpResponse对象
5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数,传给HttpServlet对象
6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息
7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据
8、Servlet容器把HttpServlet的响应结果传给Web Client

更多java web相关技术推荐阅读:

Java Web开发轻松学之Java Web的中文编码问题(二)

Java Web每天学之Java Web的中文编码问题(一)

SpringDI Setter注入

Java Web每天学之Servlet的原理解析的更多相关文章

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

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

  2. Java Web 深入分析(7) Jetty原理解析

    1Jetty的基本架构 Jetty有一个基本的数据模型,这个模式就是handle,所有拷贝拓展的组件都被当做一个handler被添加到server中,然后由jetty统一管理. 1.1Jetty基本架 ...

  3. SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。

    熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...

  4. 【Java】Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  5. 【Java Web开发学习】Servlet、Filter、Listener

    [Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...

  6. Servlet 工作原理解析

    转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...

  7. JavaWeb总结--Servlet 工作原理解析

    从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...

  8. [转]Servlet 工作原理解析

    Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...

  9. Servlet 工作原理解析--转载

    原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...

随机推荐

  1. <转>Go语言TCP Socket编程

    授权转载: Tony Bai 原文连接: https://tonybai.com/2015/11/17/tcp-programming-in-golang/ Golang的主要 设计目标之一就是面向大 ...

  2. 学习日志1 :java 三大框架 了解

    1.spring--------利用它的IOC和AOP来处理控制业务(负责对数据库的操作) https://blog.csdn.net/yu616568/article/details/7073997 ...

  3. jQuery的deferred对象解析

    参考: jQuery的deferred对象详解:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_defe ...

  4. Spark SQL UDAF示例

    UDAF:用户自定义聚合函数 Scala 2.10.7,spark 2.0.0 package UDF_UDAF import java.util import org.apache.spark.Sp ...

  5. Build 2019 彩蛋

    N久没写过博客了… 最近在玩 APEX 但是手残党表示打到15级了,至今杀敌 4 人… 当快递员是越来越顺手了… 今年巨硬的 Build 大会会在 5 月 6-8 号召开 新发布的 Hololens ...

  6. Linux进程和端口互相查看方法

    一.查找应用进程的端口 ps -ef |grep mysql 查看进程 ps:将某个进程显示出来 -A 显示所有程序.  -e 此参数的效果和指定"A"参数相同. -f 显示UID ...

  7. 第二次作业-熟悉git

    GIT地址 https://github.com/gentlemanzq/yunsuanhomework GIT用户名  gentlemanzq 学号后五位  62320 博客地址 https://w ...

  8. 硬核机器学习干货,手把手教你写KNN!

    机器学习相关概念 人工智能.机器学习和深度学习的关系 在探讨算法之前,我们先来谈一谈什么是机器学习.相信大家都听说过AlphaGo:2016年3月,AlphaGo与围棋世界冠军李世石进行围棋人机大战, ...

  9. ios6和ios5横竖屏切换

    记录于2013/8/5   在切换横竖屏的时候调用到的一些委托方法: #pragma mark - UIApplicationDelegate //写在Appdelegate中,在具体的某一视图控制器 ...

  10. [数据结构] 希尔排序 C语言程序

    //由小到大 //希尔排序 void shellSort( long int array[], int length) { int i; int j; int k; int gap; //gap是分组 ...