servlet生命周期(笔记)

Servlet运行在Servlet容器中中运行的组件,其生命周期由容器来管理。Servlet的生命周期通过javax.servlet.Servlet接口中的init()、service()和destroy()方法来表示。Servlet的生命周期可以分为加载、实例化、初始化、处理客户请求和卸载五个阶段,体现在方法上主要是init()、service()和destroy()三个方法。生命周期的具体说明如下:

(1)加载和实例化

Servlet容器负责加载和实例化Servlet。当Servlet容器启动时,或者在容器检测到需要这个Servlet来响应第一个请求时,创建Servlet实例。当Servlet容器启动后,它必须要知道所需的Servlet类在什么位置,Servlet容器可以从本地文件系统、远程文件系统或者其他的网络服务中通过类加载器加载Servlet类,成功加载后,容器创建Servlet的实例。因为容器是通过Java的反射API来创建Servlet实例,调用的是Servlet的默认构造方法(即不带参数的构造方法),所以我们在编写Servlet类的时候,不应该提供带参数的构造方法。

(2)初始化

在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象。初始化的目的是为了让Servlet对象在处理客户端请求前完成一些初始化的工作,如建立数据库的连接,获取配置信息等。对于每一个Servlet实例,init()方法只被调用一次。在初始化期间,Servlet实例可以使用容器为它准备的ServletConfig对象从Web应用程序的配置信息(在web.xml中配置)中获取初始化的参数信息。在初始化期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常来通知容器。ServletException异常用于指明一般的初始化失败,例如没有找到初始化参数;而UnavailableException异常用于通知容器该Servlet实例不可用。例如,数据库服务器没有启动,数据库连接无法建立,Servlet就可以抛出UnavailableException异常向容器指出它暂时或永久不可用。

(3)请求处理

Servlet容器调用Servlet的service()方法对请求进行处理。要注意的是,在service()方法调用之前,init()方法必须成功执行。在service()方法中,Servlet实例通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse对象的方法设置响应信息。在service()方法执行期间,如果发生错误,Servlet实例可以抛出ServletException异常或者UnavailableException异常。如果UnavailableException异常指示了该实例永久不可用,Servlet容器将调用实例的destroy()方法,释放该实例。此后对该实例的任何请求,都将收到容器发送的HTTP 404(请求的资源不可用)响应。如果UnavailableException异常指示了该实例暂时不可用,那么在暂时不可用的时间段内,对该实例的任何请求,都将收到容器发送的HTTP 503(服务器暂时忙,不能处理请求)响应。

当容器接收到客户端请求时,Servlet引擎将创建一个ServletRequest请求对象和一个ServletResponse响应对象,然后把这两个对象作为参数传递给对应Servlet对象的service方法。

该方法是一个重点实现的方法,ServletRequest对象可以获得客户端发出请求的相关信息,如请求参数等,ServletResponse对象可以使得Servlet建立响应头和状态代码,并可以写入响应内容返回给客户端。

在此说明一点,当Servlet中有doGet()或者doPost()方法时,那么service方法就可以省略,默认为调用这两个方法。

(4)服务终止

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

在整个Servlet的生命周期过程中,创建Servlet实例、调用实例的init()和destroy()方法都只进行一次,当初始化完成后,Servlet容器会将该实例保存在内存中,通过调用它的service()方法,为接收到的请求服务。下面给出Servlet整个生命周期过程的UML序列图,如图2-16所示。

如果需要让Servlet容器在启动时即加载Servlet,可以在web.xml文件中配置<load-on-startup>元素。

ServletContext接口

一个ServletContext对象表示了一个Web应用程序的上下文。Servlet容器在Servlet初始化期间,向其传递ServletConfig对象,可以通过ServletConfig对象的getServletContext()方法来得到ServletContext对象。也可以通过GenericServlet类的getServletContext()方法得到ServletContext对象,不过GenericServlet类的getServletContext()也是调用ServletConfig对象的getServletContext()方法来得到这个对象的。

ServletContext接口定义了下面的这些方法,Servlet容器提供了这个接口的实现。

public java.lang.Object getAttribute(java.lang.String name)public java.util.Enumeration getAttributeNames()public void removeAttribute(java.lang.String name)public void setAttribute(java.lang.String name, java.lang.Object object)
上面4个方法用于读取、移除和设置共享属性,任何一个Servlet都可以设置某个属性,而同一个Web应用程序的另一个Servlet可以读取这个属性,不管这些Servlet是否为同一个客户进行服务。
public ServletContext getContext(java.lang.String uripath)
该方法返回服务器上与指定的URL相对应的ServletContext对象。给出的uripath参数必须以斜杠(/)开始,被解释为相对于服务器文档根的路径。出于安全方面的考虑,如果调用该方法访问一个受限制的ServletContext对象,那么该方法将返回null。
public String getContextPath()
 
