Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型。开发者在实际应用中使用框架内置的类型转换器基本上就够了,但有时需要编写具有特定功能的类型转换器。
例如,用户输入的日期可能有许多种形式,如“December 25,2014”“12/25/2014”和“2014-12-25”,这些都表示同一个日期。默认情况下,Spring 会期待用户输入的日期样式与当前语言区域的日期样式相同。例如,对于美国的用户而言,就是月/日/年的格式。如果希望 Spring 在将输入的日期字符串绑定到 LocalDate 时,使用不同的日期样式,则需要编写一个 Converter,才能将字符串转换成日期。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
java.time.LocalDate 类是 Java 8 的一个新类型,用来替代 java.util.Date。还需使用新的 Date/Time API 来替换旧有的 Date 和 Calendar 类。
内置的类型转换器
在 Spring MVC 框架中,对于常用的数据类型,开发者无须创建自己的类型转换器,因为 Spring MVC 框架有许多内置的类型转换器用于完成常用的类型转换。Spring MVC 框架提供的内置类型转换包括以下几种类型。
1)标量转换器
image.png
2)集合、数组相关转换器
image.png
类型转换是在视图与控制器相互传递数据时发生的。Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换。
注意:在使用内置类型转换器时,请求参数输入值与接收参数类型要兼容,否则会报 400 错误。请求参数类型与接收参数类型不兼容问题需要学习输入校验后才可解决。
自定义类型转换器
当 Spring MVC 框架内置的类型转换器不能满足需求时,开发者可以开发自己的类型转换器。
例如需要用户在页面表单中输入信息来创建商品信息。当输入“bianchengbang,18,1.85”时表示在程序中自动创建一个 new User,并将“bianchengbang”值自动赋给 name 属性,将“18”值自动赋给 age 属性,将“1.85”值自动赋给 height 属性。
如果想实现上述应用,需要做以下 5 件事:
- 创建实体类。
- 创建控制器类。
- 创建自定义类型转换器类。
- 注册类型转换器。
- 创建相关视图。
示例
本节示例基于《[@Controller和@RequestMapping注解]》一节创建的 springmvcDemo2 应用。
1. 创建实体类
在 net.biancheng.po 包下创建 User 实体类,代码如下。
<pre class="java sh_java snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
-
package net.biancheng.po;
-
public class User {
-
private String name;
-
private Integer age;
-
private Double height;
-
/*省略setter和getter方法/
-
}
</pre>
2. 创建控制器类
在 net.biancheng.controller 包下创建 UserController 控制器,代码如下。
<pre class="java sh_java snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
-
package net.biancheng.controller;
-
import org.springframework.stereotype.Controller;
-
import org.springframework.ui.Model;
-
import org.springframework.web.bind.annotation.RequestBody;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestParam;
-
import org.springframework.web.bind.annotation.ResponseBody;
-
import net.biancheng.po.User;
-
@Controller
-
public class UserController {
-
@RequestMapping("/addUser")
-
public String addUser() {
-
return "addUser";
-
}
-
}
</pre>
创建 ConverterController 控制器,代码如下。
<pre class="java sh_java snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
-
package net.biancheng.controller;
-
import org.springframework.stereotype.Controller;
-
import org.springframework.ui.Model;
-
import org.springframework.web.bind.annotation.RequestMapping;
-
import org.springframework.web.bind.annotation.RequestParam;
-
import net.biancheng.po.User;
-
@Controller
-
public class ConverterController {
-
@RequestMapping("/converter")
-
public String myConverter(@RequestParam("user") User user, Model model) {
-
model.addAttribute("user", user);
-
return "showUser";
-
}
-
}
</pre>
3. 创建自定义类型转换器
创建 net.biancheng.converter,在该包下创建自定义类型转换器 UserConverter,代码如下。
<pre class="java sh_java snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
-
package net.biancheng.converter;
-
import org.springframework.core.convert.converter.Converter;
-
import org.springframework.stereotype.Component;
-
import net.biancheng.po.User;
-
@Component
-
public class UserConverter implements Converter<String, User> {
-
@Override
-
public User convert(String source) {
-
// 创建User实例
-
User user = new User();
-
// 以“,”分隔
-
String stringvalues[] = source.split(",");
-
if (stringvalues != null && stringvalues.length == 3) {
-
// 为user实例赋值
-
user.setName(stringvalues[0]);
-
user.setAge(Integer.parseInt(stringvalues[1]));
-
user.setHeight(Double.parseDouble(stringvalues[2]));
-
return user;
-
} else {
-
throw new IllegalArgumentException(String.format("类型转换失败, 需要格式'编程帮, 18,1.85',但格式是[% s ] ", source));
-
}
-
}
-
}
</pre>
4. 配置转换器
在 springmvc-servlet.xml 文件中添加以下代码。
<pre class="xml sh_xml snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
- <mvc:annotation-driven conversion-service="conversionService" />
- <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
- <property name="converters">
- <list>
- <bean class="net.biancheng.converter.UserConverter" />
- </list>
- </property>
- </bean>
</pre>
5. 创建相关视图
创建添加用户页面 addUser.jsp,代码如下。
<pre class="xml sh_xml snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>添加用户</title>
- </head>
- <body>
- <form action="${pageContext.request.contextPath}/converter"
- method="post">
- 请输入用户信息(格式为编程帮, 18,1.85):
- <input type="text" name="user" />
- <input type="submit" value="提交" />
- </form>
- </body>
- </html>
</pre>
创建显示用户页面 showUser.jsp,代码如下。
<pre class="xml sh_xml snippet-formatted sh_sourceCode" style="margin: 0px; display: block; padding: 0px; font-size: 14px; line-height: 1.6em; color: rgb(102, 102, 102); white-space: pre-wrap; overflow-wrap: break-word; background: none; border: none; border-radius: 0px;">
-
<%@ page language="java" contentType="text/html; charset=UTF-8"
-
pageEncoding="UTF-8"%>
-
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-
<title>文件上传</title>
-
</head>
-
<body>
-
您创建的用户信息如下:
-
用户名:${user.name }
-
年龄:${user.age }
-
身高:${user.height }
-
</body>
-
</html>
</pre>
6. 测试
访问地址:http://localhost:8080/springmvcDemo2/addUser,运行结果如下图所示。
image.pngaddUser.jsp
image.png
网友评论