在SpringMVC框架的项目中,bean中定义了Date,double等类型,如果没有做任何处理的话,日期以及double都无法绑定。
     比如经常会遇到页面表单中某些数据类型是Date、Integer、Double等的数据要绑定到控制器的实体,或者控制器需要接受这些数据,如果这类数据类型不做处理的话将无法绑定。而springMVC默认不支持这个格式的转换,所以必须要手动配置, 自定义数据类型的绑定才能实现这个功能,比较简单的可以直接应用springMVC的注解@initbinder和spring自带的WebDataBinder类和操作。

一、常用的日期转换有三种方式:

1. POJO类的属性添加@DateTimeFormat(pattern = “yyyy-MM-dd”)注解,可以实现string转换成Date类型。
    @DateTimeFormat(pattern="yyyy-MM-dd")
    private Date birthday;

2.  web层的开发添加 @InitBinder 注解,实现方法public void initBinder(WebDataBinder binder)。
使用@InitBinder来注解解决这些问题,这样SpingMVC在绑定表单之前,都会先注册这些编辑器。一般我们会将这些方法写在BaseController类中,需要进行这类转换的控制器只需继承BaseController即可。

Spring自己提供了大量的编辑器实现类,如CustomDateEditor,CustomBooleanEditor,CustomNumberEditor等,基本够用了。

WebDataBinder是用来绑定请求参数到指定的属性编辑器.由于前台传到controller里的值是String类型的,当往Model里Set这个值的时候,如果set的这个属性是个对象,Spring就会去找到对应的editor进行转换,然后再Set进去。

springMVC配置文件需要配置:<mvc:annotation-driven />

public class BaseController {
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //设置指定日期/时间解析是否宽松解析字符串。
        //默认true:宽松解析字符串,输入“33/12/2011”,用SimpleDateFormat parse()方法,转化为Date(2012,01,02)。
        //false: 严格解析字符串,输入必须是正常格式,不进位转换。
        sdf.setLenient(false);        
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));//允许为空
    }
}
 需要进行这类转换的控制器只需继承BaseController即可

@Controller
public class UserController extends BaseController{
    ...
}
 
3. 在项目中加入一个全局自定义的数据转换器(springmvc自定义数据转换器)
首先自定义一个全局类型转换器类DateConverter:

package cn.jq.sshweb.web;
 
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
 
import org.springframework.core.convert.converter.Converter;
 
public class DateConverter implements Converter<String, Date>{
    @Override
    public Date convert(String source) {
        if(source != null) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            sdf.setLenient(false);
            try {
                return sdf.parse(source);    //将字符串解析成日期类型
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
 
}
注册到配置文件SpringMVC.xml中,即可

<!-- 全局日期转换器注册到驱动 -->
    <mvc:annotation-driven conversion-service="conversionService"/>
 
    <!-- 配置全局自定义的数据转换器,并注入到springmvc容器中-->
<!--     <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> -->
    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
                        <!-- 自定义的数据转换器类 -->
            <set>
                <bean class="cn.jq.sshweb.web.StringConvetUser"></bean>
                <bean class="cn.jq.sshweb.web.DateConverter"></bean>
            </set>
        </property>
    </bean>
小结:

第一种方式是最简单的,但是也要根据实际情况去实现,如果你只有开发web层代码的权限,这第二、三种方式比较适合。

第二种方式比较冗余,因为你要为每一个controller控制器都注册一个日期转换器,所以比较麻烦,也是最不常用的。

第三种方式,自定义一个系统全局日期转换器,配置简单,实现也是比较简单的。

二、我们也可以不用SpringMVC自带的编辑器,可以自定义编辑器editer
首先自定义自己的类型编译器直接继承PropertyEditorSupport:举例处理Date类型, 其他类型处理类似

import java.beans.PropertyEditorSupport;
 
public class MyDoubleEditor extends PropertyEditorSupport {
 
    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (text == null || text.equals("")) {
            text = "0";
        }
        Double db = Double.parseDouble(text)+100;//假设加100
        setValue(db);
    }
 
    @Override
    public String getAsText() {
        return getValue().toString();
    }
}
然后,WebDataBinder是用来绑定请求参数到指定的属性编辑器.

import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
 
import cn.jq.sshweb.web.MyDoubleEditor;
 
public class BaseController {
 
