需求:
所有的字段要將空字符串轉成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() { } }