JSP/Servlet 工作原理

JSP/Servlet 工作原理(转载)

2014-03-08 23:20 1829人阅读 评论(0) 收藏 举报

Servlet

Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器。

Servlet 运行在 Servlet 容器中,并由容器管理从创建到销毁的整个过程。

对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和 ServletResponse对象,然后调用Servlet的service方法。service方法从ServletRequest对象获得客户请求 信息,处理该请求,并通过ServletResponse对象向客户返回响应信息。

Servlet 的生命周期

首先引入维基百科的内容:

1、当servlet被部署在应用服务器中(应用服务器中用于管理Java组件的部分被抽象成为容器)以后,由容器控制servlet的生命周期。

2、除非特殊制定,否则在容器启动的时候,servlet是不会被加载的,servlet只会在第一次请求的时候被加载和实例化。

3、servlet一旦被加载,一般不会从容器中删除,直至应用服务器关闭或重新启动。但当容器做内存回收动作时,servlet有可能被删除。也正是因为这个原因,第一次访问servlet所用的时间要大大多于以后访问所用的时间。

1、servlet在服务器中的运行:1.加载 ->2.初始化 - > 3.调用 - 4.销毁

2、生命周期:servlet的生命周期在【2.初始化】后开始其生命周期,在【4.销毁】后结束其生命周期

3、一般情况下,一个servlet实例对应一种请求,此servlet实例可以处理多个用户请求。

-----------------------------

经过google发现,很多人都在争论Servlet是否属于单例模式。给出的这两个网页内容可以看出:

1、Servlet不是单例的.不过一般来说一个servlet只会有一个实例。

2、由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的安全性问题。这里参考博客servlet单实例多线程模式百度百科

Servlet的实例过程一般如下:

当服务器接收一个客户端请求时,需要做一下四件事情。

(1) 加载和实例化

如果Servlet容器还没实例化一个Servlet对象,此时容器装载和实例化一个 Servlet。创建出该 Servlet 类的一个实例。如果已经存在一个Servlet对象,此时不再创建新实例。

(2) 初始化
在产生 Servlet 实例后,容器负责调用该 Servlet 实例的 init() 方法,在处理用户请求之前,来做一些额外的初始化工作。
(3) 处理请求
当 Servlet 容器接收到一个 Servlet 请求时,便运行与之对应的 Servlet 实例的 service() 方法,service() 方法根据用户的请求调用相对应的doGet或doPost
方法来处理用户请求。然后再进入对应的方法中调用逻辑层的方法,实现对客户的响应。
(4) 销毁
当 Servlet 容器决定将一个 Servlet 从服务器中移除时 ( 如 Servlet 文件被更新 ),便调用该 Servlet 实例的 destroy() 方法,在销毁该 Servlet 实例之前,来做一些其他的工作。

其中,(1)(2)(4) 在 Servlet 的整个生命周期中只会被执行一次。

0、如果在web.xml中对servlet配置了load-on-startup,那么就是在容器加载Servlet初始化。

  1. <servlet>
  2. <servlet-name>AAA</servlet-name>
  3. <servlet-class>servlet.AAA</servlet-class>
  4. <load-on-startup>1</load-on-startup>
  5. </servlet>
<servlet>
            <servlet-name>AAA</servlet-name>
            <servlet-class>servlet.AAA</servlet-class>
            <load-on-startup>1</load-on-startup>
</servlet>

1、一般的Servlet启动后只有一个实例(对同一Servlet只配置一个mapping),如果一个Servlet有多个mapping,那么会有多个Servlet实例。

2、在web.xml文件中,某些Servlet只有<serlvet>元素,没有<servlet-mapping>元 素,这样我们无法通过url的方式访问这些Servlet,这种Servlet通常会在<servlet>元素中配置一个<load- on-startup>子元素,让容器在启动的时候自动加载这些Servlet并调用init()方法,完成一些全局性的初始化工作。也就是说,如果要通过某个网址加载某些Servlet时,需要写<servlet-mapping>元素。如果Servlet是在容器加载时运行时,则不需要写<servlet-mapping>元素.

3、当Servlet只有一个实例,当有多个客户端访问时,会多次调用已经实例化好的service方法处理请求。有时容器根据客户机请求生成Servlet对象实例或生成多个Servlet对象实例并将其加入SERVLET实例池中,来处理请求,参考讨论

Servlet 的工作原理

结合右边给出的流程图:

当客户端浏览器向服务器请求一个 Servlet 时,服务器收到该请求后,首先到容器中检索与请求匹配的 Servlet 实例是否已经存在。

--若不存在,则 Servlet 容器负责加载并实例化出该类 Servlet的一个实例对象,接着容器框架负责调用该实例的 init() 方法来对实例做一些初始化工作,然后Servlet 容器运行该实例的 service() 方法。

