Servlet高级

一、Filter过滤器
1、什么是Filter
Filter被称作过滤器,其基本功能就是对Servlet容器调用Servlet的过程进行拦截,从而在Servlet进行响应处理前后实现一些特殊功能。
在这里插入图片描述
2、实现第一个Filter程序
(1)首先,需要在包下创建一个Servlet类,该类用于访问时在浏览器输出"Hello MyServlet"。

public class MyServlet extends HttpServlet {
	public void doGet(HttpServletRequest request,  
     HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("Hello MyServlet01 ");
	}
	public void doPost(HttpServletRequest request, 
                           HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

(2)在web.xml下对Servlet进行配置

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.itcast.chapter08.filter.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

启动Tomcat服务,运行结果如下:
在这里插入图片描述
(3)创建一个MyFilter类的Filter类,该类用于拦截MyServlet程序。

public class MyFilter implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
	}
	public void doFilter(ServletRequest request,
     ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("Hello MyFilter");
	}
	public void destroy() {
		// 过滤器对象在销毁时自动调用,释放资源
	}
}

配置文件:

<filter>
<filter-name>MyFilter</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>

运行:
在这里插入图片描述
3、Filter映射
(1)使用通配符“*”拦截用户的所有请求
(2)拦截不同方式的访问请求
在一个web.xml文件中,一个元素用于配置一个Filter所负责拦截的资源。
(1)REQUEST
当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

(2)INCLUDE
如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

(3)FORWARD
如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

(4)ERROR
如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。
创建一个ForwardServlet的Servlet类,该类用于将请求转发给first.jsp页面。

public class ForwardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public void doGet(HttpServletRequest request,
           HttpServletResponse response)
			throws ServletException, IOException {
		request.getRequestDispatcher("/first.jsp").forward(request,
       response);
	}
	public void doPost(HttpServletRequest request, 
      HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

然后以上的文件一样,需要为它在web上配置文件。
在目录中创建一个first.jsp页面,该页面用于输出内容。

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<html>
<head></head>
<body>
	first.jsp
</body>
</html>

在创建一个过滤器ForwardFilter.java,该过滤器专门用于first.jsp页面进行拦截。

public class ForwardFilter implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
    }
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("Hello FilterTest");
	}
	public void destroy() {
		// 过滤器对象在销毁时自动调用,释放资源
	}
}

在web.xml文件中,配置过滤器的映射信息,拦截first.jsp页面。
启动服务,运行如下:
在这里插入图片描述
为了拦截ForwardServlet通过forward()方法转发first.jsp页面。

<filter>
<filter-name>ForwardFilter</filter-name>
<filter-class>cn.itcast.chapter08.filter.ForwardFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ForwardFilter</filter-name>
<url-pattern>/first.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

运行:

在这里插入图片描述
4、Filter链
在这里插入图片描述
(1)新建两个过滤器MyFilter02和MyFilter02.

public class MyFilter01 implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("Hello MyFilter01<br />");
		chain.doFilter(request, response);
	}
	public void destroy() {
		// 过滤器对象在销毁时自动调用,释放资源
	}
}
public class MyFilter02 implements Filter {
	public void init(FilterConfig fConfig) throws ServletException {
		// 过滤器对象在初始化时调用,可以配置一些初始化参数
	}
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// 用于拦截用户的请求,如果和当前过滤器的拦截路径匹配,该方法会被调用
		PrintWriter out=response.getWriter();
		out.write("MyFilter02 Before<br />");
		chain.doFilter(request, response);
		out.write("<br />MyFilter02 After<br />");	
	}
	public void destroy() {
		// 过滤器对象在销毁时自动调用,释放资源
	}
}

(2)为了防止其他过滤器影响此处Filter链的演示效果,请先在web.xml文件中注释掉其他过滤器的配置信息。

<filter>
<filter-name>MyFilter01</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter01</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter01</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>
<filter>
<filter-name>MyFilter02</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter02</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter02</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>

运行MyServlet:
在这里插入图片描述
5、FilterConfig接口
FilterConfig 是 Servlet API 提供的一个用于获取 Filter 程序在 web.xml 文件中的配置信息的接口,该接口封装了 Filter 程序在 web.xml 中的所有注册信息,并且提供了一系列获取这些配置信息的方法。
FilterConfig接口中的方法
在这里插入图片描述
(1)创建过滤器MyFilter03,使用该过滤器来获取web.xml中设置的参数

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() {
	}
}

(2)在web中配置过滤器的信息。

<filter>
<filter-name>MyFilter03</filter-name>
<filter-class>cn.itcast.chapter08.filter.MyFilter03</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFilter03</filter-name>
<url-pattern>/MyServlet</url-pattern>
</filter-mapping>

启动服务,运行。
在这里插入图片描述
从而可以看出,使用Filter获取到了配置文件中的初始化参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值