Servlet生命周期

 Servlet程序是运行在服务器端的一段java程序,其生命周期将受到Web容器的控制。生命周期包括加载程序、初始化、服务、销毁、卸载5个部分。

 

 

Servlet生命周期对应的方法

public  void  init()  throws  ServletException        Servlet初始化时调用

public  void  init(ServletConfig config)  throws  ServletException         Servlet初始化时调用,可以通过ServletConfig读取配置信息

public  abstract  void  service(ServletRequest  req,ServletResponse  res)  throws  ServletException,IOException         Servlet服务,一般不会直接覆写此方法,而是使用doGet()或doPost()方法

public  void  destroy()      Servlet销毁时调用

 

 

1、加载Servlet

  Web容器负责加载Servlet,当Web容器启动时或者是在第一次使用这个Servlet时,容器会负责创建Servlet实力,但是用户必须通过部署描述(web.xml)指定Servlet的位置(Servlet所在的包.类名称),成功加载后,Web容器会通过反射方式Servlet进行实例化。

2、初始化

 当一个Servlet被实例化后,容器将调用init()方法初始化这个对象,初始化的目的是为了让Servlet对象在处理客户端请求前完成一次初始化的工作,如建立数据库连接、读取资源文件信息等,如果初始化失败,则此Servlet将被直接卸载

3、处理服务

  当有请求提交时,Servlet将调用service()方法(常用的是doGet()或doPost())进行处理。在service()方法中,Servlet可以通过ServletRequest接受客的请求,也可以利用ServletResponse设置响应信息

4、销毁

  当web容器关闭或者检测到一个Servlet要从容器中被删除时,会自动调用destroy()胆大,一边让该实例释放掉所占有的资源。

 

关于销毁有两种情况:

   1.容器关闭

   2.一个Servlet长时间不使用

5、卸载

  当一个Servlet调用完destroy()方法后,此实例将等待被垃圾收集器所回收,如果需要再次使用此Servlet时,会重新调用inint()方法初始化

 

测试代码:

 

LifeCycleServlet.java

package org.ls.servletdemo ;
import java.io.* ;
import javax.servlet.* ;
import javax.servlet.http.* ;
public class LifeCycleServlet extends HttpServlet{
	public void init() throws ServletException{
		System.out.println("** 1、Servlet初始化 --> init()") ;
	}
	public void doGet(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,IOException{
		System.out.println("** 2、Servlet服务 --> doGet()、doPost()") ;
	}
	public void doPost(HttpServletRequest req,HttpServletResponse resp)
              throws ServletException,IOException{
		this.doGet(req,resp) ;
	}
	public void destroy(){
		System.out.println("** 3、Servlet销毁 --> destory()") ;
		try{
			Thread.sleep(3000) ;
		}catch(Exception e){}
	}/*
	public void service(ServletRequest req,
                             ServletResponse res)
                      throws ServletException,
                             IOException{
		System.out.println("************ 服务 **************") ;
	}
	*/
}


web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

  <display-name>Welcome to Tomcat</display-name>
  <description>
     Welcome to Tomcat
  </description>
  <servlet>
		<servlet-name>life</servlet-name>
		<servlet-class>org.ls.LifeCycleServletdemo</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>life</servlet-name>
		<url-pattern>/LifeServlet</url-pattern>
	</servlet-mapping>
	<servlet>
		<servlet-name>hello</servlet-name>
		<servlet-class>org.lxh.servletdemo.HelloServlet</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>input</servlet-name>
		<servlet-class>org.lxh.servletdemo.InputServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>input</servlet-name>
		<url-pattern>/inputservlet/InputServlet</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>hello</servlet-name>
		<url-pattern>/helloServlet</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>hello</servlet-name>
		<url-pattern>/hello.asp</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>hello</servlet-name>
		<url-pattern>/hello.lxh</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>hello</servlet-name>
		<url-pattern>/lxh/*</url-pattern>
	</servlet-mapping>
  <servlet>
	<servlet-name>dbinit</servlet-name>
	<jsp-file>/WEB-INF/init.jsp</jsp-file>
	<init-param>
		<param-name>driver</param-name>
		<param-value>org.gjt.mm.mysql.Driver</param-value>
	</init-param>
	<init-param>
		<param-name>url</param-name>
		<param-value>jdbc:mysql://localhost:3306/mldn</param-value>
	</init-param>
  </servlet>
  <servlet-mapping>
	<servlet-name>dbinit</servlet-name>
	<url-pattern>/config.mldn</url-pattern>
  </servlet-mapping>
    <welcome-file-list>
        <welcome-file>main.htm</welcome-file>
    </welcome-file-list>
	<security-constraint>
		<web-resource-collection>	
			<web-resouce-name>RegisteredUsers	</web-resouce-name>
			<url-pattern>/requestdemo/security.jsp
			</url-pattern>
		</web-resource-collection>	
		<auth-constraint>
			<role-name>mldnuser</role-name>
			<role-name>admin</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
		<auth-method>BASIC</auth-method>
		<realm-name>Registered Users</realm-name>
	</login-config>
	<security-role>
		<role-name>mldnuser</role-name>
	</security-role>
	<security-role>
		<role-name>admin</role-name>
	</security-role>
</web-app>


 

 

 

注意:

    如果LifeCycleServlet类中覆写了service()方法,则对用的doGet()或doPost()方法就不再起作用,而是直接使用service()方法进行处理。是因为在HttpServlet类中已经将service()方法覆写,方法的主要功能就是区分不同的请求类型,如果是get请求则自动调用doGet(),如果是post请求则自动调用doPost(),实际上Servlet程序本身就是Java末班设计模式的应用。

 

 

 

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值