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的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC自定义类型转换器Converter参数解析器HandlerMethodArgumentResolver