--若 Servlet 实例已经存在,则容器框架直接调用该实例的 service() 方法。
service() 方法在运行时,自动派遣运行与用户请求相对应的 doXX() 方法来响应用户发起的请求。

通常,每个 Servlet 类在容器中只存在一个实例,每当请求到来时,则分配一条线程来处理该请求。

在处理请求时:

1、Servlet容器会创建一个请求对象ServletRequst,其中封装了用户请求的信息,以便处理客户端请求,此外还会创建一个响应对象ServletResponse,用于响应客户端请求,想客户端返回数据。

2、然后Servlet容器把创建好的ServletRequst和ServletResponse对象传给用户所请求的Servlet。

3、Servlet利用ServletResponse包含的数据和自身的业务逻辑处理请求,并把处理好的结果写在ServletResponse中,最后Servlet容器把响应结果传给用户。

Servlet 的使用

1、自定义Servlet一般需要继承HttpServlet,而HttpServlet是继承GenericServlet,而GenericServlet是继承Servlet。

原因:HttpServlet是特定于HTTP协议的类,Servlet接口和GenericServlet是不特定于任何协议的。Servlet
接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()
方法。GenericServlet是一个通用的,不特定于任何协议的Servlet,它实现了Servlet接口。而HttpServlet继承于
GenericServlet,因此HttpServlet也实现了Servlet接口。所以我们定义Servlet的时候只需要继承
HttpServlet即可。在HttpServlet中实现了service()方法,并将请求
ServletRequest,ServletResponse强转为HttpRequest和HttpResponse。

2、请求的实际处理者是doGet,doPost方法,自定义Servlet类需要重写doGet,doPost方法。

基类HttpServlet中的doGet,doPost方法并没有具体实现,只给出一些异常处理,返回的是错误信息。所以具体的处理代码我们需要自己写。

3、什么操作需要在doGet方法处理,什么操作需要在doPut方法处理?

Get方式的请求:直接在浏览器地址栏输入访问的地址所发送的请求或表单发送时没有指明post形式发送的(表单默认为get提交)都会调用doGet方法。

1)由于get方式请求会将请求参数的名和值转换成字符串,并附在原URl之后,因此可以在地址栏上看见请求参数的名和值,安全性比较差。

2)get请求的数据量比较小。

3)只能传递字符串,不能传递二进制数据

4)服务器随机接受GET方法的数据,一旦断电等原因,服务器也不知道信息是否发送完毕

Post方式的请求:表单以post方式发送。

1)POST方式发送的请求参数以及对应的值放在html header中传输,安全性相对较高。

2)post传递的数据量比较大,通常认为请求参数大小不受限制,但往往取决于服务器端的限制。

3)传递数据的类型没有限制,可以传递二进制数据

4)而且此外,Post方法接受数据时,服务器先接受数据信息的长度,然后再接受数据,使用post方式,服务器可以知道数据是否完整。

对比:图来自HTTP 方法:GET 对比 POST

常用的使用方法:

通常都使用dopost方法,之后再doGet方法调用doPost方法即可

这里给出Stack Overflow中关于Servlets: doGet and doPost的解释,以及其给出的实例代码

图3。。。

JSP 工作原理

结合右边给出的流程图:

当客户端浏览器向服务器请求一个 JSP 页面时,服务器收到该请求后,首先检查所请求的这个JSP
文件内容 ( 代码 ) 是否已经被更新,或者是否是 JSP 文件创建后的第一次被访问:

--如果是,那么,这个 JSP 文件就会在服务器端的
JSP 引擎作用下转化为一个 Servlet 类的 Java 源代码文件。紧接着,这个 Servlet 类会在 Java 编译器的作用下被编译成一个字节码文件,并装载到
jvm 解释执行。剩下的就等同于 Servlet 的处理过程了。

--如果被请求的 JSP 文件内容 ( 代码 ) 没有被修改,那么它的处理过程也等同于一个 Servlet 的处理过程。即直接由服务器检索出与之对应的
Servlet 实例来处理。

需要注意的是,JSP 文件不是在服务器启动的时候转换成 Servlet 类的。而是在被客户端访问的时候才可能发生转换的
( 如 JSP 文件内容没有被更新等,就不再发生 Servlet 转换 )。
就 Tomcat 而言,打开目录 %Tomcat%/work/%您的工程文件目录%,然后会看到里面有 3个子目录:org/apache/jsp,若没有这
3 个目录,说明项目的 JSP 文件还没有被访问过,打开进到 jsp 目录下,会看到一些 *_jsp.java 和 *_jsp.class 文件,这就是 JSP 文件被转换成
Servlet 类的源文件和字节码文件了。
有兴趣的话,可以使用浏览器访问服务器中的 JSP,然后观察 JSP 转换 Servlet 以及编译的时机。

