Servlet运行原理

一:servlet定义

Servlet是一个Java应用程序,运行在服务器端,用来处理客户端请求并作出响应的程序。

(Servlet对象 在Servlet容器启动时被初始化,当第一次被请求时,Servlet容器将其实例化,此时它贮存于内存中。

如果存在多个请求,Servlet不会再被实例化,仍然由此Servlet将其进行处理,每一个请求都是一个线程,而不是进程,因此,Servlet对请求的处理的性能非常高)

对于Servlet,它被设计为多线程的(如果它是单线程的,你就可以想象,当1000个人同时请求一个网页时,在第一个人获得请求结果之前,其它999个人都在郁闷地等待),

如果为每个用户的每一次请求都创建 一个新的线程对象来运行的话,系统就会在创建线程和销毁线程上耗费很大的开销,大大降低系统的效率。

因此,Servlet多线程机制背后有一个线程池在支持,线程池在初始化初期就创建了一定数量的线程对象,

通过提高对这些对象的利用率,避免高频率地创建对象,从而达到提高程序的效率的目的。

二:简单servlet实例

//导入所需的包

import javax.servlet.http.*;

import javax.servlet.*;

import java.io.*;

public class FirstServlet extends HttpServlet {

//处理请求的方法

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, java.io.IOException {

//数据发送给客户端—>控制台方式输出

//System.out.println(“Hello Servlet”);

//数据发送给客户端—>HTML页面输出

resp.setContentType(“text/html”);

resp.getWriter().print(“<html>”);

resp.getWriter().print(“<head>”);

resp.getWriter().print(“</head>”);

resp.getWriter().print(“<body>”);

resp.getWriter().print(“Hello World”);

resp.getWriter().print(“</body>”);

resp.getWriter().print(“</html>”);

}

}

三:servlet配置到Tomcat中去

Tomcat是一个web容器,也叫web服务器。我们都知道J2EE有十三个标准,这些标准大部分都是接口,Tomcat只是实现了JSP 和 servlet 开发标准。实现了所有的开发标准,就是应用程序服务器,比如Jboss。

编译好的servlet类只能运行在tomcat容器中,客户端浏览器不可以直接访问Servlet,需要在web.xml中配置一下

<servlet>

<servlet-name>FirstServlet</servlet-name>

<servlet-class>FirstServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>FirstServlet</servlet-name>

<url-pattern>/servlet/FirstServlet</url-pattern>

</servlet-mapping>

Tomcat启动成功后,在浏览器中输入:http://localhost:8080/abingtest/servlet/FirstServlet

四:servlet运行原理

当我们在浏览器中输入http://localhost:8080/abingtest/servlet/FirstServlet的时候,Tomcat是如何找到我们的servlet ,运行,并返回我们想看到的页面的呢。

1. WebApplication的标准目录结构:

WEB-INF/classes

/lib

Web.xml

也就是一个完整的web应用程序目录下,必须包含以上的目录结构。

Classes 文件夹下是项目中用到的类文件,均由JDK编译成了.class文件

Lib文件夹是我们项目中引用的jar包

Web.xml是整个web应用程序的配置文档。

了解了这些,我们再来看Tomcat的工作流程。

2. Tomcat解析URL

a) 首先来看URL中包含的信息:”协议” + “端口号” + “路径(项目名称+文件路径)”

Tomcat启动后,监听我们的8080端口,当有Url请求发过来之后,解析出项目名称 abingtest,然后到webapps目录下搜索到该项目文件夹。

b) 项目文件找到后,开始寻找类文件。

这个时候Tomcat去Web.xml文件中寻找<servlet-mapping> 配置节中包含”servlet/FirstServlet”字符串,进而找到该类文件所在的位置。

3. Servelt中的doGet() 和 doPost() 方法

我们写的FirstServlet 继承了HttpServlet ,重写了HttpServlet中的doGet() 方法,HttpServlet中还有一个doPost()方法。这两个方法都是用来处理Http请求的。Servlet会根据我们提交表单的方法(method=post/get)调用service方法来自动选择(我们在下一篇文章中来详细说明一下Service方法是如何自动调用FirstServlet中的doGet()方法的)

4. Servlet如何接收数据

import javax.servlet.http.*;

import javax.servlet.*;

import java.io.*;

public class FirstServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, java.io.IOException {

//获取表单数据

String userName = request.getParameter(“userName”);

}

}

Http协议会将网页中的所有内容包装成为一个request对象传递给servlet ,Servlet通过这个对象拿到表单中的所有数据,处理完成之后,通过Response对象返回给客户端浏览器。

5. Servlet的生命周期

Servlet的生命周期是由Tomcat容器管理的

