Servlet相关接口和Servlet的生命周期

创建一个Servlet类最直接的方式是实现javax.servlet.Servlet接口,Servlet接口的定义如下,其中定义了5个方法,Servlet的生命周期就是通过这几个方法体现的:

 1 public interface Servlet {
 2     public void init(ServletConfig config) throws ServletException;
 3
 4     public ServletConfig getServletConfig();
 5
 6     public void service(ServletRequest req, ServletResponse res)
 7             throws ServletException, IOException;
 8
 9     public String getServletInfo();
10
11     public void destroy();
12 }

1 . 加载和实例化

首先定义一个DemoServlet实现Servlet接口,覆写接口中的方法,分别打印各自的方法名,在无参构造方法中也打印一句话:

 1 public class DemoServlet implements Servlet {
 2
 3     public DemoServlet() {
 4         System.out.println("constructor…");
 5     }
 6
 7     @Override
 8     public void destroy() {
 9         System.out.println("DemoServlet.destroy()");
10     }
11
12     @Override
13     public ServletConfig getServletConfig() {
14         System.out.println("DemoServlet.getServletConfig()");
15         return null;
16     }
17
18     @Override
19     public String getServletInfo() {
20         System.out.println("DemoServlet.getServletInfo()");
21         return null;
22     }
23
24     @Override
25     public void init(ServletConfig config) throws ServletException {
26         System.out.println("DemoServlet.init()");
27     }
28
29     @Override
30     public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
31         System.out.println("DemoServlet.service()");
32     }
33
34 }

Servlet要被容器所管理,需要在web.xml中进行配置:

1 <servlet>
2     <servlet-name>demo</servlet-name>
3     <servlet-class>servlet.DemoServlet</servlet-classs>
4 </servlet>
5 <servlet-mapping>
6     <servlet-name>demo</servlet-name>
7     <url-pattern>/demo</url-pattern>
8 </servlet-mapping>                                  

启动服务器,通过“http://localhost:8080/${contextpath}/demo”请求该Servlet,控制台打印输出如下:

刷新页面,再次请求该Servlet,控制台打印如下,可以看到,第二次请求只执行了service(ServletRequest req, ServletResponse res)方法:

当服务器接收到请求时,会通过web.xml中的配置寻找匹配的Servlet,找不到则报404错误;找到之后,根据配置的Servlet类的全限定名查找服务器中是否已经存在该Servlet类的实例,若存在则直接使用它来处理本次请求(上面的第二次请求,该Servlet实例已经存在,直接调用该实例的service(ServletRequest req, ServletResponse res)方法。);若不存在,则根据全限定名通过反射创建实例(调用公共无参的构造方法)。从这里可以看出,若没有提供可访问的无参构造方法,会报错:

1 //提供有参构造方法,覆盖了默认的无参构造方法
2 public DemoServlet(String s) {
3     System.out.println("constructor…");
4 }                                           

服务器通过反射调用Class.newInstance()方法创建实例,找不到可访问的无参构造方法,自然会报错。

2 . 初始化

从上面可以看到,在第一次请求,创建Servlet实例的时候,调用了init(ServletConfig config)方法完成初始化。初始化只会在创建实例的时候进行,以后的请求不会再进行初始化,直接调用service()方法处理请求。服务器在进行Servlet初始化的时候,会首先准备一个ServletConfig对象,通过该对象可以从应用程序的配置信息中获取初始化的参数信息;数据库连接的建立等任务通常也是在初始化阶段完成。

ServletConfig接口中定义了4个方法,用来获取初始化参数信息:

 1 public interface ServletConfig {
 2     //获取Servlet的名字,即在web.xml中<servlet-name>demo</servlet-name>节点配置的信息
 3     public String getServletName();
 4
 5     //获取Servlet上下文对象
 6     public ServletContext getServletContext();
 7
 8     //根据参数名获取初始化参数值
 9     public String getInitParameter(String name);
10
11     //获取所有初始化参数名
12     public Enumeration<String> getInitParameterNames();
13 }

初始化参数可以在web.xml中配置:

 1 <servlet>
 2     <servlet-name>demo</servlet-name>
 3     <servlet-class>servlet.DemoServlet</servlet-class>
 4     <init-param>
 5         <param-name>username</param-name>
 6         <param-value>admin</param-value>
 7     </init-param>
 8 </servlet>
 9 <servlet-mapping>