Servlet 与 JSP

JSP 本质是一个 Servlet,它的运行也需要容器的支持。
在 JSP 和 Servlet 文件中都可以编写 Java 和 HTML 代码,不同的是,
Servlet 虽然也可以动态的生成页面内容,但更加偏向于逻辑的控制。
JSP 最终被转换成 Servlet 在 jvm 中解释执行,在 JSP 中虽然也可以编写 Java 代码,但它更加偏向于页面视图的展现。

在 MVC 架构模式中,就 JSP 和 Servlet 而言,C 通常由 Servlet 充当,V 通常由 JSP 来充当。

时间: 2024-10-06 06:25:53

JSP/Servlet 工作原理的相关文章

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

熟悉基于JSP和Servlet的Java Web开发,对Servlet和JSP的工作原理和生命周期有深入了解,熟练的使用JSTL和EL编写无脚本动态页面,有使用监听器.过滤器等Web组件以及MVC架构模式进行Java Web项目开发的经验. 1.说一说Servlet生命周期(非常重要) Servlet生命周期包括三部分: 初始化:Web容器加载servlet,调用init()方法 只执行一次 处理请求:当请求到达时,运行其service()方法.service()自动调用与请求相对应的doXXX

Servlet 工作原理解析

-----转自许令波老师Servlet 工作原理解析  感觉写的很不错,保存下来,留着以后温习 从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力.虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的结果.从技术角度来说是为了解耦,通过标准化接口来相互协作.既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就

J2EE总结(三)——深入理解JSP开发工作原理

一.JSP及其工作原理 1.JSP(JavaServer page)Java服务器页面,从名字上看,它类似于ASP,并且是在服务端编写的一种技术. 2.用于开发动态web页面的技术 为什么它可以用来开发动态web页面呢?这与它在编写时用到的技术有关.它采用HTML来定义页面的结构,但是在jsp中允许编写Java代码,并且允许开发人员在页面中使用request,response,out等对象实现与浏览器的交互,所以jsp也是一种动态web页面开发技术. 举个例子: 输出当前的时间,在html中嵌套

Servlet工作原理

Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,Servlet容器启动时自动装载某些Servlet,实现它只需要在web.XML文件中的<Servlet></Servlet>之间添加如下代码: <loadon-startup>1</loadon-startup&g

【Java】Servlet 工作原理解析

Web 技术成为当今主流的互联网 Web 应用技术之一,而 Servlet 是 Java Web 技术的核心基础.因而掌握 Servlet 的工作原理是成为一名合格的 Java Web 技术开发人员的基本要求.本文将带你认识 Java Web 技术是如何基于 Servlet 工作,你将知道:以 Tomcat 为例了解 Servlet 容器是如何工作的?一个 Web 工程在 Servlet 容器中是如何启动的? Servlet 容器如何解析你在 web.xml 中定义的 Servlet ?用户的请

Servlet工作原理分析

最近在看<Java Web技术内幕>的Servlet工作原理,有点深奥和难以理解,于是乎,想通过一个简单的Demo将书上的思路理一遍,对Servlet有个更透彻更深的了解. Servlet类:HelloWorld.java package com.cqupt; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletReq

JSP(工作原理,组成部分,指令标签,动作标签,隐式对象)

目录 JSP JSP 什么是JSP JSP全名为Java Server Pages 中文名叫java服务器页面 它是在传统的网页HTML文件(.htm,.html)中插入Java程序段和JSP标记 后缀名为(*.jsp). 其根本是一个简化的Servlet设计 为什么要有JSP 直接使用Html文件是没有办法输出Java当中的信息 使用servlet来去输出一个网页非常的麻烦 于是就出现了jsp,又能写html,又能写Java代码 JSP的工作原理 设置JSP创建时的编码 本质就是一个servl

走进JavaWeb技术世界4:Servlet 工作原理详解

本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star哈 文章首发于我的个人博客: www.how2playlife.com 本文是微信公众号[Java技术江湖]的<走进JavaWeb技术世界>其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作

Tomcat中JSP引擎工作原理

http://blog.csdn.net/linjiaxingqqqq/article/details/7164449 JSP运行环境: 执行JSP代码需要在服务器上安装JSP引擎,比较常见的引擎有WebLogic和Tomcat.把这些支持JSP的web服务器配置好后.就可以再客户端通过浏览器来访问JSP页面了.默认端口一般是7001. JSP生命周期: JSP处理请求的方法就是把这些请求都统一看做Servlet.由于这个原因,JSP的很多功能和生命周期,都由Java Servlet技术标准定义