Servlet技术
Servlet的工作过程: Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。这个基本工作过程如下: (1) 客户端发送请求至服务器端。 (2) 服务器上的Web容器装入Servlet,并为Servlet进程创建线程。请注意,Servlet是在出现第一个请求时装入的,在服务器关闭之前不会卸载它。Servlet也可以配置为
Servlet的工作过程:
Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。这个基本工作过程如下:
(1) 客户端发送请求至服务器端。
(2) 服务器上的Web容器装入Servlet,并为Servlet进程创建线程。请注意,Servlet是在出现第一个请求时装入的,在服务器关闭之前不会卸载它。Servlet也可以配置为Web应用程序启动时自动装载。
(3)Web容器将请求信息发送至Servlet。
(4)Servlet生成响应内容并将其返回给Web容器。响应内容动态生成,通常取决于客户端的请求。
(5)Web容器将响应返回给客户端。
(6)服务器关闭或者Servlet空闲时间超过一定限度时,调用destroy()方法退出。
Servlet的生命周期:
在每个Servlet实例的生命中有三种类型事件,这三种事件分别对应于由Servlet引擎所唤醒的三个方法。
(1) init()
当Servlet第一次被装载时,Servlet引擎调用这个Servlet的init()方法,只调用一次。如果某个Servlet需要特殊的初始化需要,那么Servlet编写人员可以重写该方法来执行初始化任务。这是个可选的方法。如果某个Servlet不需要初始化,那么默认情况下将调用它的父类的init方法。系统保证,在init方法完成前,是不会调用Servlet去处理任何请求的。
(2)service()
这是Servlet最重要的方法,是真正处理请求的地方。对于每个请求,Servlet引擎将调用Servlet的service方法,并把Servlet请求对象和Servlet响应对象作为参数传递给它。
(3)destroy()
这是相对于init的可选方法,当Servlet即将被卸载时由Servlet引擎来调用,这个方法用来清除并释放在init方法中分配的资源。
Servlet的生命周期可以分以下几步:
1 装载Servlet,这一项操作一般是动态执行的。然而,Servlet通常会提供一个管理的选项,用于在Servlet启动时强制转载和初始化特定的Servlet。
2 服务器创建一个Servlet实例。
3 服务器调用Servlet的init方法。
4 一个客户端请求到达服务器端。
5 服务器创建一个请求对象。
6 服务器创建一个响应对象。
7 服务器激活Servlet的service()方法,传递请求对象和响应对象作为参数。
8 service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息。
9 service()方法使用响应对象的方法。将响应传回服务器,最终到达客户端。service()方法可以激活其他方法以处理请求。如doGet(),doPost()或者程序员自己开发的其他方法。
10 对于更多的客户端请求,服务器创建新的请求和响应对象,仍然激活此Servlet的service()方法,将这两个对象作为参数传给它,如此重复以上的循环,但无需再次调用init()方法,Servlet一般只初始化一次。
11 当服务器不再需要Servlet时,比如当服务器要关闭时,服务器调用Servlet的destroy()方法。
Servlet的常用API :
Servlet的类和接口可以从以下几个方面进行分类:
(1) Servlet 实现相关:定义了用于实现Servlet相关的类和接口。
(2) Servlet 配置相关:主要包括ServletConfig接口。
(3) Servlet 异常相关:Servlet API 定义了两个异常,他们是ServletException和UnavailableException。
(4) 请求和响应相关: 接收客户端请求,并且作出响应的类和接口。
(5) 会话跟踪:用于跟踪和客户端的会话。
(6) Servlet上下文: 通过这个接口,可以在多个Web应用程序中共享数据。
(7) Servlet协作: 主要是RequestDispatcher接口,用于进行视图派发。
(8) 其他类: Filter , Cookie 和HttpUtils类。
1 Servlet实现相关的类和接口:
- Servlet接口
声明:public interface Servlet
这个接口是Servlet必须直接或者间接实现的接口。它定义了以下方法:
init(ServletConfig config): 用于初始化Servlet。
getServletInfo(): 获取Servlet的信息。
getServletConfig(): 获得Servlet配置相关信息。
service(ServletRequest request , ServletResponse response): 运行应用程序逻辑的入口点,它接受两个参数,ServletRequest表示客户端请求的信息,ServletResponse表示对客户端的响应。
destory(): 销毁Servlet。
- GenericServlet类
声明:public abstract class GenericServlet
GenericServlet提供了对Servlet接口的基本实现。它是一个抽象类,它的service()方法是一个抽象方法,GenericServlet的派生类必须直接或间接实现该方法。
- HttpServlet类
声明:public abstract class HttpServlet extends GenericServlet implements Serializable
HttpServlet 类是针对使用Http协议的Web服务器的Servlet类,HttpServlet类通过执行Servlet接口,能够提供Http协议的功能。
HttpServlet子类必须实现下面方法中的某一个:
doGet(): 支持Http Get请求。
doPost(): 支持Http Post请求。
doPut(): 支持Http Put请求。
doDelete(): 支持Http Delete请求。
init()和distory(): 管理Servlet占用的资源。
getServletInfo(): 获得Servlet自身的信息。
2 Servlet配置相关:
javax.servlet.ServletConfig接口代表了Servlet的配置,Servlet配置包括Servlet的名字,初始化和上下文。
- ServletConfig接口
声明:public interface ServletConfig
这个接口的主要方法有以下几个:
getInitParameter(String name): 返回特定名字的初始化参数。
getInitParameterNames(): 返回所有的初始化参数的名字。
getServletContext(): 返回Servlet上下文对象的引用。
3 Servlet异常相关:
- ServletException类
声明:public class ServletException extends Exception
它包含几个构造方法和一个获取异常原因的方法,这个方法如下:
getRootCause(): 返回造成这个ServletException的原因。
- UnavailableException类
声明:public class UnavailableException extends ServletException
当Servlet或Filter暂时或者永久不能使用时,就会抛出这个异常。
4 请求和响应相关:
和请求响应相关的接口非常多,主要有以下几种。
ServletRequest: 代表了Servlet的请求,它是一个高层的接口,HttpServletRequest是它的子接口。
ServletResponse: 代表了Servlet的响应,它是一个高层的接口,HttpServletResponse是它的子接口。
ServletInputStream: Servlet的输入流。
ServletOutputStream: Servlet的输出流。
ServletRequestWrapper: 它是ServletRequest的实现。
HttpServletRequest:代表了Http请求,继承了ServletRequest。
HttpServletResponse: 代表了Http响应,继承了ServletResponse。
HttpServletRequestWrapper: 它是HttpServletRequest的实现。
HttpServletResponseWrapper: 它是HttpServletResponse的实现。
下面我们着重介绍HttpServletRequest和HttpServletResponse两个接口:
- HttpServletRequest接口
声明:public interface HttpServletRequest extends ServletRequest
这个接口中最常用的方法是获得请求中的参数,这个请求中的参数是客户端表单中的数据,HttpServletRequest接口可以获取客户端正在使用的通信协议,还可以获取产生请求并且接收请求的服务器远程主机名和IP地址等一些这样的信息。
HttpServletRequest接口提供获取数据流的Servlet、ServletInputStream方法,这些数据是客户端引用中使用Http Post 和 Put方法提交的。一个ServletRequest的子类可以让Servlet获得更多的协议特性数据。
JSP中的内建对象request是一个HttpServletRequest实例,我们来看下它的一些重要方法:
getCookies(): 获得客户端发送的Cookie。返回一个数组,该数组包含这个请求中当前的所以Cookie。如果这个请求中没有Cookie,则返回一个空数组。
getSession(): 返回和客户端关联的Session。如果没给客户端分配Session,则返回null。
getSession(Boolean create): 和上一个方法类似,不同的是,如果没有给客户端分配Session,则创建一个新的Session并返回。
getParameter(String name): 获取请求中名为name的参数。如果请求中没有这个参数,则返回null。
getParameterValues(String name): 返回请求中名为name的参数值,这个值往往是checkbox或者select控件提交的,获得的值是一个String数组。
- HttpServletResponse接口
声明:public interface HttpServletResponse extends ServletResponse
它代表了对客户端的Http响应。HttpServletResponse接口给出响应客户端的Servlet方法。它允许Servlet设置内容长度和响应的MIME类型,并且提供输出流ServletOutputStream。
常用的方法有以下几种:
addCookie(Cookie cookie): 在响应中添加一个Cookie。
encodeRUL(String url): 使用URL和一个SessionId重写这个URL。
sendRedirect(String location): 把响应发送给另一个页面或Servlet进行处理。
setContent(String type): 设置响应的MIME类型。
setCharecterEncoding(String charset): 设置响应的字符编码类型。
5 会话跟踪
和会话跟踪相关的类和接口如下。
- HttpSession接口
声明:public interface HttpSession
这个接口被Servlet引擎用来实现Http客户端和Http会话两者之间的连接关系,这种关联可能在多处连接和请求中持续一段给定的时间。Session用来在无状态Http协议下越过多个请求页面来维护状态和识别用户。
一个Session可以通过Cookie或重写URL来维持。
它的常用方法有以下几种:
getCreationTime(): 返回创建Session的时间。
getId(): 返回分配给这个Session的标识符。一个Http Session的标识符是一个由服务器来建立和维持的唯一的字符串。
getLastAccessTime(): 返回客户端最后一次发出与这个Session有关的请求的时间。如果这个Session是新建的,则返回-1
getMaxInactiveInterval(): 返回一个秒数,这个秒数表示客户端不发出请求时,Session被Servlet引擎维持的最长时间。在这个时间以后,Session可能被Servlet引擎终止。如果这个Session不会被终止,则这个方法返回-1.
getValue(String name): 返回一个给定的名字绑定到Session上的对象,如果不存在这样的绑定则返回空值。
getValueNames(): 以一个数组返回绑定到Session上的所有数据的名称。
invalidate(): 这个方法会终止这个Session。所有绑定到这个Session上的数据都会被清除。
inNew(): 返回一个布尔值以判断这个Session是不是新的,如果一个Session已经被服务器创建但是还没有收到相应的客户端的请求,这个Session将会被认为是新的。这意味着,这个客户端还没有加入会话或者被会话公认。
putValue(String name , Object value): 以给定的名字绑定到给定的对象到Session中。已存在的同名绑定会被重置,这时会调用HttpServletBindingListener接口的valueBound方法。
removeValue(String name): 取消给定名字的对象在Session上的绑定。如果未找到给定名字的绑定对象,这个方法什么也不做。
setMaxInactiveInterval(int interval): 设置一个秒数,这个秒数表示客户端在不发出请求时,Session被Servlet引擎维持的最长时间。
6 Servlet上下文
和Servlet上下文相关的接口有:
- ServletContext接口
声明:public interface ServletContext
在服务器上使用Session对象维持与单个客户相关的状态,而当为多个用户的Web应用维持一个状态时,则应该使用Servlet环境(Context)。
ServletContext表示一组Servlet共享的资源。在Servlet API的1.0和2.0的版本中,ServletContext对象仅仅提供了访问有关Servlet环境信息的方法。例如:提供了访问服务器名称,MIME类型映射等方法,可以将信息写入到服务器日志文件的log()方法,大部分实现程序都会为一台主机中的所有的Servlet或每个虚拟机提供一个Servlet环境。
它的常用方法有以下几种:
getAttribute(String name): 获得ServletContext中名称为name的属性。
getContext(String uripath): 返回给定的uripath的应用的Servlet上下文,如ServletContext test=getContext("/test")。
removeAttribute(String name): 删除名称为name的属性。
setAttribute(String name , Object object): 在ServletContext中设置一个值属性,这个属性的名称为name,值为object对象。
7 Servlet协作
Servlet协作主要是RequestDispatcher接口,它可以把一个请求转发到另一个Servlet。
- RequestDispatcher接口
声明:public interface RequestDispatcher
它包含两个方法,如下所示。
forword(ServletRequest request , ServletResponse response): 把请求发送到服务器上的另一个资源,这个资源可以是Servlet 、JSP页面或者HTML文档。
include(ServletRequest request , ServletResponse response): 引用其他Servlet、JSP页面和位于当前输出缓冲区的HTML文档的内容。此被引用的资源可能没有设置任何响应头标。
8 Filter
在Web应用中实施过滤是我们常用的技术。通过过滤,可以对请求进行统一编码、对请求进行认证等。每个Filter可能只承担很少的任务,多个Filter可以相互合作,通过这种协作,可以完成一个复杂的功能。
- Filter接口
声明:public interface Filter
它是Filter必须实现的接口,它包含以下方法。
init(FilterConfig filterConfig) : 这个方法初始化Filter。
doFilter(ServletRequest request , ServletResponse response , FilterChain chain): 一旦请求经由Filter链传递,则Servlet引擎就调用此方法。
destroy(): 释放Filter占用的资源。
- FilterChain接口
声明:public interface FilterChain
它是代码的过滤链,通过这个接口把过滤的任务在不同的Filter之间转换。
它包含下面一个方法。
doFilter(ServletRequest request , ServletResponse response): 通过这个方法激活链中下一个Filter。如果没有下一个Filter,那么调用目标的资源。
- FilterConfig接口
声明:public interface FilterConfig
它代表了Filter的配置,和Servlet一样,Filter也有一些配置信息,比如Filter的名字和初始化参数等。
它包含了以下方法。
getFilterName(): 返回Filter的名字。
getInitParameter(String name): 获取名字为name的初始化参数的值,如果该参数不存在就返回null。
getServletContext(): 返回这个Filter所在的Servlet上下文对象。
getInitParameterNames(): 获得Filter配置中的所有初始化参数的名字。
更多推荐
所有评论(0)