SpringMVC类型转换器Converter

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC类型转换器Converter相关的知识,希望对你有一定的参考价值。

SpringMVC类型转换器Converter

在SpringMVC框架中需要收集用户请求参数,并将请求参数传递给应用的控制器组件,所有的请求参数都只能是字符串数据类型,SpringMVC框架必须将这些字符串转换成相应的数据类型。 一般JSP+Servlet需要开发者自己在Servlet中进行类型转换,并将其封装成对象,比较繁琐,对于SpringMVC框架而言,他必须将请求参数转换成值对象中各属性对应的数据类型,SpringMVC的Convert是一个可以将一种数据类型转换成另一种数据类型的接口,一般开发者在实际应用中使用框架内置的类型转换器就可以,但有时需要编写具有特定功能的类型转换器

  • 注意:在使用内置转换器时候,请求参数输入值和接收参数的类型要一致,否则会报错。

下面演示一下自定义Converter类型转换器。
1-创建web应用,并导入相关jar包。
2-在index.jsp页面创建输入信息采集视图,该视图点击提交按钮后,映射到相应的控制器处理。

<%--
  Created by IntelliJ IDEA.
  User: nuist__NJUPT
  Date: 2021/9/29
  Time: 8:40
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <form action="${pageContext.request.contextPath}/my/converter" method="post">
请输入商品信息(格式为apple,110.58,200)
  <input type = "text" name = "goodsMeal"/><br>
  <input type = "submit" value = "提交"/>
  </form>
  </body>
</html>

3-创建pojo包,在该包中创建GoodsMeal类,用于传递参数到controller

public class GoodsMeal {
    private String goodsName ;
    private double goodsPrice ;
    private int goodsNumber ;

    public String getGoodsName() {
        return goodsName;
    }

    public void setGoodsName(String goodsName) {
        this.goodsName = goodsName;
    }

    public double getGoodsPrice() {
        return goodsPrice;
    }

    public void setGoodsPrice(double goodsPrice) {
        this.goodsPrice = goodsPrice;
    }

    public int getGoodsNumber() {
        return goodsNumber;
    }

    public void setGoodsNumber(int goodsNumber) {
        this.goodsNumber = goodsNumber;
    }
}

4-创建controller包,在该包中创建控制器类
ConverterController,用于接收请求参数,并将相应参数转换对应的类型。

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import pojo.GoodsMeal;

@Controller
@RequestMapping("/my")
public class ConverterController {
    @RequestMapping("/converter")
    public String myConverter(GoodsMeal gm, Model model){
        model.addAttribute("goodsMeal", gm) ;
        return "showGoods" ;
    }
}

5-创建converter包,在改包中创建自定义类型装换器,完成类型转换。


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

//源类型String类型,目标类型GoodsMeal
public class GoodsConverter implements Converter<String, GoodsMeal> {
    @Override
    public GoodsMeal convert(String s) {
        GoodsMeal goodsMeal = new GoodsMeal() ;
        String [] values = s.split(",") ;
        if(values != null && values.length == 3){
            goodsMeal.setGoodsName(values[0]) ;
            goodsMeal.setGoodsPrice(Double.parseDouble(values[1])) ;
            goodsMeal.setGoodsNumber(Integer.parseInt(values[2])) ;
            return goodsMeal ;
        }else{
            throw new IllegalArgumentException("格式转换错误") ;
        }
    }
}

6-在web.xml配置DispatcherServlet,用于总的控制

<?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"
         id = "WebApp_ID" version="4.0">
    <!--部署DispatcherServlet-->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>WEB-INF/springmvc-servlet.xml</param-value>
        </init-param>
        <!--表示容器启动时加载的servlet-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!--任意的请求都通过DispatcherServlet-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

7-在WEB-INF拆创建配置文件springmvc-servlet.xml,在该配置文件中扫描controller包,使注解生效,注册自定义类型转换器同时启动转换器,注册视图解析器。

<?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:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--使用扫描机制,扫描控制器类-->
    <context:component-scan base-package="controller"/>
    <mvc:annotation-driven/>
    <!--注册类型转换器GoodsConverter-->
    <bean id = "conversionService" class = "org.springframework.context.support.ConversionServiceFactoryBean">
        <property name = "converters">
            <list>
                <bean class = "converter.GoodsConverter"/>
            </list>
        </property>
    </bean>
    <!--启动注册的类型转换器-->
    <mvc:annotation-driven conversion-service="conversionService"/>
    <!--annotation-driven用于简化开发的配置,注解DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter-->
    <!--使用resources过滤掉不需要dispatcherservlet的资源,例如静态资源,在使用resources时必须使用annotation-driven,否则resources会阻止任意控制器被调用-->



    <!--配置视图解析器-->
    <bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver" id = "internalResourceViewResolver">
        <!--前缀-->
        <property name = "prefix" value = "/WEB-INF/jsp/"/>
        <!--后缀-->
        <property name = "suffix" value = ".jsp"/>
    </bean>
</beans>



8-在WEB-INF下创建jsp目录,在该目录中创建信息显示页面showGoods.jsp,在该页面中通过EL表达式取出model中的goodsMeal的信息。

<%--
  Created by IntelliJ IDEA.
  User: nuist__NJUPT
  Date: 2021/9/29
  Time: 9:23
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
您创建的商品信息如下:<br>
<!--使用EL表达式取出model中的goodsMeal的信息-->
商品的名称为:${goodsMeal.goodsName}
商品的价格为:${goodsMeal.goodsPrice}
商品的数量为:${goodsMeal.goodsNumber}
</body>
</html>

工作过程:首先通过index.jsp页面输入信息,点击提交,客户端请求提交到DispatcherServlet,由DispatcherServlet找到Requestmapping映射到指定的控制器,该控制器调用自定义类型转换类转换完成后,返回ModelAndView,视图解析器解析后,进入主页面,主页面通过EL表达式取出model对象中goodsMeal的值。

以上是关于SpringMVC类型转换器Converter的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC之转换器与格式化

Spring MVC自定义类型转换器Converter参数解析器HandlerMethodArgumentResolver

SpringMVC入门终结篇

Spring MVC 类型转换:PropertyEditor 还是 Converter?

为啥自定的springmvc converter不起作用吗

SpringMVC的格式化转换器Formatter