Spring MVC 学习笔记第五章 自定义数据转换器

  • Post author:
  • Post category:其他




Spring MVC 学习笔记第五章 自定义数据转换器

数据转换器是指将客户端HTTP请求中的参数转换为也业务方法中定义的形参。自定义表示开发者可以自主设计转换器的方式,HandlerAdapter已经提供了通用的转换,String→int,String→Double,表单数据的封装等,但是在特殊的业务场景下,HandlerAdapter无法进行转换,就需要开发者自定义转换器。


例1. Spring类型转换成Date类型

客户端输入String类型的数据“2020-04-26”,自定义转换器将该数据转换成Date类型的对象。

  • 创建DateConverter转换器,实现Converter接口。在convert方法中添加具体的转换逻辑代码。返回date日期对象。
package com.fwconverter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {

    private String patten;

    public DateConverter(String patten){
        this.patten=patten;
    }
    public Date convert(String s) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(this.patten);
        Date date = null;
        try {
            date = simpleDateFormat.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}
  • springmvc.xml配置转换器(可以配置多个)
<!--配置自定义转换器-->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.fw.converter.DateConverter">
                <constructor-arg name="patten" type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
            </bean>
        </list>
    </property>
</bean>

同时要将自定义转换器加到annotation-driven里才能使其生效。

<mvc:annotation-driven conversion-service="converterService">
	···
</mvc:annotation-driven>
  • JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/converter/date" method="post">
        输入日期:<input type="text" name="date">例:(yyyy-MM-dd)<br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
  • Handler业务方法
package com.fw.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

@RestController
@RequestMapping("/converter")
public class ConvertHandler {

    @RequestMapping("/date")
    public String date(Date date){
        return date.toString();
    }
}

输入[2020-04-26]运行结果:

Sun Apr 26 00:00:00 JST 2020


例2.String 转Student

  • 创建StudentConverter数据转换器
package com.fw.converter;

import com.fw.entity.Student;
import org.springframework.core.convert.converter.Converter;

public class StudentConverter  implements Converter<String, Student> {

    public Student convert(String s) {
        String[] args=s.split("-");
        Student student=new Student();
        student.setId(Long.parseLong(args[0]));
        student.setName(args[1]);
        student.setAge(Integer.parseInt(args[2]));
        return student;
    }
}
  • JSP
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form action="/converter/student" method="post">
        请输入学生信息:<input type="text" name="student">例:10-张三-24<br>
        <input type="submit" value="提交">
    </form>
</body>
</html>
  • 将自定义的StudentConverter转换器添加到springmvc.xml
<!--配置自定义转换器-->
<bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <list>
            <bean class="com.fw.converter.DateConverter">
                <constructor-arg name="patten" type="java.lang.String" value="yyyy-MM-dd"></constructor-arg>
            </bean>
            <bean class="com.fw.converter.StudentConverter"></bean>
        </list>
    </property>
</bean>
  • Handle业务方法
@RequestMapping("/student")
public String student(Student student){
    return student.toString();
}

输入[11-小红-24]运行结果:

Student(id=11, name=小红, age=24)



版权声明:本文为qq_41684416原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。