Servlet生命周期

来源:互联网 发布:剑倚天下进阶数据最新 编辑:程序博客网 时间:2024/06/12 22:46

Servlet的框架是由两个Java包组成:
–javax.servlet包:定义了所有的Servlet类都必须实现或扩展的通用接口和类。
–javax.servlet.http包:定义了采用HTTP协议通信的HttpServlet类。

Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这一接口。在Servlet接口中定义了五个方法,其中有三个方法代表了Servlet的生命周期:
init方法:负责初始化Servlet对象;
service方法:负责响应客户的请求;
destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

如果你的Servlet类扩展了HttpServlet类,你通常不必实现service方法,因为HttpServlet类已经实现了service方法,该方法的声明形式如下:

protected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException;

•在HttpServlet的service方法中,首先从HttpServletRequest对象中获取HTTP请求方式的信息,然后再根据请求方式调用相应的方法。例如:如果请求方式为GET,那么调用doGet方法;如果请求方式为POST,那么调用doPost方法。

 getAttribute 根据参数给定的属性名返回属性值•getContentType 返回客户请求数据MIME类型•getInputStream 返回以二进制方式直接读取客户请求数据的输入流•getParameter 根据给定的参数名返回参数值•getRemoteAddr 返回远程客户主机的IP地址•getRemoteHost 返回远程客户主机名•getRemotePort 返回远程客户主机的端口

Servlet 的生命周期可以分为三个阶段:
–初始化阶段
–响应客户请求阶段
–终止阶段
•在javax.servlet.Servlet接口中定义了三个方法init(), service(), destroy(),它们将分别在Servlet的不同阶段被调用。

在下列时刻Servlet容器装载Servlet:
–Servlet容器启动时自动装载某些Servlet
–在Servlet容器启动后,客户首次向 Servlet 发出请求
–Servlet的类文件被更新后,重新装载Servlet
•Servlet被装载后,Servlet容器创建一个 Servlet 实例并且调用 Servlet 的 init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。

当Web应用被终止,或Servlet容器终止运行,或Servlet容器重新装载Servlet的新实例时,Servlet容器会先调用 Servlet的destroy方法。在destroy方法中,可以释放Servlet所占用的资源。

默认情况下,当Web客户第一次请求访问某个Servlet时,Web容器创建这个Servlet的实例
•如果设置了<servlet>元素的<load-on-startup>子元素,Servlet容器在启动Web应用时,将按照指定的顺序创建并初始化这个Servlet。

*当Servlet容器启动Web应用时,并为每个Web应用创建惟一的ServletContext对象。你可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:
–setAttribute(String name,Object object)把一个对象和一个属性名绑定,将这个对象存储在ServletContext中。
–getAttribute(String name)根据给定的属性名返回所绑定的对象*

**Servlet/JSP技术和ASP、PHP等相比,由于其多线程运行而具有很高的执行效率。
•由于Servlet/JSP默认是以多线程模式执行的,所以,在编写代码时需要非常细致地考虑多线程的同步问题。**

Servlet实现javax.servlet.SingleThreadModel(Servlet2.4中已经废弃该接口),此时Servlet容器将保证Servlet实例以单线程方式运行,也就是说,同一时刻,只会有一个线程执行Servlet的service()方法。
•去除实例变量,使用局部变量,参见HelloServlet
•使用同步代码块:

synchronized{…}
0 0
原创粉丝点击