10     <servlet-name>demo</servlet-name>
11     <url-pattern>/demo</url-pattern>
12 </servlet-mapping>                                   

注意:如果在web.xml中配置了<load-on-startup>1</load-on-startup>,该Servlet会在服务器启动的时候就完成实例的创建和初始化,而不是在第一次请求的时候:

1 <servlet>
2     <servlet-name>demo</servlet-name>
3     <servlet-class>servlet.DemoServlet</servlet-class>
4     <load-on-startup>1</load-on-startup>
5 </servlet>
6 <servlet-mapping>
7     <servlet-name>demo</servlet-name>
8     <url-pattern>/demo</url-pattern>
9 </servlet-mapping>                                        

3 . 处理请求

服务器调用service(ServletRequest req, ServletResponse res)方法来处理请求。处理请求之前,init()方法必须成功执行。服务器在调用service(ServletRequest req, ServletResponse res)方法之前,已经准备好了ServletRequest对象和ServletResponse对象,并作为参数传给service(ServletRequest req, ServletResponse res)方法。

ServletRequest接口和ServletResponse接口中定义了用来处理请求和响应的相关方法:

4 . 销毁

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

destroy()方法跟init()方法一样,在Servlet的生命周期中只会被执行一次,但destroy()方法不会总是被执行,如服务器被异常终止时,destroy()方法就不能被执行。

Servlet相关接口和Servlet的生命周期

时间: 2024-10-07 10:19:22

Servlet相关接口和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

Servlet生命周期、工作原理、配置

Servlet生命周期 分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet工作原理 每一个自定义的Servlet都必须实现Servlet的接口,Servlet接口中定义了五个方法,其中比较重要的三个方法涉及到Servlet的生命周期,分别是上文提到的init(),service(),destroy()方法.GenericServlet是一个通用的,不特定于任何协议的Servlet,它实

Servlet 生命周期、工作原理

一. Servlet 生命周期 servlet 加载--->实例化--->服务--->销毁. init():在Servlet的生命周期中,仅执行一次init()方法.它是在服务器装入Servlet时执行的,负责初始化Servlet对象.可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet.无论有多少客户机访问Servlet,都不会重复执行init(). service():它是Servlet的核心,负责响应客户的请求.每当一个客户请求一个HttpServlet

Servlet生命周期与工作原理

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

servlet的生命周期与工作原理、使用!

概念: Servlet是一个java程序运行在服务器上,处理客户端请求并做粗响应的程序!Servlet是和平台无关的服务器组件,它运行在Servlet容器中,Servlet容器 负责servlet和客户端的交互以及调用servlet的doPost.doGet方法,采用“请求”,“响应”的模式! Servlet主要完成一下功能:   1.创建并返回基于客户端的请求的动态页面 2.可嵌入到现有的页面 3.与服务器资源(数据库.java程序)进行通信 Servlet的生命周期:  1.实例,初始化:S

Servlet编程:(2)Servlet的生命周期

如何开发一个Servlet Servlet的映射路径 Servlet缺省路径 Sevlet的生命周期 Servlet的自动加载 有参的init方法和无参的init方法 Servlet的多线程并发问题 ServletConfig对象 ServletContext对象 4.Servlet的生命周期 4.1.引入 Servlet的生命周期涉及3个问题: servlet类对象什么时候创建,什么时候调用什么方法,什么时候销毁. 以前的对象,其生命周期由程序开发者编写决定,例如: Student stu =

Servlet和JSP生命周期概述

详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt374 Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet: 1,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

Servlet和JSP的生命周期

一.Servlet生命周期 Servlet是运行在Servlet容器(有时候也叫Servlet引擎,是web服务器和应用程序服务器的一部分,用于在发送的请求和响应之上提供网络服务,解码基于MIME的请求,格式化基于MIME的响应.常用的tomcat.jboss.weblogic都是Servlet容器)中的,其生命周期是由容器来管理.Servlet的生命周期通过Java.servlet.Servlet接口中的init().service().和destroy()方法表示.Servlet的生命周期有