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

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 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容器。

时间: 2024-08-10 21:28:44

Java Web学习(29): Servlet学习(二)的相关文章

Myeclipse 搭建Java Web 项目:Servlet 《二》

上一节,我们使用myeclipse部署了web项目,但那部署的为静态的web项目,下面我们来学习编写动态的web项目,编写动态项目必须要用到的为:servlet. Servlet是由sun公司命名的,Servlet = Server + Applet(Applet表示小应用程序),Servlet是在服务器端运行的小程序. 编写一个现实登陆的Servlet,并部署访问. 1.编写登录的jsp页面,采用post方式提交. 访问此JSP页面: 2.编写LoginServlet 来通过后台校验登录的用户

java web.xml listener servlet 和filter的加载顺序

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter. 最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servle

javaweb学习之Servlet开发(二)

javaweb学习总结(六)--Servlet开发(二) 一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些初始化参数. 例如: 1 <servlet> 2 <servlet-name>ServletConfigDemo1</servlet-name> 3 <servlet-class>gacl.servlet

JavaWeb学习之Servlet(二)----Servlet的生命周期、继承结构、修改Servlet模板

[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4140466.html 联系方式:[email protected] 一.http协议回顾: 在上一篇文章中:JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置,我们通过在浏览器输入url,就能看到在MyEclipse中编写的Servlet资源,效果如下: 上图中,整个过程是这样的:浏览器中输入url后,会通过hosts文件/dns服务

java web (j2ee)学习路线 —— 将青春交给命运

RESON TO DO JAVA WEB:1.JAVA WEB(企业级)  2.Android和iOS过于火爆并且不兼容 一.JAVA WEB开发需要的知识储备 1.      基本的网页设计语言:HTML.JavaScript.CSS 2.      制作动态网站:Java.JSP(servelt) 3.      数据库:MySQL.SQL Server.SQL Lite.Access.Oracle 4.      流行的框架:MVC思想和原理——了解Struts.Spring.Hibern

Java Web:使用Servlet生成网页随机图片验证码

最近在学习Java Web开发,做了一个生成网页随机图片验证码的例子,在此记录. 一.新建Servlet项目: 在MyEclipse中新建Servlet项目,一步步操作就OK,在此不再赘述.建好之后文件目录树如下图: 二.源代码实现: (1)java代码: package com.zdt.identity; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.

Java Web开发之Servlet、JSP基础

有好多年不搞Java Web开发了,这几天正好国庆放假,放松之余也有兴趣回头看看Java Web开发技术的基础. 我们都知道,Servlet是Java Web开发的重要基础,但是由于Servlet开发相对繁琐,代码量庞大而且不易维护,美工无法参与界面设计开发等不足,于是就诞生了jsp.jsp是对servlet开发模型的重要升级.有了jsp,Java Web开发技术才真正被广泛使用. 一.Servlet 在Java Web开发当中,新建一个类继承(派生)自HttpServlet类即可创建一个Ser

Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)

Gradle的官方tutorial介绍了构建Java Web应用的基本方法.不过在使用Servlet做上传的时候会碰到问题.这里分享下如何通过Servlet上传文件,以及如何使用Gradle来构建相应的Java Web工程. 参考原文:How to Build Web Scanning Application with Gradle Servlet文件上传 使用Servlet文件上传,可以参考Oracle的官方文档The fileupload Example Application.这里需要注意

Gradle构建Java Web应用:Servlet依赖与Tomcat插件

Gradle的官方tutorial介绍了构建Java Web应用的基本方法.不过在使用Servlet做上传的时候会碰到问题.这里分享下如何通过Servlet上传文件,以及如何使用Gradle来构建相应的Java Web工程. 参考原文:How to Build Web Scanning Application with Gradle Servlet文件上传 使用Servlet文件上传,可以参考Oracle的官方文档The fileupload Example Application.这里需要注意

Java web 实验五 Servlet过滤器

loginform.html <html> <head> <title>使用过滤器改变请求编码</title> <meta http-equiv="Content-Type" content="text/html;charset=GB2312"> </head> <body> <center> <h2>请输入用户名和口令:</h2> <for