Spring MVC Converter(类型转换器)详解
Spring MVC 框架的 Converter<S,T> 是一个可以将一种数据类型转换成另一种数据类型的接口,这里 S 表示源类型,T 表示目标类型。开发者在实际应用中使用框架内置的类型转换器基本上就够了,但有时需要编写具有特定功能的类型转换器。
内置的类型转换器
在 Spring MVC 框架中,对于常用的数据类型,开发者无须创建自己的类型转换器,因为 Spring MVC 框架有许多内置的类型转换器用于完成常用的类型转换。Spring MVC 框架提供的内置类型转换包括以下几种类型。
1)标量转换器
2)集合、数组相关转换器
类型转换是在视图与控制器相互传递数据时发生的。Spring MVC 框架对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换。例如,对于 addGoods.jsp 的提交请求,可以由以下处理方法来接收请求参数并处理:
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Goodsontroller {@RequestMapping("/addGoods")public String add(String goodsname, double goodsprice, int goodsnumber) {double total = goodsprice * goodsnumber;System.out.println(total);return "success";}
}
注意:在使用内置类型转换器时,请求参数输入值与接收参数类型要兼容,否则会报 400 错误。请求参数类型与接收参数类型不兼容问题需要学习输入校验后才可解决。
自定义类型转换器
当 Spring MVC 框架内置的类型转换器不能满足需求时,开发者可以开发自己的类型转换器。
例如有一个应用 springMVCDemo03 希望用户在页面表单中输入信息来创建商品信息。当输入“apple,10.58,200”时表示在程序中自动创建一个 new Goods,并将“apple”值自动赋给 goodsname 属性,将“10.58”值自动赋给 goodsprice 属性,将“200”值自动赋给 goodsnumber 属性。
springMVCDemo03 应用与 springMVCDemo02 具有相同的 JAR 包、web.xml。
如果想实现上述应用,需要做以下 5 件事:
- 创建实体类。
- 创建控制器类。
- 创建自定义类型转换器类。
- 注册类型转换器。
- 创建相关视图。
按照上述步骤采用自定义类型转换器完成需求。
1)创建实体类
在 springMVCDemo03 的 src 目录下创建 pojo 包,并在该包中创建名为 GoodsModel 的实体类,代码如下:
package pojo;
public class GoodsModel {private String goodsname;private double goodsprice;private int goodsnumber;// 省略setter和getter方法
}
2)创建控制器类
在 springMVCDemo03 的 src 目录下创建 controller 包,并在该包中创建名为 ConverterController 的控制器类,代码如下:
package 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 pojo.GoodsModel;
@Controller
@RequestMapping("/my")
public class ConverterController {@RequestMapping("/converter")/** 使用@RequestParam* ("goods")接收请求参数,然后调用自定义类型转换器GoodsConverter将字符串值转换为GoodsModel的对象gm*/public String myConverter(@RequestParam("goods") GoodsModel gm, Model model) {model.addAttribute("goods", gm);return "showGoods";}
}
3)创建自定义类型转换器类
自定义类型转换器类需要实现 Converter<S,T> 接口,重写 convert(S) 接口方法。
convert(S) 方法的功能是将源数据类型 S 转换成目标数据类型 T。在 springMVCDemo03 的 src 目录下创建 converter 包,并在该包中创建名为GoodsConverter 的自定义类型转换器类,代码如下:
package converter;
import org.springframework.core.convert.converter.Converter;
import pojo.GoodsModel;
public class GoodsConverter implements Converter<String, GoodsModel> {public GoodsModel convert(String source) {// 创建一个Goods实例GoodsModel goods = new GoodsModel();// 以“,”分隔String stringvalues[] = source.split(",");if (stringvalues != null && stringvalues.length == 3) {// 为Goods实例赋值goods.setGoodsname(stringvalues[0]);goods.setGoodsprice(Double.parseDouble(stringvalues[1]));goods.setGoodsnumber(Integer.parseInt(stringvalues[2]));return goods;} else {throw new IllegalArgumentException(String.format("类型转换失败, 需要格式'apple, 10.58,200 ',但格式是[% s ] ", source));}}
}
4)注册类型转换器
在 springMVCDemo03 的 WEB-INF 目录下创建配置文件 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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 使用扫描机制扫描控制器类,控制器类都在controller包及其子包下 --><context:component-scan base-package="controller" /><!--注册类型转换器GoodsConverter--><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"><property name="converters"><list><bean class="converter.GoodsConverter"/></list></property></bean><beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp/" /><property name="suffix" value=".jsp" /></bean>
</beans>
5)创建相关视图
在 springMVCDemo03 应用的 WebContent 目录下创建信息采集页面 input.jsp,核心代码如下:
<form action="${pageContext.request.contextPath}/my/converter" method= "post">请输入商品信息(格式为apple, 10.58,200):<input type="text" name="goods" /><br><input type="submit" value="提交" />
</form>
在 springMVCDemo03 应用的 /WEB-INF/jsp 目录下创建信息显示页面 showGoods.jsp,核心代码如下:
<body>您创建的商品信息如下:<!-- 使用EL表达式取出model中的goods信息 -->商品名称为:${goods.goodsname }商品价格为:${goods.goodsprice }商品名称为:${goods.goodsnumber }
</body>
最后,使用地址“ http://localhost:8080/springMVCDemo03 /input.jsp ”测试应用。
Spring MVC Converter(类型转换器)详解相关推荐
- Spring MVC自定义类型转换器Converter、参数解析器HandlerMethodArgumentResolver
文章目录 一.前言 二.类型转换器Converter 1.自定义类型转换器 三.参数解析器 1.自定义分页参数解析器 2.自定义注解参数解析器 一.前言 Spring MVC源码分析相关文章已出: S ...
- Spring MVC 框架搭建及详解
现在主流的Web MVC框架除了Struts这个主力 外,其次就是Spring MVC了,因此这也是作为一名程序员需要掌握的主流框架,框架选择多了,应对多变的需求和业务时,可实行的方案自然就多了.不过 ...
- Spring MVC之@RequestBody, @ResponseBody 详解
引言: 接上一篇文章讲述处理@RequestMapping的方法参数绑定之后,详细介绍下@RequestBody.@ResponseBody的具体用法和使用时机: 简介: @RequestBody 作 ...
- Spring MVC的处理流程详解
本文来说下Spring MVC 的处理流程是怎样的 文章目录 Spring MVC概述 Spring MVC的处理流程 曾经的王者-Servlet 想要更进一步 Spring MVC-两级控制器方式 ...
- Spring MVC 拦截器 interceptor 详解
Spring MVC-拦截器 今天就是把有关拦截器的知识做一个总结. 1.拦截器概述 1.1 什么是拦截器? Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(F ...
- Spring MVC原理及配置详解
转载自 http://blog.csdn.net/jianyuerensheng/article/details/51258942 [Spring]Spring MVC原理及配置 1.Spring M ...
- Spring MVC 之@Controller@RequestMapping详解
一:配置web.xml 1)问题:spring项目中有多个配置文件mvc.xml dao.xml 2)解决:在web.xml中 <init-param> <param-name& ...
- 【Spring】Spring MVC原理及配置详解
[Spring]Spring MVC原理及配置 1.Spring MVC概述: Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO ...
- Spring 3.0 注解注入详解
Spring 3.0 注解注入详解 2011-04-15 09:44 17ZOUGUO ITEYE博客 我要评论(1) 字号:T | T AD: 一.各种注解方式 1.@Autowired注解(不推荐 ...
- 基于Springboot外卖系统08:员工账号状态管理功能+对象转换器+扩展Spring mvc的消息转换器
1. 员工账号状态管理 1.1 需求分析 在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作.账号禁用的员工不能登录系统,启用后的员工可以正常登录.如果某个员工账号状态为正常,则按钮显示为 & ...
最新文章
- apache activemq ActiveMQ 修改密码
- AI理论知识整理(3)-正定矩阵
- Entity Framework 6.x Code First 基础
- js的if(!myFunction())有何用
- 手机上有没有学python的软件-三款可以在安卓手机上运行Python代码的软件
- 北大计算机专业毕业论文,北京大学毕业论文格式范本
- 命令行 降低IE版本 IE11降到IE8
- 二、Arduino软件下载-安装-测试教程
- liunux 查看系统参数、网络参数的命令
- java计算机毕业设计网上鲜花店系统源码+系统+数据库+lw文档
- 263企业邮箱imap服务器,263企业邮箱实现IMAP邮箱搬家功能
- 中心矩和原点矩_中心矩和原点矩的几何意义是什么呢,无法理解
- 使用KCP 加速游戏消息,让全球玩家流畅联网
- PPT多张图片的融合插件
- JAVA-TOMCAT环境变量的设置方法
- Hulu 圣诞剧集推荐
- 【权限设计】最好的权限设计,是先区分功能权限和数据权限
- 蓝桥杯国赛 勾股定理
- 新买的电脑没有免费的office怎么弄?
- 微凉的风吹着我凌乱的头发,突然决定开个客博,以录下从MATLAB到OMNET的艰难历程
热门文章
- Esxi直接使用vmdk文件创建虚机
- Redis学习总结(18)——Redis 常见面试题复习
- 一个宝妈如何完成逆袭做到月入5万+,单品利润破20万的
- 三星active2怎么连接手机_手机怎么连接隐藏的wifi无线网络
- 技术中台构建思路及进展_半年中台实践思考:落地中台,贵在其神,活用其形...
- opencms mysql_OpenCms for MySql安装图解
- Java @override报错的解决方法
- 『Material Design 入门学习笔记』前言
- 2015-7-24 从新开始博客之路
- 使用nagios监控某进程的运行状态