Servlet生命周期
什么是 Servlet?
Servlet 是一个 Java 编写的程序,此程序是在服务器端运行的,是按照 Servlet 规范 编写的一个 Java 类。
Servlet 是做什么的?
Servlet 是处理客户端的请求并将其发送到客户端。
Servlet API
Servlet 框架的组成
Servlet 框架是由 2 个 Java 包组成:(1)javax.servlet 和(2)javax.servlet.http(1)
javax.servlet
包中定义了所有 Servlet 类都必须实现的接口和类。javax.servlet
包的接口为:ServletConfig
接口 —- 在初始化过程中由 Servlet 容器使用ServletContext
接口 —- 定义 Servlet 用于获取容器信息的方法ServletRequest
接口 —- 向服务器请求信息ServletResponse
接口 —- 响应客户端请求Servlet
接口 —- 定义所有 Servlet 必须实现的方法javax.servlet
包中的类为:ServletInputStream
类 —- 用于从客户端读取二进制数据ServletOutputStream
类 —- 用于将二进制数据发送到客户端GenericServlet
类 —- 抽象类,定义一个通用的,独立于底层协议的 Servlet。
(2)
javax.servlet.http
包中定义了采用 HTTP 通信的 HttpServlet 类。javax.servlet.http
包的接口为:HttpServletRequest
接口 —- 提供 http 请求HttpServletResponse
接口 —- 提供 http 响应HttpSession
接口 —- 用于标识客户端并存储有关客户信息HttpSessionAttributeListener
接口 —-实现这个侦听接口用户获取会话的属性列表的改变的通知javax.servlet.http
包中的类:HttpServlet
类 —- 扩展了 GenericServlet 的抽象类,用于扩展创建Http ServletCookie
类 —- 创建一个 Cookie,用于存储 Servlet 发送给客户端的信息
Servlet 框架的核心
Servlet 框架的核心是:javax.servlet.Servlet
接口,所有的Servlet
都必须实现这一接口。
Http Servlet
HttpServlet
是一个抽象类,用来创建用户自己的 HTTP Servlet
。HttpServlet
类的子类必须至少重写一下方法中的一个:doGet()
和 doPost()
。HttpServlet
类提供 doGet()
方法来处理 GET
请求
1 | public void doGet(HttpServletRequest req,HttpServletResponse res) |
提供 doPost()
方法处理 POST 请求
1 | public void doPost(HttpServletRequest req,HttpServletResponse res) |
其中有 2 个参数:HttpServletRequset
和 HttpServlerResponse
这 2 个类实现了 ServlerRequset
接口和 ServletResponse
接口ServletRequest
接口中封装了客户请求信息<客户请求方式,参数名,参数值等>ServletResponse
接口 为 Servlet 提供了返回相应结果的方法。
Servlet 体系结构
Servlet
–>GenericServlet
–>HttpServlet
–>用户自定义的 Servlet
Servlet 的生命周期
Servlet 的生命周期由 Servlet 容器控制,该容器创建 Servlet 的实例。
Servlet 生命周期就是指创建 Servlet 实例后响应客户请求直至销毁的全过程。
Serlvet 生命周期的三个方法:
init()
–>service()
–>destroy()
生命周期的各个阶段:
实例化:Servlet 容器创建 Servlet 类的实例对象
初始化:Servlet 容器调用 Servlet 的init()
方法
服务:如果请求 Servlet,则容器调用service()
方法
销毁:销毁实例之前调用destroy()
方法
不可用:销毁实例并标记为垃圾处理
Servlet 的生命周期
Servlet 的生命周期由 Servlet 容器控制,该容器创建 Servlet 的实例。Servlet 的生命周期就是指 Servlet 实例在创建之后响应客户请求直到至销毁的全过程。Servlet 实例的创建取决于 Servlet 的首次调用。Servlet 接口定义了 Servlet 生命周期的 3 个方法。
init()
:
创建 Servlet 的实例后对其进行初始化。实现 ServletConfig 接口的对象作为参
数进行传递。init 方法在浏览器请求 servlet 或 web server 启动时加载运行。1
2
3
4
5
6public void init()throws servletexception{
}
public void init(servletconfig conf)throws servletexception{
super.init(conf);//init 方法带 servletconfig 参数时必须有此句代码
//此处写一些初始化操作。如连接数据库等。
}service()
:
响应客户端发出的请求。Service()
方法接受ServletRequest
接口和
ServletRespons
e 接口的对象来处理请求和发送响应。经常的用法是:不用service(
)方法,用dopost
,doget
方法来处理请求。其他的方法还有dotrace()
,dooptions().dohead()
方法,因trace
,options.head
信息已经在dopost
,doget
方法中包括,不必使用,doput()
,dodelete()
方法在web app
不经常使用Service()
方法的语法为:1
public void service(ServletRequest request, ServletResponse response) throws ServletException,IOException
其中,request 是作为参数传递以存储客户端请求的 ServletRequest 接口的对象;
ServletResponse 接口的对象,它包含 Servlet 作出的响应。destroy()
:
如果不需要处理的请求,则释放 Servlet 实例。Destroy()
方法的语法为:
1 | public void destroy(){ |
注意:Servlet 关闭时才销毁。
Servlet 层次结构
在写 Servlet 程序时,一开始必须导入(import) javax.servlet.*
、javax.servlet.http.*
。
其中:
javax.servlet.*
:存放与 Http 协议无关的一般性 servlet 类;javax.servlet.http.*
:除了继承javax.servlet.*
之外,并且还增加了与 HTTP 协议有关的功能。
所有 Servlet
都必需实现 javax.servlet.Servlet
接口(Interface
),但是通常我们都会从javax.sevler.GenericServlet
或 javax.servlet.http.HttpServlet
择一来实现。javax.servlet.*
里的 ServletRequest
和 ServletResponse
接口提供存取一般的请求和响应;javax.servlet.http.*
里的 HttpServletRequest
和 HttpServletResponse
接口,则提供HTTP 请求及响应的存取服务。
声明 servlet
类 MyServlet
1 | public class MyServlet extends httpservlet{} |
javax.servlet
包主要的接口和类:
ServletInputStream
类:用于从客户端读取二进制据数。
ServletInputStream
类是从java.io.InputStream
类扩展而来的抽象类。它只实现
一个readLine()
方法。
1 | Public int readLine(byte b[],int offset,int length) throws IOException |
b 是用于存储读取的数据的字节数组;
offset 指定开始读取字符串的位置;
length 指定要读取的最大字节数
返回实际读到的字节数。到达流的结尾时返回-1.
ServletOutputStream
类:向客户端发送二进制数据。
ServletOutputStream
类是从java.io.OutputStream
类扩展而来的抽象类。主要方法:
1 | public void print(String s) throws IOException |
s 是要发送到客户端的字符串
GenericServlet
类:抽象类,定义一个通用的、独立于底层协议的 Servlet。ServletRequest
接口:定义一个对象,封装客户向 Servlet 的请求信息。
使用ServletRequest
接口创建的对象,用于使客户端请求信息对 Servlet 可用。创建
的对象作为参数传递至Servlet
的Service()
方法。ServletResponse
接口:定义一个对象辅助 Servlet 将请求的响应信息发送给客户端。ServletContex
t 接口:Servlet 上下文。定义 Servlet 使用的方法以获取其容器的信息。ServletConfig
接口:定义了在 Servlet 初始化的过程中由 Servlet 容器传递给 Servlet
的配置信息对象。保存 Servlet 的配置信息。Servlet
接口:定义所有 Servlet 必须实现的方法。
javax.servlet.http
包主要的接口和类:
- HttpServletRequest 接口:扩展 ServletRequest 接口,为 Http Servlet 提供 Http 请求
信息。
getrealpath
,getinputstream
,getcontenttype
,getcontentlengh...
得到服务器的根目录
1 | string path=request.getrealpath("."); |
取得输入流
1 | datainputstream din=new datainputstream(request.getinputstream()); |
HttpServletResponse
接口:扩展ServletResponse
接口,提供 Http 特定的发送响应的功能。常用的方法:
sendredirect
,getwriter
,setcontenttype
,getoutputstream
.
设置文件类型
1 | private static final string content_type="text/html;charset=gb2312"; |
输出 html 文件头部信息:
1 | printwriter out=response.getwriter(); |
HttpSession
接口:用于创建客户端与服务器端之间的会话。1
Public HttpSession getSession()
返回与请求关联的当前会话。如果请求没有与其关联的话,则
getSession()
会创建一个新
会话。1
Public HttpSession getSession(boolean value)
返回与请求关联的当前 session 的对象。
boolean value 为 true 时等同于 Public HttpSession getSession()
boolean value 为 false 时,则返回 null。HttpSessionAttributeListener
接口:实现这个侦听接口用于获取会话的属性列表的改变
的通知。HttpServlet 类:扩展了 GenericServlet 的抽象类,用于扩展创建 Http Servlet。
Cookie 类:创建一个 Cookie,用于存储 Servlet 发送给客户端的信息。
会话跟踪
会话跟踪允许服务器确定访问站点的用户、用户访问站点的次数和用停留站点的时间
段。会话跟踪技术包括隐藏表单域、URL 重写、Cookie、Session。
隐藏表单域:是实现会话跟踪最简单的方式。将字段添加到 HTML 表单中,但并不在
客户端浏览器中显示。URL重写
URL(Uniform Resource Locator,统一资源定位符)是Web上特定页面的地址。URL重写技术在URL结尾添加一些附加数据以标识该会话。
Cookie
Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取信息发送到服务器端
Servlet API为使用Cookie而提供javax.servlet.http.Cookie。
Cookie类常用的方法如下:
(1) setMaxAge():设置Cookie的最大保存时间(以秒表示)
1
public void setMaxAge(int age)
(2) getMaxAge():返回Cookie的最大保存时间
1
public int getMaxAge()
Session
Servlet
通信方法
Servlet
运行一个称为ServletContext
的环境,此环境描述了与Servlet
关联的各种参数,一个Servlet
只属于一个ServletContext
。
Servlet与jsp页面通信
下面是
UserServlet1
中的doGet()
方法中的部分代码:1
2
3
4String uid=request.getParameter("txtuserid");
ServletContext context=this.getServletContext();
context.setAttribute("userid", uid);
RequestDispatcher dispatcher=request.getRequestDispatcher("../x.jsp");x.jsp
部分代码:1
2
3
4<%
ServletContext context=this.getServletContext();
String userid=context.getAttribute("userid").toString();
%>用户
ID:${userid}
Servlet
与Servlet
通信属于同一个应用程序的
Servlet
可以使用javax.servlet.RequestDispatcher
接口的forward
和include
方法来共享数据。forward()
方法将HTTP
请求从一个Servlet
发送到其它Servlet
。该请求包含传递到目标Servlet
的URL
和请求参数。include
方法可以接收Servlet
以包括Servlet
响应中的其他Servlet
响应数据。接收客户端可以接收的对象,并将数据写入到response
对象。(1)
forward
():用于将请求从一个Servlet
转发到同一个服务器上的另一个Servlet
。语法为:1
public void forward(ServletRequest request,ServletResponse response) throws ServletException,IOException
基中,
request
是客户端向Servlet
发出的请求,response
是Servlet
对客户端作出的响应。(
2
)include()
:用于包括另一个Servlet
的内容。语法为:1
public void include(ServletRequest request,ServletResponse response) throws IOException
其中,
request
是包含客户端请求的对象,response
是包含Servlet
响应的对象。下面是
UserServlet1
中的doGet()
方法中的部分代码:1
2
3
4String uid=request.getParameter("txtuserid");
ServletContext context=this.getServletContext();
context.setAttribute("userid", uid);
RequestDispatcher dispatcher=request.getRequestDispatcher("/servlet/UserServlet2");
Servlet
上下文
Servlet
上下文提供对应用程序中所有Servlet
所共有的各种资源和功能的访问。Servlet
上下文API
用于设置应用程序中所有Servlet
共有的信息。
Javax.servlet.ServletContext
接口中用于处理上下文属性的方法如下:
getAttribute()
:返回Servlet
上下文中对应属性名称的对象。若没有则返回null
。1
public Object getAttribute(String name)
其中,
name
是Servlet
的属性名称。setAttribute()
:将对象绑定到Servlet
上下文中提供的属性名称。1
public void setAttribute(String name,Object object);
其中,
name
指定属性名称,object
表示要绑定的对象。