http://www.cnblogs.com/luotaoyeah/p/3860292.html

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的生命周期的更多相关文章

  1. Servlet基础(工作原理、生命周期)

    (一)Servlet开发与配置 1.1 开发步骤 1)编写java类,继承HttpServlet类 2)重新doGet和doPost方法 3)Servlet程序交给tomcat服务器运行! 配置信息: ...

  2. Delphi 接口使用中,对象生命周期管理,如何释放需要注意的问题

    网上有篇文章<Delphi接口编程的两大陷阱>,里面提到接口的生存期管理的问题.但该文章里面提到的两个问题,其实都是对 Delphi 不理解导致的.   先说该篇文章中提到的第一个问题为什 ...

  3. Vue相关,vue父子组件生命周期执行顺序。

    一.实例代码 父组件: <template> <div id="parent"> <child></child> </div& ...

  4. Servlet运行原理以及生命周期

    一.Servlet生命周期: Servlet加载.实例化.初始化.服务.销毁. 1.初始化init(): 当服务启动时,Servlet被装入tomcat或者其他服务器容器时执行(服务器容器从启动到停止 ...

  5. servlet的生命周期详解

    一.servlet生命周期原理解析 1.Servlet生命周期分为三个阶段: (1)初始化阶段  调用init()方法 (2)响应客户请求阶段 调用service()方法 (3)终止阶段 调用dest ...

  6. Java Servlet详解(体系结构+注解配置+生命周期)

    Java Servlet详解(注解配置+生命周期) 什么是Servlet : (Server applet)? 顾名思义:服务端的小程序 Servlet只是一个接口,定义了Java被浏览器访问到(To ...

  7. Servlet的生命周期及工作原理

    Servlet生命周期分为三个阶段: 1,初始化阶段  调用init()方法 2,响应客户请求阶段 调用service()方法 3,终止阶段 调用destroy()方法 Servlet初始化阶段: 在 ...

  8. servlet生命周期与工作原理

    →   Jsp的本质是Servlet,Servlet是服务器端的小程序,运行在服务器,用于处理及响应客户端的请求. Servlet和JSP的区别: servlet是特殊的Java类,必须继承HttpS ...

  9. Servlet 生命周期、工作原理

    按照单例的编码规则,Servlet本身只是一个Java,结构并不是单例结构. 只是Web容器在维护这些Servlet的时候只给创建一个实例存在JVM中,用户请求服务时,服务器只调用它已经实例化好的Se ...

随机推荐

  1. OAuth 的权限问题与信息隐忧

    核心提示:以 QQ 登陆和微博登陆为代表的“一键登陆”背后不仅仅是登陆这么简单,它还默认获取了你的其他隐私资料和账号的部分使用权限,我们在享受便利的同时一定不要忘记保护好我们的个人信息安全. 去年3Q ...

  2. [POJ1969]Count on Canton

    NOIP1999普及组 Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 9333   Accepted: 5469 Descr ...

  3. window上使用GIT的个人经验(入门级)

    0.安装 使用google上的msysgit http://code.google.com/p/msysgit/downloads/list 尽量用最新版的吧 1.KEY 关于 key,.ssh里面的 ...

  4. bzoj 2754 [SCOI2012]喵星球上的点名(后缀数组)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2754 [题意] 每只喵有名姓,如果被老师点到名或姓的子串都要答道,但每只喵一次点名只答 ...

  5. 整合maven,jetty,jrebel进行debug调试

    整合maven,jetty,jrebel进行调试 maven配置 这个网上有很多,验证mvn是否配置正确: Jrebel配置 解压至目录,不建议目录名有空格 ,破解包下载 参考: http://zer ...

  6. Fibonacci数列小程序

    Fibonacci数列小程序 问题分析:Fibonacci数列特征是前两项数均为1,从第三项起,前两项的和为第三项的数的数值用公式归纳起来为:f1=f2=1.f1=f1+f2.f2=f1+f2. 程序 ...

  7. 使用WIF实现单点登录Part I——Windows Identity Foundation介绍及环境搭建 -摘自网络

    上个月有一个星期的时间都在研究asp.net mvc统一身份验证及单点登录的实现.经过了一番的探索,最终决定使用微软的Windows Identity Foundation.但是这东西用的人貌似不多, ...

  8. mongoDB中的连接池(转载)

    一.mongoDB中的连接池 刚上手MongoDB,在做应用时,受以前使用关系型数据库的影响,会考虑数据库连接池的问题! 关系型数据库中,我们做连接池无非就是事先建立好N个连接(connection) ...

  9. eclipse安装插件checkstyle

    最近听说了一个eclipse神器:checkstyle,可以帮助java开发人员规范代码,对我这种有代码洁癖的人来说,这有着不小的魔力啊,必然要安装试一试啊. 我最喜欢的安装方式是 输入一个安装网址, ...

  10. Webdriver:Unsupported Marionette protocol version 2, required 3

    升级到firefox到47以上版本即可 坑人的Mozilla不能起个我们熟识的名字吗? 先是webdriver.gecko.driver后是Marionette protocol.   1.WebDr ...