过滤器五:过滤器开发技巧之--过滤器参数化;(基本思想:将原本写死在程序中的参数,写到配置文件中)

本文介绍了过滤器参数化的概念及其实现方式,包括在web.xml中配置和使用注解的方法,并探讨了这两种方式的适用场景。

目录

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

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

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


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

过滤器参数化:过滤器中有一些灵活变动的设置项,不用写死在程序中,而是将这些配置信息放在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)过滤器参数化并没有多么高深,其本质用意就是把原本写死在程序中的参数,提取到配置文件中;通过这种方式,可以使程序更容易被阅读,更容易被维护。这种方式以前遇到过很多次,也是很常见普遍的一种方式。这种理念和设计在大型的项目中也是必须的!!!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值