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的中文编码问题(一)
Java Web每天学之Servlet的原理解析的更多相关文章
-
Java web每天学之Servlet工作原理详情解析
上篇文章中我们介绍了Servlet的实现方式以及Servlet的生命周期,我们这篇文章就来介绍一下常用对象. 点击回顾:<Java Web每天学之Servlet的工作原理解析>:<J ...
-
Java Web 深入分析(7) Jetty原理解析
1Jetty的基本架构 Jetty有一个基本的数据模型,这个模式就是handle,所有拷贝拓展的组件都被当做一个handler被添加到server中,然后由jetty统一管理. 1.1Jetty基本架 ...
-
SpringMVC内容略多 有用 熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器、过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验。
熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构 ...
-
【Java】Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
-
【Java Web开发学习】Servlet、Filter、Listener
[Java Web开发学习]Servlet 转发:https://www.cnblogs.com/yangchongxing/p/9274739.html 1.Servlet package cn.y ...
-
Servlet 工作原理解析
转自:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/ Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 J ...
-
JavaWeb总结--Servlet 工作原理解析
从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力 ...
-
[转]Servlet 工作原理解析
Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的 ...
-
Servlet 工作原理解析--转载
原文:http://www.ibm.com/developerworks/cn/java/j-lo-servlet/index.html?ca=drs- Web 技术成为当今主流的互联网 Web 应用 ...
随机推荐
-
常用的数据统计Sql 总结
最近刚在搞一个BI的项目,里面需要大量的sql 数据统计相关运用,加深了我又对SQL的理解与使用. 所以,分享几个数据统计时常用的sql 语句总结: 1. 统计各个条件下的数据 select Batc ...
-
JAVA中的数据结构——集合类(线性表:Vector、Stack、LinkedList、set接口;键值对:Hashtable、Map接口<;HashMap类、TreeMap类>;)
Java的集合可以分为两种,第一种是以数组为代表的线性表,基类是Collection:第二种是以Hashtable为代表的键值对. ... 线性表,基类是Collection: 数组类: person ...
-
zepto源码学习-03 $()
在第一篇的时候提到过关于$()的用法,一个接口有很多重载,用法有很多种,总结了下,大概有一以下几种 1.$(selector,context?) 传入一个选择器返回一个zepto对象 2.$(func ...
-
React问答小demo
在学习react初期,看了一些视频和资料,react基础知识差不多学完,跟着网上的一个教程,做了一个小型的问答demo. 需求看图说: 1.点击"添加"按钮,显示问题输入表单,再次 ...
-
利用php函数mkdir递归创建层级目录
项目开发中免不了要在服务器上创建文件夹,比如上传图片时的目录,模板解析时的目录等.这不当前手下的项目就用到了这个,于是总结了几个循环创建层级目录的方法. php默认的mkdir一次只能创建一层目录,而 ...
-
python全栈开发-Day7 字符编码总结
python全栈开发-Day7 字符编码总结 一.字符编码总结 1.什么是字符编码 人类的字符--------->翻译--------->数字 翻译的过程遵循的标准即字符编码(就是一个字符 ...
-
启动docker容器时的Error response from daemon: devmapper: Error mounting: invalid argument. 错误解决
错误出现 在一台物理机重启后,以前创建的容器无法启动了.一启动,则会报出错误. [root@217TN1V ~]# docker start e7e Error response from daemo ...
-
IDEA之HttpServletRequest之报错解决方案
@Controller public class UserController { @RequestMapping("/selectUser") public String sel ...
-
PHP5和PHP7的安装、PHP和apache的整合!
1.PHP5的安装: 下载: wget -c http://cn2.php.net/distributions/php-5.6.36.tar.gz (php5) wget -c http://cn2 ...
-
JS中this的那些事儿
this是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中. 一.this到底指向什么? this既不指向函数自身,也不指向函数的词法作用域,具体指向什么 ...