@InitBinder注解绑定表单数据
在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注解绑定表单数据相关推荐
- Spring表单的initBinder:绑定表单复杂属性
今天碰到一个问题,页面表单上是一个id,但在表单控制器的command里是一个javabean,如果将一个String转换成javabean呢?因为已经有了一个服务于hibernate的javabea ...
- gin使用自定义结构绑定表单数据
gin使用自定义结构绑定表单数据 以下示例使用自定义结构 type StructA struct {FieldA string `form:"field_a"` }type Str ...
- java处理表单变量_Java自学之SpringMVC:接收表单数据
学习目的:使用SpringMVC接收表单数据. Part 1 新建一个pojo. package pojo; public class Product { private int id; privat ...
- ElementUI dialog弹框 退出时重置表单数据
需求 进行项目开发,用到了ElementUI的dialog弹出框,当再次点击弹出框时发现,原本数据的还存在 解决 查阅了ElementUI的文档,发现一个好东西 就是这个方法,解决了问题,分享一下用法 ...
- elementUI清空弹框中的表单数据
点击此处直达应用场景示例 官网:https://element.eleme.cn/#/zh-CN/component/form 补充:改变表头颜色: <el-table :data=" ...
- MVC教程第四篇:传递表单数据
MVC教程第四篇:传递表单数据 摘要 本文将完成我们"MVC公告发布系统"的公告发布功能,以此展示在ASP.NET MVC中如何传递处理表单的数据. 前言 通过前几篇文章, ...
- 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...
- python post 表单类数据_python post content-type:multipart/form-data 类型的表单数据
表单数据post默认为application/x-www-form-urlencode,可以为 标签加入属性enctype=multipart/form-data,使得post的数据按multipar ...
- Java后端接收前端post方式传来的表单数据
可以通过HttpServletRequest和@RequestParam注解来获取post提交的表单数据 1.使用HttpServletRequest来获取 @PostMapping(value = ...
最新文章
- C++读取文件名,过滤文件路径及后缀
- 深入理解malloc和free
- 【做题记录】P4211 [LNOI2014]LCA
- ubuntu18的网关ip在哪里配_技术|如何在 Ubuntu 18.04 LTS 中配置 IP 地址
- JAVA简介及环境配置(复习)
- 汉仪南宫体简 字体如何卸载删除?
- mingw不能安装_C语言/C++初学——Visual Studio环境的安装配置与使用
- 在线抢购平台_项目预览
- 实名认证 芝麻认证 人脸识别 集成
- 【音视频—基础】分辨率、码率和帧率
- 常用网站提交入口汇总让互联网收录你的网站
- 数据库04—约束条件
- 程序员转行一般是因为什么,会去哪些行业?
- 每月一书(202202): 《从零开始做自媒体》
- 日语操作系统安装日语软件乱码的解放方案
- 基于matlab的脑瘤mr图像处理_MRI(脑肿瘤)图像处理与分割、颅骨切除
- SecurityConfig+TokenConfig+Oauth2Config--CureGuy
- 【蜂鸟E203的FPGA验证】Chap.8 Vivado综合与性能分析-Vivado性能分析
- Java、JSP地铁线路查询系统
- 计算机网络路由器配置实验,路由器配置实验报告-计算机网络(免费)_IT /计算机_数据...