博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
统一修改表单参数(表单提交的空字符串统一转null)
阅读量:4954 次
发布时间:2019-06-12

本文共 4339 字,大约阅读时间需要 14 分钟。

统一修改表单参数(表单提交的空字符串统一转null)

1.介绍:

我们业务中有时会遇到提交的表单中某个参数为空字符串,导致后台接受的为空字符串("")而不是我们理想中的null,会增加一些不必要的处理。本文介绍通过过滤器filter统一修改表单参数。

2.实现

由于自带的request.getParameterMap()不可修改。因此我们需要自定义RequestWrapper。该RequestWrapper初始化时传入原request的参数,并对参数进行筛选,删除value为空字符串("")的参数。然后过滤器filter内把原request替换为自定义的RequestWrapper。

2.1 自定义RequestWrapper

import xxxx.common.util.MapRemoveUtils;        import javax.servlet.http.HttpServletRequest;    import javax.servlet.http.HttpServletRequestWrapper;    import java.util.HashMap;    import java.util.Map;        public class ParameterRequestWrapper extends HttpServletRequestWrapper {            private Map
params = new HashMap
(); @SuppressWarnings("unchecked") public ParameterRequestWrapper(HttpServletRequest request) { // 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似 super(request); //将参数表,赋予给当前的Map以便于持有request中的参数 Map
map = new HashMap<>(request.getParameterMap()); //删除空字符串参数 map=MapUtils.filterEmptyParam(map); this.params.putAll(map); } @Override public String getParameter(String name) {//重写getParameter,代表参数从当前类中的map获取 String[] values = params.get(name); if (values == null || values.length == 0) { return null; } return values[0]; } @Override public String[] getParameterValues(String name) {//同上 return params.get(name); } public void addAllParameters(Map
otherParams) {//增加多个参数 for (Map.Entry
entry : otherParams.entrySet()) { addParameter(entry.getKey(), entry.getValue()); } } public void addParameter(String name, Object value) {//增加参数 if (value != null) { if (value instanceof String[]) { params.put(name, (String[]) value); } else if (value instanceof String) { params.put(name, new String[]{(String) value}); } else { params.put(name, new String[]{String.valueOf(value)}); } } } @Override public Map
getParameterMap() { return this.params; } }

2.2 ParameterEmptyFilter

import xxxx.ParameterRequestWrapper;    import org.apache.commons.logging.Log;    import org.apache.commons.logging.LogFactory;    import org.springframework.http.HttpMethod;        import javax.servlet.*;    import javax.servlet.http.HttpServletRequest;    import java.io.IOException;        public class ParameterEmptyFilter implements Filter {                protected final Log logger = LogFactory.getLog(this.getClass());            @Override        public void init(FilterConfig filterConfig) throws ServletException {            }            @Override        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {            String method = ((HttpServletRequest) request).getMethod();            if (HttpMethod.POST.name().equals(method)) {                ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest) request);                filterChain.doFilter(requestWrapper, response);                return;            }            filterChain.doFilter(request, response);        }            @Override        public void destroy() {            }        }

2.3 web.xml 加入filter

parameterEmptyFilter
xxx.filter.ParameterEmptyFilter
parameterEmptyFilter
/xxx/*

2.4 MapUtils

RequestWrapper会用到,用于删除map中空key或空value。

public class MapUtils {                        public static Map
filterEmptyParam(Map
param){ Map
result = new HashMap<>(); param = Maps.filterValues(param, s -> s != null && (!(s instanceof String) || !((String) s).isEmpty())); result.putAll(param); return result; } }

转载于:https://www.cnblogs.com/huanghuizhou/p/9297939.html

你可能感兴趣的文章
关于响应式布局
查看>>
详解ASP.Net 4中的aspnet_regsql.exe
查看>>
python 多进程和多线程的区别
查看>>
hdu1398
查看>>
[android] 网络断开的监听
查看>>
156.Binary Tree Upside Down
查看>>
MongoDB在windows下安装配置
查看>>
Upselling promotion stored procedure
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
程序员如何提高影响力:手把手教你塑造个人品牌
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>
Setting up a Passive FTP Server in Windows Azure VM(ReplyCode: 227, Entering Passive Mode )
查看>>
Atitit mtp ptp rndis midi协议的不同区别
查看>>
Ajax辅助方法
查看>>
Python模块调用
查看>>
委托的调用
查看>>
c#中从string数组转换到int数组
查看>>