QM.C

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

/**
 * 思路:
 * 第一步:声明一个成员变量是Map。用于设置我们修改后的表单参数
 * 第二部:重写request里面的获得表单参数的四个方法。设置值都是通过我们修改后参数的变量Map来获得值
 * @author ranger
 *
 */
public class NullValueHandlerRequestWrapper extends HttpServletRequestWrapper  {
	
	public NullValueHandlerRequestWrapper(HttpServletRequest request) {
		super(request);

	}

	private Map<String, String[]> parameterMap;

	public void setParameterMap(Map<String, String[]> parameterMap) {
		this.parameterMap = parameterMap;
	}
	


	@Override
	public String getParameter(String name) {
		String[] results = parameterMap.get(name);
		return results[0];
	}

	@Override
	public Map<String, String[]> getParameterMap() {

		return this.parameterMap;
	}

	@Override
	public Enumeration<String> getParameterNames() {
	
		Vector<String> vector = new Vector<String>(parameterMap.keySet());
		return vector.elements();
	}

	@Override
	public String[] getParameterValues(String name) {
	
		return parameterMap.get(name);
	}
	
	

}

  //修改请求表单参数。
  //问题:HTTPServletRequest对象并没有提供修改请求表单参数的方法。如何解决呢?
  //答:Servlet技术里面提供了一个Wrapper来解决表单参数设置的。Warpper实现了重新包装一个对象设置在过滤链里面

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

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.http.HttpServletRequest;

public class NullvalueHandlerFilter implements Filter {

	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
          
		//获得所有字段
		Map<String, String[]> parameterMap = new HashMap<>(request.getParameterMap());
		

		 Set<Entry<String, String[]>> entrySet = parameterMap.entrySet();
		 Iterator<Entry<String, String[]>> iterator = entrySet.iterator();
		while (iterator.hasNext()) {
			 Entry<String, String[]> entry = iterator.next();
			if (entry.getValue()!=null) {
				for(int i=0;i<entry.getValue().length;i++) {
					if ("".equals(entry.getValue()[i])) {
						iterator.remove();
					}
				}
			}
		
			
		}
		//parameterMap就会将空字符串转成null.
		//注意:request对象是无法修改表单数据的!!ServletRequest对象是容Tomcat产生的,我们有没有办法new创建.
		NullValueHandlerRequestWrapper wrapper =new NullValueHandlerRequestWrapper((HttpServletRequest)request);
		wrapper.setParameterMap(parameterMap);
		//获得重写后的请求
		chain.doFilter(wrapper, response);
		
		
	}

	@Override
	public void destroy() {
		
	}

}

  

在web.xml中加入


<filter> <filter-name>nullvalueHandlerFilter</filter-name> <filter-class>org.chu.filter.NullvalueHandlerFilter</filter-class> </filter> <filter-mapping> <filter-name>nullvalueHandlerFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

  

posted on 2019-07-23 17:22  QM.C  阅读(422)  评论(0编辑  收藏  举报