javaweb修改表单参数---使用过滤器

需求:

  所有的字段要将空字符串转成null;

问题:

  我们知道表单如果不写值的时候,传递到后台的不是null,而且是空字符串。那么怎么改成null呢?

解决:

  使用过滤器,将请求的参数修改过后继续,再传递下去。

  Request请求对象是无法修改它本身数据(通过getXXX方法获得的数据)的!!而ServletRequest对象又是Web服务器自动产生的,我们有没有办法通过new创建来创建。但现实中,我们就有需要修改request请求的本身数据的情况,可以通过HttpServletRequestWrapper类可以 重写Request请求的get方法来达到修改Request本身数据的目的。

   实现步骤

第一步:创建一个请求的包装类
package cn.gzsxt.basic.filter;

import java.util.Enumeration;
import java.util.Map;
import java.util.Vector;

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

public class NullValueHandlerRequestWrapper extends HttpServletRequestWrapper {

    private Map<String, String[]> parameterMap;

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


    public NullValueHandlerRequestWrapper(HttpServletRequest request) {
        super(request);
    }


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

    @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 String[] getParameterValues(String name) {
        return this.parameterMap.get(name);
    }

}


第二步:实现过滤器调用包装后的请求
package cn.gzsxt.basic.filter;

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

}
原文地址:https://www.cnblogs.com/vieta/p/11149767.html