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 版权协议,转载请附上原文出处链接和本声明。