Spring MVC数据转换
样例:把一个字符串封装而一个对象。
如:username:password格式的数据ZhangSan:1234。我们把这个数据封装成一个User对象。以下分别使用属性编辑器与转换器来实现。
1、自己定义属性编辑器
A、写一个属性编辑器继承PropertyEditorSupport
package cn.framelife.mvc.converter;
import java.beans.PropertyEditorSupport;
import cn.framelife.mvc.entity.User;
public class UserEditor extends PropertyEditorSupport {
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("setAsText");
User user = new User();
if(text != null){
String[] items = text.split(":");
user.setUsername(items[0]);
user.setPassword(items[1]);
}
setValue(user);
}
}
B、Controller范围的编辑器
在Controller中注冊及使用编辑器:
/**
* @InitBinder注解把编辑器绑定到当前Controller中
*/
@InitBinder
public void initBinder(WebDataBinder binder){
//注冊自己定义的编辑器
binder.registerCustomEditor(User.class, new UserEditor());
}
/**
* 第一个參数user是一个模型数据,接收页面的username用password
* 第二个參数converterUser通过@RequestParam注解。把页面的other參数交由UserEditor转成一个User对象
*/
@RequestMapping("create")
public ModelAndView createUser(User user,@RequestParam("other")User converterUser){
System.out.println(user.getUsername()+"--"+user.getPassword());
System.out.println(converterUser.getUsername()+"--"+converterUser.getPassword());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
C、 全局范围的编辑器
实现WebBindingInitializer接口,并在实现类中注冊属性编辑器:
package cn.framelife.mvc.converter;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.support.WebBindingInitializer;
import org.springframework.web.context.request.WebRequest;
import cn.framelife.mvc.entity.User;
public class MyBindingInitializer implements WebBindingInitializer {
public void initBinder(WebDataBinder binder, WebRequest request) {
//注冊自己定义的属性编辑器。这里能够注冊多个属性编辑器
binder.registerCustomEditor(User.class, new UserEditor());
}
}
配置WebBindingInitializer实现类:
<!-- 配置全局范围的属性编辑器 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
<property name="webBindingInitializer">
<bean class="cn.framelife.mvc.converter.MyBindingInitializer"></bean>
</property>
</bean>
使用属性编辑器:
和Controller范围内的使用一样
/**
* 第一个參数user是一个模型数据,接收页面的username用password
* 第二个參数converterUser通过@RequestParam注解,把页面的other參数交由UserEditor转成一个User对象
*/
@RequestMapping("create")
public ModelAndView createUser(User user,@RequestParam("other")User converterUser){
System.out.println(user.getUsername()+"--"+user.getPassword());
System.out.println(converterUser.getUsername()+"--"+converterUser.getPassword());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
2、转换器
A、写一个转换器类继承Converter
package cn.framelife.mvc.converter;
import org.springframework.core.convert.converter.Converter;
import cn.framelife.mvc.entity.User;
/**
* Converter<S源类型/T目标类型>
*
*/
public class StringToUserConverter implements Converter<String, User> {
public User convert(String source) {
User user = new User();
if(source != null){
String[] items = source.split(":");
user.setUsername(items[0]);
user.setPassword(items[1]);
}
return user;
}
}
B、配置(mvc-servlet.xml)
<!-- 装配转换器 -->
<bean id="conversionService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 这里能够配置多个自己定义的转换器 -->
<bean class="cn.framelife.mvc.converter.StringToUserConverter"></bean>
</list>
</property>
</bean>
<!-- 装配自己定义的转换器 -->
<mvc:annotation-driven conversion-service="conversionService"/>
C、 Controller的处理方法中接收页面数据
/**
* 第一个參数user是一个模型数据,接收页面的username用password
* 第二个參数converterUser通过@RequestParam注解,把页面的other參数交由转换器StringTouserConverter转成一个User对象
*/
@RequestMapping("create")
public ModelAndView createUser(User user,@RequestParam("other")User converterUser){
System.out.println(user.getUsername()+"--"+user.getPassword());
System.out.println(converterUser.getUsername()+"--"+converterUser.getPassword());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
3、注意
假设Controller范围的属性编辑器、全局范围的属性编辑器、转换器同一时候存在,那么Spring MVC将按以下的优先顺序查找相应类型的编辑器来处理:
查询Controller范围的属性编辑器
查询转换器
查询全局范围的属性编辑器
4、数据格式化
4.1 Spring内建的格式化转换器
4.2 注解驱动格式化的使用
A、启动注解驱动格式化功能
之前我们配置自己定义转换器的时候。使用的是BeanConversionServiceFactoryBean。
org.springframework.context.support.ConversionServiceFactoryBean
改成
org.springframework.format.support.FormattingConversionServiceFactoryBean
FormattingConversionServiceFactoryBean即能够注冊自己定义的转换器。还能够注冊自己定义的注解驱动的格式转换器,使项目支持注解驱动格式化功能。
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<!-- 这是之前配置自己定义的转换器 -->
<bean class="cn.framelife.mvc.converter.StringToUserConverter"></bean>
</list>
</property>
</bean>
B、页面
<form action="user/create.abc" method="post">
用户名:<input type="text" name="username"><br/>
密 码:<input type="text" name="password"><br/>
生日:<input type="text" name="birthday"><br/>
工资:<input type="text" name="salary"><br/>
其他:<input type="text" name="other"><br/>
<input type="submit">
</form>
C、实体类中使用格式化注解
public class User implements java.io.Serializable {
private Integer id;
private String username;
private String password;
// 将如1999-09-09这种字符串转换成Date对象
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
// 把如5,500.00这个的字符串转换成long类型的数据
@NumberFormat(pattern = "#,###.##")
private long salary;
public long getSalary() {
return salary;
}
public void setSalary(long salary) {
this.salary = salary;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
D、Controler中处理
@RequestMapping("create")
public ModelAndView createUser(User user){
System.out.println(user.getBirthday()+"=="+user.getSalary());
ModelAndView view = new ModelAndView();
view.setViewName("/success");
return view;
}
Spring MVC数据转换的更多相关文章
- Spring MVC 数据转换和格式化
HttpMessageConverter和JSON消息转换器 HttpMessageConverter是定义从HTTP接受请求信息和应答给用户的 HttpMessageConverter是一个比较广的 ...
- Spring mvc数据转换 格式化 校验(转载)
原文地址:http://www.cnblogs.com/linyueshan/p/5908490.html 数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标 ...
- spring mvc 数据转换
项目目录结构 User.java package org.mythsky.springmvcdemo.model; import org.springframework.format.annotati ...
- 第6章 Spring MVC的数据转换、格式化和数据校验
使用ConversionService转换数据 <%@ page language="java" contentType="text/html; charset=U ...
- Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验
Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...
- 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter
浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...
- Spring MVC 流程图(转)
Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...
- spring MVC原理
spring MVC原理 Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...
- Spring MVC 原理介绍(执行流程)
Spring MVC工作流程图 图一 图二 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...
随机推荐
- 优动漫PAINT基础系列之图层模式
在绘画软件优动漫PAINT中,笔刷工具属性中的消除锯齿变成灰色无法选择了?铅笔绘制没有压感?快来改改图层模式~ 优动漫PAINT下载:http://www.dongmansoft.com/xiazai ...
- 使用maven插件dockerfile-maven-plugin生成Docker镜像并推送到镜像仓库
1.引入maven插件 <build> <plugins> <plugin> <groupId>com.spotify</groupId> ...
- json对象与其字符串之间的转换
在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键.例如: JSON字符串:var str1 = '{ &qu ...
- luoguP1555 尴尬的数字(暴力+map)
题意 题解 枚举每一个可能的二进制数.扔到一个map里 再枚举每一个可能的三进制数看map有没有就行了 反正就是很水 #include<iostream> #include<cstr ...
- BZOJ 3790 神奇项链(manacher+贪心)
3790: 神奇项链 Time Limit: 10 Sec Memory Limit: 64 MB Description 母亲节就要到了,小 H 准备送给她一个特殊的项链.这个项链可以看作一个用小 ...
- linux中对socket的理解 socket高并发
1.socket是什么? 其实准确的来说,socket并不仅仅用于linux而已,它也应用于TCP/IP中.笼统的来说,socket就是指的“IP地址+端口号”.比如我有一个ssh服务器A,这时候我有 ...
- Linux下库文件的设置 (/usr/bin/ld: cannot find -lxxx 的解决办法)
在软件编译过程中,经常会碰到类似这样的编译错误: /usr/bin/ld: cannot find -lhdf5 这表示找不到库文件 libhdf5.so,若是其它库文件,则是 cannot find ...
- 埃及分数 迭代加深搜索 IDA*
迭代加深搜索 IDA* 首先枚举当前选择的分数个数上限maxd,进行迭代加深 之后进行估价,假设当前分数之和为a,目标分数为b,当前考虑分数为1/c,那么如果1/c×(maxd - d)< a ...
- zoj 1655 单源最短路 改为比例+最长路
http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=655 没有理解清题意就硬套模板.所以WA了好几次. 解析看我的还有一篇http ...
- java 基本类型、包装类、字符串之间的转换
1.基本类型和包装类 基本类型和包装类可通过自动装箱和拆箱实现. int i = 24; Integer a = new Integer(i); //手动装箱 Integer b = i; //自动装 ...