需求:

  所有的字段要将空字符串转成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. iptables 表与链的对应关系

    1)filter表——三个链:INPUT.FORWARD.OUTPUT作用:过滤数据包 内核模块:iptables_filter. 2)Nat表——三个链:PREROUTING.POSTROUTING ...

  2. 牛客网PAT练兵场-跟奥巴马一起编程

    题目地址: 题意:无 /** * *作者:Ycute *时间:2019-11-14-21.29.07 *题目题意简单描述:模拟题输出 */ #include<iostream> #incl ...

  3. RedHat 6.8 离线安装Docker (rpm包安装)

    我的环境: [root@localhost ~]# uname -r 2.6.32-642.el6.x86_64 [root@localhost ~]# cat /etc/redhat-release ...

  4. SpringBoot中关于Excel的导入和导出

    前言   由于在最近的项目中使用Excel导入和导出较为频繁,以此篇博客作为记录,方便日后查阅.本文前台页面将使用layui,来演示对Excel文件导入和导出的效果.本文代码已上传至我的gitHub, ...

  5. Python全局变量的简单使用

    对Pyhon实现静态变量全局变量的方法详解 python不能像C++一样直接定义一个static变量或者通过extern来导入别的库的变量而实现数据共享,但是python的思想是通过模块化来解决这个问 ...

  6. python os库的使用方法 + 自动化安装第三方库脚本

    一.os库基本介绍 os库提供通用的.基本的操作系统交互功能,包括windows.Mac os.linux os库是python标准库,包含几百个函数 常用路径操作.进程管理.环境参数等几类 路径操作 ...

  7. Idea创建maven加载过慢解决方法

    添加标签:archetypeCataloginternal问题解决!

  8. 【原】“Error getting 'android:label' attribute”

    项目上线过程中遇到“Error getting 'android:label' attribute: attribute is not a string value”这个错误. 备忘下:是因为有act ...

  9. Docker 容器编排利器 Docker Compose

    Compose 简介 通过前面几篇文章的学习,我们可以通过 Dockerfile 文件让用户很方便的定义一个单独的应用容器.然而,在日常工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况,例如 ...

  10. C#操作Excel开发报表系列整理

    C#操作Excel进行报表开发系列共写了八篇,也已经有很久没有新东西了,现在整理一下,方便以后查阅,如果有写新的,会同时更新.需要注意的是因为Office的版本不同,实际的代码可能会有所不同,但是都是 ...