样例:把一个字符串封装而一个对象。

如: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数据转换的更多相关文章

  1. Spring MVC 数据转换和格式化

    HttpMessageConverter和JSON消息转换器 HttpMessageConverter是定义从HTTP接受请求信息和应答给用户的 HttpMessageConverter是一个比较广的 ...

  2. Spring mvc数据转换 格式化 校验(转载)

    原文地址:http://www.cnblogs.com/linyueshan/p/5908490.html 数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标 ...

  3. spring mvc 数据转换

    项目目录结构 User.java package org.mythsky.springmvcdemo.model; import org.springframework.format.annotati ...

  4. 第6章 Spring MVC的数据转换、格式化和数据校验

    使用ConversionService转换数据 <%@ page language="java" contentType="text/html; charset=U ...

  5. Spring MVC—数据绑定机制,数据转换,数据格式化配置,数据校验

    Spring MVC数据绑定机制 数据转换 Spring MVC处理JSON 数据格式化配置使用 数据校验 数据校验 Spring MVC数据绑定机制 Spring MVC解析JSON格式的数据: 步 ...

  6. 0059 Spring MVC与浏览器间的JSON数据转换--@RequestBody--@ResponseBody--MappingJacson2HttpMessageConverter

    浏览器与服务器之间的数据交换有很多类型,不只是表单提交数据这一种,比如ajax技术就大量使用json.xml等,这时候就涉及到浏览器端和服务器端数据格式转换的问题,服务器端都是Java对象,需要把请求 ...

  7. Spring MVC 流程图(转)

    Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...

  8. spring MVC原理

    spring MVC原理   Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt D ...

  9. Spring MVC 原理介绍(执行流程)

    Spring MVC工作流程图   图一   图二    Spring工作流程描述       1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServle ...

随机推荐

  1. How Javascript works (Javascript工作原理) (一) 引擎,运行时,函数调用栈

    个人总结:该系列文章对JS底层的工作原理进行了介绍. 这篇文章讲了 运行时:js其实是和AJAX.DOM.Settimeout等WebAPI独立分离开的 调用栈:JavaScript的堆内存管理 和 ...

  2. NOIp2018模拟赛四十一

    现在是下午15:36,我已经改完题了...刷新纪录 A题叫B,B题叫A是什么操作??? 我离200只差一个SBFA.jpg 成绩:0+100+10=110 被虐啦...今天九个阿克的Orz.A题是个神 ...

  3. [luogu]P4316 绿豆蛙的归宿(拓扑排序,期望)

    P4316 绿豆蛙的归宿 题目背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找它新的归宿. 题目描述 给出一个有向无环图,起点为1终点为N,每条边都有一个长度,并且从起点出发能够 ...

  4. 数组名作为函数参数以及sizeof用法

    来源:https://blog.csdn.net/jay_zhouxl/article/details/51745518 int f(int *p,char *a) { printf("p[ ...

  5. LeetCode——Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. 写一个函数找出字符串数组中 ...

  6. 《Spring技术内幕》笔记-Spring的设计理念和总体架构

    1.Spring的主要子项目:     -1.Spring Framework(Core):Spring项目的核心.提供IoC,AOP,MVC等核心功能.     -2.Spring Web Flow ...

  7. [Angular] Short Imports with TypeScript Path Mapping

    The idea is change from: import {CoreModule} from '../core/core.module'; to: import {CoreModule} fro ...

  8. cocos2d_android 第一个游戏

    依据上一篇文章.创建好cocos2d--android的开发环境 先上效果图 实现该效果的代码: package com.cn.firstgame; import org.cocos2d.layers ...

  9. Windows下使用静态库

    开发工具 vs2010 1.新建win32控制台应用程序 2.将静态库的头文件包括在程序中并手动链接静态库(库文件和头文件都在根文件夹下) watermark/2/text/aHR0cDovL2Jsb ...

  10. MySQL具体解释(9)----------索引具体解释

    写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点. 考虑例如以下情况.假设数据库中一个表有10^6条记录,DBMS的页面大小为4K.并存储100条记录.假设没有索引, ...