Servlet技术
1、Servlet生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
1.1、init() 方法(初始化)
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化,就像 Applet 的 init 方法一样。
Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是您也可以指定 Servlet 在服务器第一次启动时被加载。
当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
init 方法的定义如下:
public void init() throws ServletException {
// 初始化代码...
}
1.2、service() 方法(处理请求)
不管是 get 方式还是 post 方式的请求,如果 Servlet 类中有service 方法,则优先调用 Service 方法。
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。
每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
下面是该方法的特征:
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service() 方法由容器调用,service 方法在适当的时候调用 doGet、doPost、doPut、doDelete 等方法。所以,不用对 service() 方法做任何动作,只需要根据来自客户端的请求类型来重写 doGet() 或 doPost() 即可。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。下面是这两种方法的特征。
1.3、doGet() 方法
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
1.4、doPost() 方法
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
1.5、destroy() 方法(终止)
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。
在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。destroy 方法定义如下所示:
public void destroy() {
// 终止化代码...
}
1.6、生命周期图
2、Servlet特点
特点:可移植性、灵活性和可扩展性、安全性
3、Servlet配置
3.1、创建Servlet
创建一个工程,然后new一个Servlet类。
3.2、Servlet部署描述文件web.xml
在WEB-INF中创建一个web.xml文件,我们称为部署描述文件,在该文件中,把用户访问的URL即/servlet/HitcountServlet映射到Servlet内部名HitcountServlet,把Servlet内部名HitcountServlet映射到Servlet处理类servlet1.java.HitcountServlet。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>RegServlet</servlet-name>
<servlet-class>reg.RegServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegServlet</servlet-name>
<url-pattern>/servlet/RegServlet</url-pattern>
</servlet-mapping>
</web-app>
4、Servlet接口和方法
4.1、HttpServlet类
HttpServlet类提供Servlet接口的http特定实现。
主要方法:
1) protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
服务器通过service方法调用doGet方法处理Get请求。
2)protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
服务器通过service方法调用doPost方法处理Post请求。
3)protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
4)public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException
其中 ServletRequest为 HttpServletRequest父接口,
ServletResponse为HttpServletResponse父接口。
4.2、HttpServletRequest接口
HttpServletRequest接口提供处理客户请求的方法。
4.3HttpServletRequest request对象常用方法:
1)request.getParameter(“param”);
获取客户端请求数据,param为表单元素(如text、password、select等)名称,返回String类型值。
2)request.setCharacterEncoding(“GBK”);
设置对客户端请求进行重新编码的编码。
3)request.setAttribute(“attribute”,value);
在request作用域内存储数据。
4.4、HttpServletResponse接口
通过HttpServletResponse接口对象以Html页面形式把请求结果发给客户。
4.5HttpServletResponse response对象常用方法:
1)response.setContentType(“text/html;charset=GBK”);
设置输出为GBK编码,解决中文乱码问题
2)response.sendRedirect(“URL”);
让浏览器重定向到指定资源。URL可为Servlet,jsp,html文件路径。
4.6、ServletConfig接口
用来存Servlet启动配置值与初始化参数。Servlet接口的getServletConfig()方法来得到关于Servlet配置值信息。
主要方法:
-
String getInitParameter(String name)
-
Enumeration getInitParameterNames()
-
ServletContext getServletContext()
4.7、 ServletContext接口
定义一个Servlet环境对象,通过该对象,Servlet引擎向Servlet提供环境信息。整个Web应用一个 ServletContext,而且Web应用中所有部分都能访问它。每个Servlet一个ServletConfig。
主要方法:
-
Object getAttribute(String name)
-
Enumeration getAttributeNames()
3)void setAttribute(String name, Object object)
4)void removeAttribute(String name)
- String getRealPath(String path)
返回一个与虚拟路径相对应的真实路径。
- RequestDispatcher getRequestDispatcher(String path)
返回一个特定URL的 RequestDispatcher 对象,否则返回一个空值。
- ServletContext getContext(String uripath)
5、Servlet处理请求和响应
在Web站点上注册的每个用户自动地与HttpSession对象关联。Servlet可用此对象来存储关于用户会话的信息。
HttpServletRequest中方法:
HttpSession getSession(boolean create)
检索与用户关联的当前的HttpSession。调用getSession(true),若会话不存在,则创建。
HttpSession接口常用方法见第三章session对象常用方法。
6、过滤器概念及工作原理
过滤器是客户端与目标资源间的中间层组件,用于拦截客户端的请求域响应信息。
可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
- 在客户端的请求访问后端资源之前,拦截这些请求。
- 在服务器的响应发送回客户端之前,处理这些响应。
过滤器适用场景:
- 身份验证过滤器(Authentication Filters)。
- 数据压缩过滤器(Data compression Filters)。
- 加密过滤器(Encryption Filters)。
- 触发资源访问事件过滤器。
- 图像转换过滤器(Image Conversion Filters)。
- 日志记录和审核过滤器(Logging and Auditing Filters)。
- MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)。
- 标记化过滤器(Tokenizing Filters)。
- XSL/T 过滤器(XSL/T Filters),转换 XML 内容。
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
这是菜鸟教程的说明,觉得还是很清楚的。
7、过滤器的使用方法及配置
7.1、Servlet 过滤器方法
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号 | 方法 & 描述 |
---|---|
1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器。 |
2 | public void init(FilterConfig filterConfig) web 应用程序启动时,web 服务器将创建Filter 的实例对象,并调用其init方法,读取web.xml配置,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次)。开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。 |
3 | public void destroy() Servlet容器在销毁过滤器实例前调用该方法,在该方法中释放Servlet过滤器占用的资源。 |
7.2、FilterConfig 使用
Filter 的 init 方法中提供了一个 FilterConfig 对象。
如 web.xml 文件配置如下:
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.runoob.test.LogFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>菜鸟教程</param-value>
</init-param>
</filter>
在 init 方法使用 FilterConfig 对象获取参数:
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String site = config.getInitParameter("Site");
// 输出初始化参数
System.out.println("网站名称: " + site);
}
补充:web.xml配置各节点说明
- 指定一个过滤器。
<filter-name>
用于为过滤器指定一个名字,该元素的内容不能为空。<filter-class>
元素用于指定过滤器的完整的限定类名。<init-param>
元素用于为过滤器指定初始化参数,它的子元素<param-name>
指定参数的名字,<param-value>
指定参数的值。- 在过滤器中,可以使用
FilterConfig
接口对象来访问初始化参数。
- 元素用于设置一个 Filter 所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-name>
子元素用于设置filter的注册名称。该值必须是在<filter>
元素中声明过的过滤器的名字<url-pattern>
设置 filter 所拦截的请求路径(过滤器关联的URL样式)
<servlet-name>
指定过滤器所拦截的Servlet名称。<dispatcher>
指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST
,INCLUDE
,FORWARD
和ERROR
之一,默认REQUEST
。用户可以设置多个<dispatcher>
子元素用来指定 Filter 对资源的多种调用方式进行拦截。- 子元素可以设置的值及其意义
REQUEST
:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE
:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD
:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR
:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
8、监听器的用法
监听器的作用是监听Web容器的有效期事件,由容器管理。利用Listener接口监听在容器中的某个执行程序,并且根据其应用程序的需求做出适当的响应。
8.1Servlet和jsp的8个Listener接口和6个Event类
Listener接口:
ServletContextListener、ServletContextAttributeListener、HttpSessionListener、HttpSessionActivationListener、HttpSessionAttributeListener、HttpSessionBindingListener、ServletRequestListener、ServletRequestAttributeListener
Event类:
ServletContextEvent、ServletContextAttributeEvent、HttpSessionEvent、HttpSessionBindingEvent、ServletRequestEvent、ServletRequestAttributeEvent
Servlet事件分上下文事件、会话事件和请求事件
8.2、上下文事件
Servlet上下文监听可以监听ServletContext对象的创建、删除和添加属性,以及删除和修改操作。
ServletContextListener:
ServletContextAttributeListener:
8.3、HTTP会话监听
用于监听HTTP会话活动情况和HTTP会话中的属性设置情况,也可以监听HTTP会话的active和passivate情况。
HttpSessionListener
HttpSessionActivationListener
HttpSessionAttributeListener
HttpSessionBindingListener
8.4、监听Servlet请求
一旦能够在监听程序中获取客户端的请求,即可统一处理请求。
ServletRequestListener
ServletRequestAttributeListener