目录
概述
内置的类型转换器
自定义类型转换器
创建实体类
创建控制器类
创建自定义类型转换器类
注册类型转换器
创建JSP视图文件
运行效果
概述
SpringMVC框架的Converter<S,T>是一个可以将一种数据类型转换成另一种数据类型的接口,这里S表示源类型,T表示目标类型。开发者在实际应用中使用框架内置的类型转换器基本上就够了,但有时需要编写具有特定功能的类型转换器。
内置的类型转换器
Spring MVC框架提供了很多常用数据类型的转换器,类型转换是在视图与控制器相互传递数据时发生应用的。
基本类型转换器
转换器 | 描述 |
StringToBooleanConverter | String到boolean类型转换。 |
ObjectToStringConverter | Object到String转换,调用toString方法转换。 |
StringToNumberConverterFactory | String到数字转换(例如Integer、Long等)。 |
NumberToNumberConverterFactory | 数字子类型(基本类型)到数字类型(包装类型)转换。 |
StringToCharacterConverter | String到Character转换,取字符串中的第一个字符。 |
NumberToCharacterConverter | 数字子类型到Character转换。 |
CharacterToNumberFactory | Character到数字子类型转换。 |
StringToEnumConverterFactory | String到枚举类型转换,通Enum.valueOf将宇符串转换为需要的枚举类型。 |
EnumToStringConverter | 枚举类型到String转换,返回枚举对象的name值。 |
StringToLocaleConverter | String到java.util.Locale转换。 |
PropertiesToStringConverter | java.util.Properties到String转换,默认通过ISO-8859-1解码 |
StringToPropertiesConverter | String到java.util.Properties转换,默认使用ISO-8859-1编码。 |
集合、数组相关转换器
转换器 | 描述 |
ArrayToCollectionConverter | 任意数组到任意集合(List、Set)转换。 |
CollectionToArrayConverter | 任意集合到任意数组转换。 |
ArrayToArrayConverter | 任意数组到任意数组转换。 |
CollectionToCollectionConverter | 集合之间的类型转换。 |
MapToMapConverter | Map之间的类型转换。 |
ArrayToStringConverter | 任意数组到String转换。 |
StringToArrayConverter | 字符串到数组的转换,默认通过“,“分割,且去除字符串两边的空格(trim)。 |
ArrayToObjectConverter | 任意数组到Object的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换。 |
ObjectToArrayConverter | Object到单元素数组转换。 |
CollectionToStringConverter | 任意集合(List、Set)到String转换。 |
StringToCollectionConverter | String到集合(List、Set)转换,默认通过“,“分割,且去除字符串两边的空格(trim)。 |
CollectionToObjectConverter | 任意集合到任意Object的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换。 |
ObjectToCollectionConverter | Object到单元素集合的类型转换。 |
自定义类型转换器
程序员可以自定义类型转换器,如把一个字符串数据转换成一个实体类对象。
实例:
按照如下图创建springmvc项目并且创建文件及文件夹:
创建实体类
Student.java
package springmvcdemo.pojo;
public class Student {
private int id;
private String name;
private String password;
private String sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
创建控制器类
ConverterController.java
package springmvcdemo.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 springmvcdemo.pojo.Student;
@Controller
@RequestMapping("/student")
public class ConverterController {
/**
* 使用@RequestParam("student")接收请求参数,然后调用自定义类型转换器StudentConverter将字符串值转换为Student的对象student
*/
@RequestMapping("/converter")
public String converter(@RequestParam("student")Student student, Model model){
model.addAttribute("student",student);
return "showStudent";
}
}
创建自定义类型转换器类
自定义类型转换器类需要实现Converter<S,T>接口,重写convert(S)接口方法。
convert(S)方法的功能是将源数据类型S转换成目标数据类型T。
StudentConverter.java
package springmvcdemo.converter;
import org.springframework.core.convert.converter.Converter;
import springmvcdemo.pojo.Student;
public class StudentConverter implements Converter<String, Student> {
@Override
public Student convert(String s) {
// 创建一个Student实例
Student student=new Student();
// 以“,”分隔
String[] stringValues = s.split(",");
if(stringValues!=null&&stringValues.length==5){
// 为Student实例赋值
student.setId(Integer.parseInt(stringValues[0]));
student.setName(stringValues[1]);
student.setPassword(stringValues[2]);
student.setSex(stringValues[3]);
student.setAge(Integer.parseInt(stringValues[4]));
return student;
}else {
throw new IllegalArgumentException(String.format("类型转换失败,需要格式'1,张三,abc,男,18',但格式是[%s]",s));
}
}
}
注册类型转换器
在配置文件中注册自定义类型转换器。
springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--使用扫描机制扫描控制器类,控制器类都在controller包及其子包下-->
<context:component-scan base-package="springmvcdemo.controller"/>
<!--注册类型转换器StudentConverter-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="springmvcdemo.converter.StudentConverter"/>
</list>
</property>
</bean>
<mvc:annotation-driven conversion-service="conversionService"/>
<!--配置视图解析器-->
<!--配置视图解析器成功后,RegisterController和LoginController控制器类的视图路径仅需提供register和login,视图解析器将会自动添加前缀和后缀-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
创建JSP视图文件
showStudent.jsp
<%@ page import="springmvcdemo.pojo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示学生信息</title>
</head>
<body>
<%
Student student = (Student)request.getAttribute("student");
%>
学生ID:<%=student.getId()%><br>
学生姓名:<%=student.getName()%><br>
学生密码:<%=student.getPassword()%><br>
学生性别:<%=student.getSex()%><br>
学生年龄:<%=student.getAge()%>
</body>
</html>
input.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>输入</title>
</head>
<body>
<form action="/student/converter" method="post">
请输入学生信息(格式为:1,张三,abc,男,19):
<input type="text" name="student"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--部署DispatcherServlet-->
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加载Spring MVC的配置文件,配置文件可以放在项目目录的任意位置,使用init-param元素加载配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<!--配置文件的位置-->
<param-value>/WEB-INF/config/springmvc-config/springmvc-servlet.xml</param-value>
</init-param>
<!--表示容器在启动时立即加载servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!--处理所有URL-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
运行效果
输入如下地址:http://localhost:8080/input.jsp
输入信息并提交
(中文乱码)
如果输入不符合格式(如把英文逗号变成中文逗号)
将报错