该方法是在Servlet 2.5规范中新增的,用于返回Web应用程序的上下文路径。上下文路径总是以斜杠(/)开头,但结束没有斜杠(/)。在默认(根)上下文中,这个方法返回空字符串""。
public java.lang.String getInitParameter(java.lang.String name)public java.util.Enumeration getInitParameterNames()
可以为Servlet上下文定义初始化参数,这些参数被整个Web应用程序所使用。可以在部署描述符(web.xml)中使用<context-param>元素来定义上下文的初始化参数,上面两个方法用于访问这些参数。
public int getMajorVersion()public int getMinorVersion()
 
上面两个方法用于返回Servlet容器支持的Java Servlet API的主版本和次版本号。例如,对于遵从Servlet 2.4版本的容器,getMajorVersion()方法返回2,getMinorVersion()方法返回4。
public java.lang.String getMimeType(java.lang.String file)
该方法返回指定文件的MIME类型,如果类型是未知的,这个方法将返回null。MIME类型的检测是根据Servlet容器的配置,也可以在Web应用程序的部署描述符中指定。
public RequestDispatcher getRequestDispatcher(java.lang.String path)
 
该方法返回一个RequestDispatcher对象,作为指定路径上的资源的封装。可以使用RequestDispatcher对象将一个请求转发(forward)给其他资源进行处理,或者在响应中包含(include)资源。要注意的是,传入的参数path必须以斜杠(/)开始,被解释为相对于当前上下文根(context root)的路径。
 public RequestDispatcher getNamedDispatcher(java.lang.String name)
 
该方法与getRequestDispatcher()方法类似。不同之处在于,该方法接受一个在部署描述符中以<servlet-name>元素给出的Servlet(或JSP页面)的名字作为参数。
public java.lang.String getRealPath(java.lang.String path)
在一个Web应用程序中,资源用相对于上下文路径的路径来引用,这个方法可以返回资源在服务器文件系统上的真实路径(文件的绝对路径)。返回的真实路径的格式应该适合于运行这个Servlet容器的计算机和操作系统(包括正确的路径分隔符)。如果Servlet容器不能够将虚拟路径转换为真实的路径,这个方法将会返回null。
public java.net.URL getResource(java.lang.String path) throws java.net.Malformed URLException
该方法返回被映射到指定路径上的资源的URL。传入的参数path必须以斜杠(/)开始,被解释为相对于当前上下文根(context root)的路径。这个方法允许Servlet容器从任何来源为Servlet生成一个可用的资源。资源可以是在本地或远程文件系统上,在数据库中,或者在WAR文件中。如果没有资源映射到指定的路径上,该方法将返回null。
public java.io.InputStream getResourceAsStream(java.lang.String path)
该方法与getResource()方法类似,不同之处在于,该方法返回资源的输入流对象。另外,使用getResourceAsStream()方法,元信息(如内容长度和内容类型)将丢失,而使用getResource()方法,元信息是可用的。
public java.util.Set getResourcePaths(java.lang.String path)
 
该方法返回资源的路径列表,参数path必须以斜杠(/)开始,指定用于匹配资源的部分路径。例如,一个Web应用程序包含了下列资源:
/welcome.html/catalog/index.html/catalog/products.html/catalog/offers/books.html/catalog/offers/music.html/customer/login.jsp/WEB-INF/web.xml/WEB-INF/classes/com.acme.OrderServlet.class
如果调用getResourcePaths("/"),将返回[/welcome.html, /catalog/, /customer/, /WEB-INF/]。如果调用getResourcePaths("/catalog/"),将返回[/catalog/index.html, /catalog/products.html, /catalog/offers/]。
public java.lang.String getServerInfo()
 
该方法返回运行Servlet的容器的名称和版本。
public java.lang.String getServletContextName()
该方法返回在部署描述符中使用<display-name>元素指定的对应于当前ServletContext的Web应用程序的名称。
public void log(java.lang.String msg)public void log(java.lang.String message, java.lang.Throwable throwable)
 

ServletContext接口提供了上面两个记录日志的方法,第一个方法用于记录一般的日志,第二个方法用于记录指定异常的栈跟踪信息。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wrewrter/archive/2009/09/25/4589213.aspx

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值