一.Filter与Listener
Filter和Listener是Servlet规范中的两个高级特性,不同于Servlet,他们不用于处理客户端请求。Filter是用于对request、response对象进行修改,Listener用于对context、session、request事件进行监听。善用Servlet规范中的这两个高级特性能够轻松地解决一些特殊问题。
二.Filter详解:
Filter被称作为过滤器,其基本功能就是对Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。这好比我们生活中所用到的净水器一样,他可以看做一个过滤器,专门来过滤杂质,Filter在web应用中的拦截过程如下图所示:
我们如上图所示,当浏览器访问服务器中的目标资源中,会被Filter拦截,在Filter中进行预处理,然后再将请求转发给目标资源。当服务器接收到这个请求会对其进行响应,在服务器处理响应的过程中,也需要将响应结果发送给过滤器,在过滤器中对响应结果进行处理后,才会发送给客户端。
2.1实现第一个Filter程序:
为了快速了解Filter的开发过程,接下来,分布实现一个Filter程序,演示Filter程序如何对Servlet程序的调用过程进行拦截,具体如下:
(1)首先创建一个名为chapter09的·web项目,然后再该项目的src目录下创建一个名为cn.itcast.chapter009.filter包,最后在该包下一个名为MyServlet的类Servlet类,该类用于访问时在浏览器输出“dashuju2003”。MyServlet类的具体代码如下
package cn.itcast.chapter009.filter;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().write("dahsuju2003");;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
(2)在web.xml文件对Servlet进行如下配置。
myServlet cn.itcast.chapter009.filter.MyServlett MyServlet /MyServlet
运行结果如下图所示:在Tomact服务器下,在浏览器地址输入“http://localhost:10081/chapter009/MyServlet”,此时就可以看到浏览器成功访问到了MyServlet程序:
(3)在cn.itcast.chapter08.filter包中创建一个MyFilter的Filter类,该类用于拦截MyFilter的Filter类,该类用于拦截MyServlet程序。MyFilter的实现代码如下:
package cn.itcast.chapter009.filter;
import java.io.*;
import javax.servlet.Filter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.*;
import javax.servlet.http.*;
@WebServlet("/MyFilter")
public class MyFilter extends HttpServlet {
private static final long serialVersionUID = 1L;
public MyFilter() {
super();
// TODO Auto-generated constructor stub
}
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
throws IOException, ServletException{
// TODO Auto-generated method stub
PrintWriter out=response.getWriter();
out.write("dashuju2003");
}
public void destroy() {
// TODO Auto-generated method stub
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
/过滤器程序与Servlet程序类似,同样需要在Web.xml文件中进行配置,从而设置它所拦截的资源,具体代码如下://
MyFilter cn.itcast.chapter009.filter.MyFilter MyFilter /MyFilter
3.Filter映射
3.1 拦截不同方式的访问请求
在web.xml文件中,一(个ilter-mapping>元素用于配置一个Fller 所负责拦数的资源。元素中有一个特殊的子元素
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问的,那么该过滤器将不会被调用。
2 ) INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
3 ) FORWARD
如果目标资源是通过RequsDispatcler的foward)方法访问的,那么该过滤器将被调用。除此之外,该过滤器不会被调用。
4) ERROR !
如果目标资源是通过声明式异常处理机制调用的,那么该过滤器将被调用。除此之外,过滤器不会被调用。
为了更好地理解上述4个值的作用,接下来以FORWARD为例,分步骤演示Filter对转发请求的拦截效果。
(1)在chapter009项目的cn.itcast.chapter009.filter包中,创建一个名为ForwardServlet的Servlet类,该类用于将请求发给first.jsp页面,代码如下:
package cn.itcast.chapter009.filter;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class ForwardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("/first.jsp").forward(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
(2)在web.xml文件中,配置ForwardServlet信息,代码如下:
ForwardServlet cn.itcast.chapter009.filter.ForwardServlet ForwardServlet /ForwardServlet
(3)在chapter009项目的WebContent目录中创建一个first.jsp页面,该页面用于输出内容,如下所示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
Insert title here
first.jsp
(4)在cn.itcast.chapter009.filter包中,创建一个过滤器ForwardFilter.java,该过滤器专门用于对first.jsp页面进行拦截代码如下:
package cn.itcast.chapter009.filter;
import java.io.*;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
@WebFilter("/ForwardFilter")
public class ForwardFilter implements Filter {
public void destroy() {
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 用于拦截用户请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
PrintWriter out = response.getWriter();
out.write("dahuju2003");
chain.doFilter(request, response);
}
public void init(FilterConfig fConfig) throws ServletException {
// 过滤器对象在初始化时调用,可以配置一些初始化参数;
}
}
(5)在wen.xml文件中,配置过滤器的映射信息,拦截first.jsp页面,代码如下:
ForwardFilter cn.itcast.chapter009.filter.ForwardFilter ForwardFilter /ForwardFilter
(6)最后启动服务器,在浏览器输入地址“http://localhost:10081/chapter009/ForwardServlet”页面就会访问出来,访问结果为/*first.jsp//
2020080603052



