ITKeyword,专注技术干货聚合推荐

注册 | 登录

Java Web学习(29): Servlet学习(二)

erlian1992 分享于 2016-08-01

推荐:Java Web学习总结(9)——servlet和Jsp生命周期解读

一、servlet的工作工程       Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络

2019阿里云全部产品优惠券(新购或升级都可以使用,强烈推荐)
领取地址https://promotion.aliyun.com/ntms/yunparter/invite.html

Servlet生命周期

先来看看一个Servlet执行的流程图:

再来看看我们所说的HttpServlet的上下文:

一个Servlet的执行过程:

Servlet的生命周期

Servlet生命周期可被定义为从创建直到销毁的整个过程。servlet生命周期阶段包括初始化、加载、实例化、服务 和销毁。

以下是Servlet遵循的过程:

1)初始化阶段:Servlet通过调用init()方法进行初始化。

2)响应客户端请求阶段:Servlet调用service()方法来处理客户端的请求;由service()方法根据提交方式选择执行 doGet()或者doPost()方法。

3)终止阶段:Servlet通过调用destroy()方法终止(结束)。

4)最后,Servlet是由JVM的垃圾回收器进行垃圾回收的。

现在让我们详细讨论Servlet生命周期的方法。

(1)init()方法

init()方法被设计成只调用一次。它在第一次创建Servlet时被调用,在后续每次用户请求时不再调用。因此,它是 用于一次性初始化,就像Applet的init()方法一样。

Servlet创建于用户第一次调用对应于该Servlet的URL时,但是我们也可以指定Servlet在服务器第一次启动时被 加载。

当用户调用一个Servlet时,就会创建一个Servlet实例,每一个用户请求都会产生一个新的线程,适当的时候移交 给doGet()方法或doPost()方法。init()方法简单地创建或加载一些数据,这些数据将被用于Servlet的整个生命周期。

init()方法的定义如下: public void init() throws ServletException {

// 初始化代码... }

(2)service() 方法

service()方法是执行实际任务的主要方法。Servlet容器(即Web服务器)调用service()方法来处理来自客户端(浏览 器)的请求,并把格式化的响应写回给客户端。

每次服务器接收到一个Servlet请求时,服务器会产生一个新的线程并调用服务。service()方法检查HTTP请求类 型(GET、POST、PUT、DELETE等),并在适当的时候调用doGet()、doPost()、doPut(),doDelete()等方法。

下面是该方法的特征: public void service(ServletRequest request,

ServletResponse response)

throws ServletException, IOException{ }

service()方法由容器调用,service()方法在适当的时候调用doGet()、doPost()、doPut()、doDelete()等方法。 所以,不用对service()方法做任何动作,您只需要根据来自客户端的请求类型来重载doGet()方法或doPost()方法即 可。

doGet()方法和doPost()方法是每次服务请求中最常用的方法。下面是这两种方法的特征。

doGet()方法

GET请求来自于一个URL的正常请求,或者来自于一个未指定METHOD的 HTML表单,它由doGet()方法处理。 public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

//Servlet代码 }

doPost()方法

POST请求来自于一个特别指定了METHOD为POST的HTML表单,它由doPost()方法处理。 public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

//Servlet代码 }

destroy()方法

destroy()方法只会被调用一次,在Servlet生命周期结束时被调用。destroy()方法可以让Servlet关闭数据库连 接、停止后台线程、把Cookie列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

在调用destroy()方法之后,servlet对象被标记为垃圾回收。destroy()方法定义如下所示: public void destroy() {

//终止化代码...

}

Servlet架构图

下图显示了一个典型的Servlet生命周期方案:

第一个到达服务器的HTTP请求被委派到Servlet容器。

Servlet容器在调用service()方法之前加 Servlet。

然后Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的Servlet实例的service()方法。

Servlet加载

在下列时刻Servlet容器装载Servlet:

1)Servlet容器启动时自动装载某些Servlet,实现它只需要在web.xml文件中的<Servlet></Servlet>之间添加如 下代码:<loadon-startup>1</loadon-startup>,或者在注解中加上loadOnStartup=1,数字越小表示优先级越 高。

