需求:

  所有的字段要将空字符串转成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. 0基础算法基础学算法 第八弹 递归进阶,dfs第一讲

    最近很有一段时间没有更新了,主要是因为我要去参加一个重要的考试----小升初!作为一个武汉的兢兢业业的小学生当然要去试一试我们那里最好的几个学校的考试了,总之因为很多的原因放了好久的鸽子,不过从今天开 ...

  2. Vue的数据响应式

    getter和setter怎么用 示例代码 getter ,关键词为 get ,用于获取一个值.定义时为函数,但是使用时不用加括号. setter 用于对数据的改写 Object.defineProp ...

  3. Kubernetes K8S之资源控制器RC、RS、Deployment详解

    Kubernetes的资源控制器ReplicationController(RC).ReplicaSet(RS).Deployment(Deploy)详解与示例 主机配置规划 服务器名称(hostna ...

  4. ominigraffle实践之画精美流程图+自动导出Xcode工程类图

    背景 在平常阅读各种文章时,注意到有的文章中流程图做得特别漂亮.特别羡慕.于是去搜索了下,发现mac平台好评很高的是一款名为ominigraffle的软件.这款软件不仅可以画图,还可以导出Xcode工 ...

  5. 【Flutter 实战】动画序列、共享动画、路由动画

    老孟导读:此篇文章是 Flutter 动画系列文章第四篇,本文介绍动画序列.共享动画.路由动画. 动画序列 Flutter中组合动画使用Interval,Interval继承自Curve,用法如下: ...

  6. py_二分查找

    ''' 查找:在一些数据元素中,通过一定的方法找出与关键字相同元素的过程, 列表查找:从列表中查找指定元素 输入:列表.待查找元素 输出:元素下标(未找到元素时一般返回None或-1) 内置列表查找函 ...

  7. JS - 有趣的面试题

    for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 1000); } //这个例子执行完输出什么结果 ...

  8. AD18使用原理图优先选项( Preference)调整原理图纸张大小失效问题解决

    1.创建新的原理图纸后,在当前点击更改并不会生效 2.想要生效需要去原理图纸的文档详细属性中更新即可生效!以下两种方式可以打开文档选项按钮. a.O->D 打开文档选项 b.右下角选择Prope ...

  9. Python开发的入门教程(六)-函数

    介绍 本文主要介绍Python中函数的基本知识和使用 Python之什么是函数 我们知道圆的面积计算公式为: S = πr² 当我们知道半径r的值时,就可以根据公式计算出面积.假设我们需要计算3个不同 ...

  10. JDBC的架构设计

    本文探讨JDBC需要解决的问题及如何解决和设计的,包括: JDBC要解决的问题 数据库事务 JDBC的架构设计 JDBC代码注意点 Spring是如何处理事务 什么是事务的传播特性 Redis事务与数 ...