up:: 过滤器案例-字符集过滤器


一:问题阐述与过滤器参数化简介

过滤器参数化:过滤器中有一些灵活变动的设置项,不用写死在程序中,而是将这些配置信息放在web.xml中的一种过滤器开发方式。

为什么需要过滤器参数化----- 问题引入:过滤器案例-字符集过滤器这篇博客中,CharacterEncodingFilter作为一个字符集过滤器,doFilter()方法中,设置编码方式为UTF-8;


二:过滤器参数化案例:web.xml中配置的方式去实现

效果:


注:

(1) 将过滤器参数写在web.xml配置文件中,当需要修改参数的时候,只需要修改配置文件后,重启程序即可;;;否则,当需要源代码时候,需要重新编译程序,重新上线,这个过程效率低,而且容易出错!

(2) 一般工作中,将需要灵活配置的设置选项放到配置文件中是非常常见的做法。

(3) 过滤器的参数可以有一个也可以有很多个:


三:过滤器参数化案例:使用注解的方式去实现

emm,采用注解形式设置参数,这些注解是写在代码中的,当需要修改参数的时候,还是需要修改源代码,重新编译,重新上传啊。。。。所以,采用注解形式去设置参数,似乎并不符合过滤器参数化的初衷哎

所以,当参数需要经常修改的时候,就选用配置的方式;参数不常修改时候就使用注解的方式,那么又因为项目中不建议两种方式混用,所以可以认为,在一般项目中最好使用配置的方式吧。

采用注解方式实现过滤器参数的时候,这个过滤器的开发形式就需要采用注解形式:

然后,在CharacterEncodingFilter这个过滤器类中,采用注解的形式如下:

● 注解中的@WebFilter()和@WebInitParam()是关键;

 
    package com.imooc.filter;
 
    import java.io.IOException;
 
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.annotation.WebInitParam;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
 
    @WebFilter(filterName = "CharacterEncoding",urlPatterns="/*",
    initParams = {
    		@WebInitParam(name="encodingbiubiu",value="UTF-8"),
    		@WebInitParam(name="p1",value="v1"),
    		@WebInitParam(name="p1",value="v2")
    })
    public class CharacterEncodingFilter implements Filter{
 
    	@Override
    	public void destroy() {
    		// TODO Auto-generated method stub
 
    	}
 
    	/*
    	 * doFilter方法的参数是ServletRequest类型,而不是HttpServletRequest类型,需要强转一下;
    	 * so,为什么doFilter方法的参数为什么不设置成HttpServletRequest类型呐?
    	 */
    	@Override
    	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    			throws IOException, ServletException {
    		// 因为这个过滤器是基于HTTP请求来进行的,所以需要将ServletRequest转成HttpServletRequest
    		HttpServletRequest req = (HttpServletRequest)request;
    		req.setCharacterEncoding(encoding);
    		HttpServletResponse res = (HttpServletResponse)response;
    		res.setContentType("text/html;charset="+encoding);
 
    		chain.doFilter(request, response);
    		System.out.println(encoding);
    	}
 
    	// 设置一个类中的全局私有变量,保存下面获取到的参数值,其用意就是在初始的时候,从配置文件中进行读取;
    	private String encoding;
 
    	/**
    	 * filterConfig是过滤器配置选项,通过这个对象可以提取在web.xml中设置的参数了;
    	 */
    	@Override
    	public void init(FilterConfig filterConfig) throws ServletException {
    		encoding = filterConfig.getInitParameter("encodingbiubiu");
 
    	}
 
    }
 

效果:


注:(1)过滤器参数化并没有多么高深,其本质用意就是把原本写死在程序中的参数,提取到配置文件中;通过这种方式,可以使程序更容易被阅读,更容易被维护。这种方式以前遇到过很多次,也是很常见普遍的一种方式。 这种理念和设计在大型的项目中也是必须的 !!!