Spring MVC数据转换

简介: <div class="markdown_views"><p>例子:把一个字符串封装而一个对象。 <br> 如:username:password格式的数据ZhangSan:1234,我们把这个数据封装成一个User对象。下面分别使用属性编辑器与转换器来实现。</p><h1 id="1自定义属性编辑器">1、自定义属性编辑器</h1><h2 id="a写一

例子:把一个字符串封装而一个对象。
如: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;
    }
目录
相关文章
|
23天前
|
存储 Java API
如何使用 Java 记录简化 Spring Data 中的数据实体
如何使用 Java 记录简化 Spring Data 中的数据实体
30 9
|
18天前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
25天前
|
JSON 前端开发 Java
【Spring】“请求“ 之传递 JSON 数据
【Spring】“请求“ 之传递 JSON 数据
79 2
|
25天前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
49 2
|
2月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
|
27天前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
76 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
2月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
20天前
|
前端开发 Java 数据库
springBoot:template engine&自定义一个mvc&后端给前端传数据&增删改查 (三)
本文介绍了如何自定义一个 MVC 框架,包括后端向前端传递数据、前后端代理配置、实现增删改查功能以及分页查询。详细展示了代码示例,从配置文件到控制器、服务层和数据访问层的实现,帮助开发者快速理解和应用。
|
3月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
3月前
|
XML JSON 数据库
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)
这篇文章详细介绍了RESTful的概念、实现方式,以及如何在SpringMVC中使用HiddenHttpMethodFilter来处理PUT和DELETE请求,并通过具体代码案例分析了RESTful的使用。
SpringMVC入门到实战------七、RESTful的详细介绍和使用 具体代码案例分析(一)