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;
    }
时间: 2024-10-29 19:12:06

Spring MVC数据转换的相关文章

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

原文地址:http://www.cnblogs.com/linyueshan/p/5908490.html 数据绑定流程 1. Spring MVC 主框架将 ServletRequest 对象及目标方法的入参实例传递给 WebDataBinderFactory 实例,以创建 DataBinder 实例对象2. DataBinder 调用装配在 Spring MVC 上下文中的 ConversionService 组件进行数据类型转换.数据格式化工作.将 Servlet 中的请求信息填充到入参对

Spring MVC(三) 数据转换、格式化、校验

数据转换.格式化.校验 数据绑定机理 数据类型转换 低版本的Spring 只支持标准的PropertyEditor类型体系,不过PropertyEditor存在以下缺陷: 只能用于字符串和Java对象的转换,不适用于任意两个Java类型之间的转换: 对源对象及目标对象所在的上下文信息(如注解.所在宿主类的结构等)不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑.有鉴于此,Spring 3.0在核心模型中添加了一个通用的类型转换模块,ConversionService是Spring类型转

Spring MVC 流程图

Spring MVC 流程图 Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI).然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回: 3. Dispatc

Spring MVC 简述:从MVC框架普遍关注的问题说起

任何一个完备的MVC框架都需要解决Web开发过程中的一些共性的问题,比如请求的收集与分发.数据前后台流转与转换,当前最流行的SpringMVC和Struts2也不例外.本文首先概述MVC模式的分层思想与MVC框架普遍关注的问题,并以此为契机结合SpringMVC的入门级案例简要地从原理.架构角度介绍了它对这些问题的处理,包括请求处理流程.消息转换机制和数据绑定机制等核心问题.最后,本文对目前最为流行的两个MVC框架SpringMVC 和 一. MVC 模式与框架 1.MVC 模式 Java We

spring MVC原理

Spring MVC工作流程图 图一 图二  Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI).然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回: 3.

Spring MVC 4那些事

Spring MVC,又名Spring Web MVC,是一款主流的Web MVC框架,与Struts2框架类似,其主要目的是构建Web应用程序的全功能MVC模块,在View层和Controller层之间进行映射,完成View层和Model层之间的数据转换. Spring MVC框架通过 DispatcherServlet 分发请求处理程序,包括可配置的映射,视图解决方案,语言,时区,主题以及上传文件.默认的处理器是基于 @Controller 和 @RequestMapping 注解处理各种方

Spring MVC Rest 学习 一

第一步:配置Spring MVC 核心Servlet <!-- spring mvc -->    <listener>    <!--  request.session 和  global session web作用域 -->     <listener-class>         org.springframework.web.context.request.RequestContextListener             </listene

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

Spring MVC工作流程图 图一 图二  Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI).然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回: 3.

Spring MVC工作原理

Spring MVC工作流程图 图一 图二  Spring工作流程描述 1. 用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获: 2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI).然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回: 3.