需求:

  所有的字段要将空字符串转成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() { } }

javaweb修改表单参数---使用过滤器的更多相关文章

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

    统一修改表单参数(表单提交的空字符串统一转null) 1.介绍: 我们业务中有时会遇到提交的表单中某个参数为空字符串,导致后台接受的为空字符串("")而不是我们理想中的null,会 ...

  2. JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数

    模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...

  3. struts2(二) 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  4. struts2(三)之表单参数自动封装与参数类型自动转换

    前言 对struts2的使用不外乎这几点,参数自动封装,拦截器的使用,数据校验,ognl表达(值栈和actionContext的讲解),struts2的标签,struts2的国际化, struts2的 ...

  5. Golang里实现Http服务器并解析header参数和表单参数

    在http服务里,header参数和表单参数是经常使用到的,本文主要是练习在Go语言里,如何解析Http请求的header里的参数和表单参数,具体代码如下: package server import ...

  6. Struts2学习(二)———— 表单参数自动封装和参数类型自动转换

    前篇文章对struts2的一个入门,重点是对struts2的架构图有一个大概的了解即可,之后的几篇文章,就是细化struts2,将struts2中的各种功能进行梳理,其实学完之后,对struts2的使 ...

  7. jquery.form插件中动态修改表单数据

    jquery.form jquery.form插件(http://malsup.com/jquery/form/)是大家经常会用到的一个jQuery插件,它可以很方便将表单转换为ajax的方式进行提交 ...

  8. 基于jQuery会员中心安全修改表单代码

    基于jQuery会员中心安全修改表单代码.这是一款登录密码,交易密码,手机号码,实名认证,电子邮箱,安全设置表单,会员表单等设置代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: ...

  9. Servlet之doPost获取表单参数

    /** * 获取表单参数 */ private void readForm() { // TODO Auto-generated method stub Enumeration e = request ...

随机推荐

  1. Python 抓包程序(pypcap)

    #/usr/bin/env python #-*-coding:utf8-*- #抓包脚本 """ This script is used to Capture and ...

  2. OpenStack虚拟机virtaulinterfance 网络设备在libvirt的代码梳理

    nova创建虚机网卡实际设备的代码调用流程为 _create_domain_and_network---->plug_vifs-->LibvirtGenericVIFDriver.plug ...

  3. ondyari / FaceForensics配置指南

    https://github.com/ondyari/FaceForensics 安装配置方法: $ git clone https://github.com/ondyari/FaceForensic ...

  4. Kafka工作流程

    Kafka生产过程分析 1 写入方式 producer采用推(push)模式将消息发布到broker,每条消息都被追加(append)到分区(patition)中,属于顺序写磁盘(顺序写磁盘效率比随机 ...

  5. “DNAT+云链接+CDN”加速方案,助力出海企业落地生长

    摘要:“DNAT+云链接+CDN”加速方案,真正释放技术红利,真诚助力企业出海. 随着国内互联网行业的人口红利逐渐消失,本土互联网市场竞争不断加剧,加之国家多项“走出去”政策的推动,越来越多的中国互联 ...

  6. 京东T8通过企业实例展示软件架构实际应用,带你迅速成为架构师

    在软件行业,架构师和软件工程师是非常辛苦的职业.一方面新技术层出不穷;另一方面业务需求也层出不穷,让人疲于应付.导致的后果就是常常加班,生活质量低下.只有曾经身在其中的人,才能够体会其中的酸甜苦辣. ...

  7. unity webview

    uniwebview http://uniwebview.onevcat.com/manual Unity3D研究院之在Android中打开WebView(三十) http://www.xuanyus ...

  8. I - 乓 (BFS+邻接表)

    USTC campus network is a huge network. There is a bi-directional link between every pair of computer ...

  9. oracle修改管理员密码

    运行到C盘根目录 2.输入:SET ORACLE_SID = 你的SID名称 3.输入:sqlplus/nolog 4.输入:connect/as sysdba 5.输入:altre user ris ...

  10. JS数组去重的实现

    其实数组去重的实现就分为两大类 利用语法自身键不可重复性 利用循环(递归)和数组方法使用不同的api来处理. 注意️:下列封装成方法的要在函数开始增加类型检测,为了让去重的实现代码更加简单易懂,封装时 ...