    @InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        //设置指定日期/时间解析是否宽松解析字符串。
        //默认true:宽松解析字符串,输入“33/12/2011”,用SimpleDateFormat parse()方法,转化为Date(2012,01,02)。
        //false: 严格解析字符串,输入必须是正常格式,不进位转换。
        sdf.setLenient(false);        
        binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));//允许为空
        //自定义编译器
        binder.registerCustomEditor(Double.class, new MyDoubleEditor());
    }
}
最后 控制器继承 BaseController 即可。

@InitBinder注解绑定表单数据相关推荐

  1. Spring表单的initBinder:绑定表单复杂属性

    今天碰到一个问题,页面表单上是一个id,但在表单控制器的command里是一个javabean,如果将一个String转换成javabean呢?因为已经有了一个服务于hibernate的javabea ...

  2. gin使用自定义结构绑定表单数据

    gin使用自定义结构绑定表单数据 以下示例使用自定义结构 type StructA struct {FieldA string `form:"field_a"` }type Str ...

  3. java处理表单变量_Java自学之SpringMVC:接收表单数据

    学习目的:使用SpringMVC接收表单数据. Part 1 新建一个pojo. package pojo; public class Product { private int id; privat ...

  4. ElementUI dialog弹框 退出时重置表单数据

    需求 进行项目开发,用到了ElementUI的dialog弹出框,当再次点击弹出框时发现,原本数据的还存在 解决 查阅了ElementUI的文档,发现一个好东西 就是这个方法,解决了问题,分享一下用法 ...

  5. elementUI清空弹框中的表单数据

    点击此处直达应用场景示例 官网:https://element.eleme.cn/#/zh-CN/component/form 补充:改变表头颜色: <el-table :data=" ...

  6. MVC教程第四篇:传递表单数据

    MVC教程第四篇:传递表单数据     摘要 本文将完成我们"MVC公告发布系统"的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言 通过前几篇文章, ...

  7. 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据

    注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...

  8. python post 表单类数据_python post content-type:multipart/form-data 类型的表单数据

    表单数据post默认为application/x-www-form-urlencode,可以为 标签加入属性enctype=multipart/form-data,使得post的数据按multipar ...

  9. Java后端接收前端post方式传来的表单数据

    可以通过HttpServletRequest和@RequestParam注解来获取post提交的表单数据 1.使用HttpServletRequest来获取 @PostMapping(value = ...

最新文章

  1. C++读取文件名,过滤文件路径及后缀
  2. 深入理解malloc和free
  3. 【做题记录】P4211 [LNOI2014]LCA
  4. ubuntu18的网关ip在哪里配_技术|如何在 Ubuntu 18.04 LTS 中配置 IP 地址
  5. JAVA简介及环境配置(复习)
  6. 汉仪南宫体简 字体如何卸载删除?
  7. mingw不能安装_C语言/C++初学——Visual Studio环境的安装配置与使用
  8. 在线抢购平台_项目预览
  9. 实名认证 芝麻认证 人脸识别 集成
  10. 【音视频—基础】分辨率、码率和帧率
  11. 常用网站提交入口汇总让互联网收录你的网站
  12. 数据库04—约束条件
  13. 程序员转行一般是因为什么,会去哪些行业?
  14. 每月一书(202202): 《从零开始做自媒体》
  15. 日语操作系统安装日语软件乱码的解放方案
  16. 基于matlab的脑瘤mr图像处理_MRI(脑肿瘤)图像处理与分割、颅骨切除
  17. SecurityConfig+TokenConfig+Oauth2Config--CureGuy
  18. 【蜂鸟E203的FPGA验证】Chap.8 Vivado综合与性能分析-Vivado性能分析
  19. Java、JSP地铁线路查询系统
  20. 计算机网络路由器配置实验,路由器配置实验报告-计算机网络(免费)_IT /计算机_数据...

热门文章

  1. 狗狗のavi,私のAVL
  2. 【转载】WPF快速入门系列(7)——深入解析WPF模板
  3. 金蝶EAS,数据中心密码翻译,数据库密码获取
  4. cad计算机中怎么用除号,cad如何输入乘除一些符号
  5. Oracle P6软件如何编制三级计划
  6. 实例介绍机械臂运动规划及前沿研究方向
  7. Pr:基本图形(对齐并变换)
  8. 正能量的句子 人生感悟 努力工作
  9. LINQ之Single,SingleOrDefault
  10. java字符串截取--截取倒数第三个指定字符之后的字符串