文章目录
1.Filter过滤器
①什么是Filter ②Filter映射 ③Filter链 ④FilterConfig接口
2.监听器
1.Filter过滤器
①什么是Filter
Filter被称作过滤器或者拦截器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。这就好比现实中的污水净化设备,它可以~~看做~~看作一个过滤器,专门用于过滤污水杂质。图1描述了Filter在Web应用中的拦截过程,具体如下:
②Filter映射
Filter拦截的资源需要在web.xml文件中进行配置,即Filter映射。Filter的映射方式可分为两种
Filter的元素可以配置过滤器所有拦截的资源,如果想让过滤器拦截所有的请求访问,那么需要使用通配符“*”来实现,具体示例如下:
Filter1
cn.itcast.chapter04.filter.MyFilter
Filter1
/*
2、拦截不同方式的访问请求 在web.xml文件中,一个元素用于配置一个Filter所负责拦截的资源。 元素中有一个特殊的子元素,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,元素的值共有四个,具体如下:● REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器将不会被调用。
● INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
● FORWARD
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
● ERROR
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
为了大家更好地理解上述四个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果,具体如下:
(1)在chapter04工程的cn.itcast.chapter04. filter包中,创建一个ServletTest.java程序,该程序用于将请求转发给first.jsp页面,如例1所示。
例1 ServletTest.java
1 package cn.itcast.chapter04.filter;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class ServletTest extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse
7 response) throws ServletException, IOException {
8 request.getRequestDispatcher("/first.jsp")
9 .forward(request, response);
10 }
11 public void doPost(HttpServletRequest request, HttpServletResponse
12 response) throws ServletException, IOException {
13 doGet(request, response);
14 }
15 }
(2)在chapter04工程的WebContent目录中创建一个first.jsp页面,该页面用于输出内容,如例2所示。
例2 first.jsp
1 <%@ page language=“java” contentType=“text/html; charset=utf-8”
2 pageEncoding=“utf-8”%>
3
4
5
6 first.jsp
7
8
(3)在chapter04工程的cn.itcast.chapter04.filter包中,创建一个FilterTest.java程序,专门用于拦截first.jsp页面
例3 FilterTest.java
package cn.itcast.chapter04.filter;
import java.io.*;
import javax.servlet.*;
public class FilterTest implements Filter {
public void destroy() {
// 过滤器对象在销毁时自动调用,释放资源
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out=response.getWriter();
out.write("Hello FilterTest");
}
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数
}
}
(4)在web.xml文件中,配置Filter过滤器,拦截first.jsp页面,具体代码如下:
FilterTest cn.itcast.chapter04.filter.FilterTest FilterTest /first.jsp
(5)为了拦截ServletTest通过forward()方法转发的first.jsp页面,需要在web.xml文件中的增加一个元素,将该元素的值设置为FORWARD,修改后的FilterTest的映射如下所示:
FilterTest cn.itcast.chapter04.filter.FilterTest FilterTest /first.jsp FORWARD
④FilterCinfig接口
FilterConfig 是 Servlet API 提供的一个用于获取 Filter 程序在 web.xml 文件中的配置信息的接口,该接口封装了 Filter 程序在 web.xml 中的所有注册信息,并且提供了一系列获取这些配置信息的方法
①创建过滤器
package com.mengma.filter;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter03 implements Filter {
private String characterEncoding;
FilterConfig fc;
public void init(FilterConfig fConfig) throws ServletException {
// 获取 FilterConfig 对象
this.fc = fConfig;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// 输出参数信息
characterEncoding = fc.getInitParameter("Encoding");
System.out.println("encoding初始化参数的值为:" + characterEncoding);
chain.doFilter(request, response);
}
public void destroy() {
}
}
②配置过滤器
在 web.xml 文件中配置过滤器信息。为了防止其他过滤器影响 MyFilter03 的拦截效果,需要先将 web.xml 文件中其他过滤器的配置信息注释掉,然后将 MyFilter03 过滤器的映射信息配置在 MyServlet 配置信息的前面,具体代码如下所示:
MyFilter03 com.mengma.filter.MyFilter03 encoding UTF-8 MyFilter03 /MyServlet
2.监听器
Servlet 事件监听器是一个实现了特定接口的 Java 程序,这个程序专门用于监听 Web 应用中 ServletContext、HttpSession 和 ServletRequest 等域对象的创建和销毁过程、监听这些域对象属性的修改以及感知绑定到 HttpSession 域中的某个对象的状态。
Servlet 规范中定义了八种监听器。
HttpSessionActivationListener 的描述中涉及活化和钝化的概念,HttpSession 对象从内存中转移至硬盘的过程称为钝化,HttpSession 对象从持久化状态变为运行状态的过程称为活化。
根据监听事件的不同,可以将表中的监听器分为如下三类。
①用于监听域对象创建和销毁的事件监听器(ServletContextListener 接口、HttpSessionListener 接口、ServletRequestListener 接口)。
②用于监听域对象属性增加和删除的事件监听器(ServletContextAttributeListener 接口、HttpSessionAttributeListener 接口、ServletRequestAttributeListener 接口)。
③用于监听绑定到 HttpSession 域中某个对象状态的事件监听器(HttpSessionBindingListener 接口、HttpSessionActivationListener 接口)。
在 Servlet 规范中,这三类事件监听器都定义了相应的接口,在编写事件监听器程序时只需实现对应的接口即可。在使用监听程序时,Web 服务器会根据监听器所实现的接口,把它注册到被监听的对象上,当触发了某个对象的监听事件时,Web 容器将会调用 Servlet 监听器与之相关的方法对事件进行处理。



