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 ...
随机推荐
- layui计算剩余时间
<div id="test"></div> <script> layui.use('util', function(){ var util = ...
- [arc076e]connected?
题意: 给出一个$R\times C$的棋盘,其中$1$到$N$之间的每个正整数都会在棋盘上出现两次,第$i$个数出现的位置是$(X_{i,1},Y_{i,1})$和$(X_{i,2},Y_{i,2} ...
- POJ-1743 Musical Theme 字符串问题 不重叠最长重复子串
题目链接:https://cn.vjudge.net/problem/POJ-1743 题意 给一串整数,问最长不可重叠最长重复子串有多长 注意这里匹配的意思是匹配串的所有元素可以减去或者加上某个值 ...
- 通过nodeSelector配置项实现pod部署至指定node
Node节点添加标签 [root@node1 work]# kubectl label nodes node1 node=master --overwrite node/node1 labeled [ ...
- [vue插件]基于vue2.x的电商图片放大镜插件
最近在撸一个电商网站,有一个需求是要像淘宝商品详情页那样,鼠标放在主图上,显示图片放大镜效果,找了一下貌似没有什么合适的vue插件,于是自己撸了一个,分享一下.小白第一次分享,各位大神莫见笑. vue ...
- 紫书 例题11-10 UVa 1349 (二分图最小权完美匹配)
二分图网络流做法 (1)最大基数匹配.源点到每一个X节点连一条容量为1的弧, 每一个Y节点连一条容量为1的弧, 然后每条有向 边连一条弧, 容量为1, 然后跑一遍最大流即可, 最大流即是最大匹配对数 ...
- Opencv 三对角线矩阵(Tridiagonal Matrix)解法之(Thomas Algorithm)
1. 简介 三对角线矩阵(Tridiagonal Matrix),结构如公式(1)所示: aixi−1+bixi+cixx+1=di(1) 其中a1=0,cn=0.写成矩阵形式如(2): ⎡⎣⎢⎢⎢⎢ ...
- 嵌入式表单字段中的内容可能被server更改以删除不安全的内容。是否要又一次载入您的页面以查看保存结果?
嵌入式表单字段中的内容可能被server更改以删除不安全的内容.是否要又一次载入您的页面以查看保存结果? 近期有朋友问到,当他在SharePoint首页上进行编辑时.插入一段代码. 完 ...
- HDU 1827 Summer Holiday(强连通)
HDU 1827 Summer Holiday 题目链接 题意:中文题 思路:强连通缩点,每一个点的权值为强连通中最小值,然后入度为0的点就是答案 代码: #include <cstdio> ...
- 32.AngularJS 表达式
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 表达式写在双大括号内:{{ expression }}. AngularJS 表达式把数据 ...