目录

概述

内置的类型转换器

自定义类型转换器

创建实体类

创建控制器类

创建自定义类型转换器类

注册类型转换器

创建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项目并且创建文件及文件夹:

spring TypeConverter使用 spring converter转换器_spring

创建实体类

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

spring TypeConverter使用 spring converter转换器_SpringMVC_02

输入信息并提交

spring TypeConverter使用 spring converter转换器_mvc_03

(中文乱码)

如果输入不符合格式(如把英文逗号变成中文逗号)

spring TypeConverter使用 spring converter转换器_mvc_04

将报错

spring TypeConverter使用 spring converter转换器_SpringMVC_05