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 需求分析 在员工管理列表页面,可以对某个员工账号进行启用或者禁用操作.账号禁用的员工不能登录系统,启用后的员工可以正常登录.如果某个员工账号状态为正常,则按钮显示为 & ...
最新文章
- linux内核层功能 和核心,Linux内核研发工程师
- Flink在美团的实践与应用--大数据技术栈15
- SAP WMSD集成之Copy WM Quantity – Copy WM qty as delivery qty into delivery
- 前端学习(1033):jquery插件-图片懒加载
- 华为表示年内没有推出搭载鸿蒙操作系统手机的计划;OpenStack或被抛弃?iPhone至少还要三年可苹果自研5G调制解调器……...
- php 查找php配置文件php.ini所在路径的二种方法
- hashmap为什么8转成红黑树_看了两天HashMap源码,终于把红黑树插入平衡规则搞懂了...
- Navicat Premium 15 的下载及其安装
- drain open 线与_Open-Drain与Push-Pull
- Qt QSetting 读写ini配置文件(简单明了,多图)
- android 手表解决方案,智能手表解决方案
- 身份证号码的正则验证
- C语言(字符串输入)
- 日志(Logger)
- mysql查询用户留存语法(用户留存和用户留存率问题)
- 分布式、服务化的企业级 ERP 系统架构设计方案
- http请求中必须具备哪个字段_HTTP访问控制(CORS)
- 【查找域名】根据ip反向查找域名方法
- 中国电信天翼云数据安全治理发展历程
- 跨平台应用开发进阶(五十八):短链基本工作原理与实现方案
热门文章
- 项目管理之架构、团队、人
- Windows Server 2016 AD中新建组织单位、组、用户
- 一步步实现SDDC--多角色服务器部署
- Docker学习总结(58)——Dockerfile中,ADD和COPY的区别?
- Linux学习总结(23)——SSH协议详解
- Mysql学习总结(29)——MySQL中CHAR和VARCHAR
- 计算机和口腔医学都不错的学校,人民日报推荐“各省”好大学,并非只有985/211,普本也有好大学...
- html5有本地存储吗,HTML5的本地存储
- 021合并两个链表并排序
- vue和微信小程序的区别、比较