2)在Servlet容器启动后,客户首次向Servlet发送请求。

3)Servlet类被更新后,重新加载Servlet。

Servlet被装载后,Servlet容器创建一个Servlet实例并且调用Servlet的init()方法进行初始化,在Servlet的整个 生命周期内,init()方法只被调用一次。

实例一:演示Servlet的生命周期

ServletOne的代码: package com.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class ServletOne */@WebServlet(name="ServletOne" ,urlPatterns={"/ServletOne"},loadOnStartup=2)public class ServletOne extends HttpServlet {

private static

推荐:javaEE之------Servlet通过web.xml传参数(生命周期)

当用到这个方法的时候,我们必须要知道,Servlet的生命周期 Servlet的生命周期: init方法。 只会被初始化一次。由容器初始化。初始化成功后将缓存与容器中。 它

final long serialVersionUID = 1L;

/**

* @see HttpServlet#HttpServlet()

*/

public ServletOne() {

System.out.println("ServletOne的构造方法被执行");

}

/**

* @see Servlet#init(ServletConfig)

*/

public void init(ServletConfig config) throws ServletException {

System.out.println("ServletOne的初始化方法被执行");

}

/**

* @see Servlet#destroy()

*/

public void destroy() {

System.out.println("ServletOne的销毁方法被执行");

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

System.out.println("ServletOne的doGet()方法被执行");

PrintWriter out = response.getWriter();

out.print("<h1>Hello ServletOne</h1>");

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}}

执行结果:

销毁方法是在服务器关闭后才执行的。

实例二:在上述实例中我们加以修改,实现服务器启动自动装载Servlet

对ServletOne的修改是:

创建一个新的ServletTwo的代码为: package com.servlet;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class ServletTwo */@WebServlet(name="ServletTwo" ,urlPatterns={"/ServletTwo"},loadOnStartup=1)public class ServletTwo extends HttpServlet {

private static final long serialVersionUID = 1L;

/**

* @see HttpServlet#HttpServlet()

*/

public ServletTwo() {

System.out.println("ServletTwo的构造方法被执行");

}

/**

* @see Servlet#init(ServletConfig)

*/

public void init(ServletConfig config) throws ServletException {

System.out.println("ServletTwo的初始化方法被执行");

}

/**

* @see Servlet#destroy()

*/

public void destroy() {

System.out.println("ServletTwo的销毁方法被执行");

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

response.setContentType("text/html;charset=UTF-8");

System.out.println("ServletTwo的doGet()方法被执行");

PrintWriter out = response.getWriter();

out.print("<h1>Hello ServletTwo</h1>");

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}}

执行结果:

对于Servlet类被更新后,会重新加载Servlet,这个我们写的时候无法清晰的表达出来,只要是Servlet有所更新 那么服务器是会重新加载这个Servlet的。

Tomcat容器等级

Tomcat的容器分为四个等级,Servlet的容器管理Context容器,一个Context对应一个Web工程。

servlet容器,负责管理servlet生命周期。web容器,负责管理和部署web应用,其本身可能具备servlet容器组 件;如果没有,一般能将第三方servlet容器作为组件整合进web容器。

Tomcat就是一个Servlet容器,它在整个web应用系统中处于中间层的地位。web容器最典型的就是tomcat 了,Tomcat是web容器也是servlet容器。

推荐:Java开发学习笔记之四:Servlet生命周期

  Servlet运行在Web容器中。Servlet本身不是直接运行在Java虚拟机上,它需要Web容器控制这个载入和运行过程。理解整个过程能够深我们对servlet技术的认识并提高

       Servlet生命周期        先来看看一个Servlet执行的流程图:                再来看看我们所说的HttpServlet的上下文:                一个Servlet的执行过程:                Servlet

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。