a) 客户发出请求—>Web 服务器转发到Web容器Tomcat;

b) Tomcat主线程对转发来用户的请求做出响应创建两个对象:HttpServletRequest和HttpServletResponse;

c) 从请求中的URL中找到正确Servlet,Tomcat为其创建或者分配一个线程,同时把2创建的两个对象传递给该线程;

d) Tomcat调用Servlet的servic()方法,根据请求参数的不同调用doGet()或者doPost()方法;

e) 假设是HTTP GET请求,doGet()方法生成静态页面,并组合到响应对象里;
Servlet线程结束,Tomcat将响应对象转换为HTTP响应发回给客户,同时删除请求和响应对象。
从该过程中,我们可以理解Servlet的生命周期:Servlet类加载(对应3步);Servlet实例化(对应3步);调用init方法(对应3步);调用service()方法(对应4、5步);;调用destroy()方法(对应6步)。

五:Servlet生命周期的各个阶段

Servlet运行在Servlet容器中,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。

Servlet的生命周期包含了下面4个阶段:

(1)加载和实例化

Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。

(2)初始化

在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。

(3)请求处理

Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。

(4)服务终止

当容器检测到一个Servlet实例应该从服务中被移除的时候,容器就会调用实例的destroy()方法,以便让该实例可以释放它所使用的资源,保存数据到持久存储设备中。当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()方法。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收。如果再次需要这个Servlet处理请求,Servlet容器会创建一个新的Servlet实例。

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。下面给出Servlet整个生命周期过程的UML序列图

时间: 2024-10-02 20:14:21

Servlet运行原理的相关文章

分析Servlet运行原理

原文链接:http://www.yiidian.com/servlet/servlet-how-work.html 接下来我们有必要了解下Servlet的工作原理,这样才能更好地理解Servlet.本文我们将以之前开发过的Servlet程序来讲解Servlet的内部细节. 1 Servlet基本执行过程 Web容器(如Tomcat)判断当前请求是否第一次请求Servlet程序 . 如果是第一次,则Web容器执行以下任务: 加载Servlet类. 实例化Servlet类. 调用init方法并传入S

第三天:Servlet运行原理

1.  如何不重启tomcat就可以重新加载一个web应用?? 方法:进入tomcat的manager之后点击reload即可. 2.开发一个Servlet,该Servlet可以输出自己的名字并显示当前的日期. A.在tomcat中的webapps下面建立相关目录,web.xml配置文件和output.java类 B.编写output.java文件 C.在web.xml中部署该web应用 D.编译该output.java E.在浏览器中测试 3.Servlet的生命周期(Servlet究竟是怎样

Servlet的生命周期与运行原理

Servlet的生命周期:    1 加载classLoader    2 实例化 new    3 初始化 init(ServletConfig)    4 处理请求 service doGet doPost    5 退出服务 destroy() 整个过程中只有一个对象API中的过程:    init()只执行一次,第一次初始化的时候     public void init(ServletConfig config) throws ServletException    public vo

jsf的运行原理及生命周期

一.jsf的运行原理(工作方式) 1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做FacesServlet的特殊servlet处理该通知,web容器里每一个jsf应用都有它自己的FacesServlet; 在后台,每一个jsf请求都触发了3件事情: 1)FacesServlet创建FacesContext(该对象中包含Web容器传给FacesServlet的service方法的ServletContext,ServletReq

JSP/Servlet 工作原理

JSP/Servlet 工作原理(转载) 2014-03-08 23:20 1829人阅读 评论(0) 收藏 举报 Servlet Servlet 没有 main 方法,不能够独立的运行,它的运行需要容器的支持,Tomcat 是最常用的 JSP/Servlet 容器. Servlet 运行在 Servlet 容器中,并由容器管理从创建到销毁的整个过程. 对于用户到达Servlet的请求,Servlet容器会创建特定于这个请求的ServletRequest对象和 ServletResponse对象

Servlet 工作原理解析

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

Servlet工作原理(转)

Servlet运行在Servlet容器中,由容器负责Servlet实例的查找及创建工作,并按照Servlet规范的规定调用Servlet的一组方法,这些方法也叫生命周期的方法.具体调用过程如下图所示: Servlet生命周期详解 如上图所示,Servlet的生命周期可以分为四个阶段,即装载类及创建实例阶段.初始化阶段.服务阶段和实例销毁阶段.下面针对每个阶段的编程任务及注意事项进行详细的说明. (1)装载类及创建实例 客户端向Web服务器发送一个请求,请求的协议及路径必须遵守如下的格式:    

【Tomcat】Servlet 工作原理解析

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

Servlet工作原理

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