SpringMVC自定义类型转换器
我们在使用SpringMVC时,常常需要把表单中的参数映射到我们对象的属性中,我们可以在默认的spring-servlet.xml加上如下的配置即可做到普通数据类型的转换,如将String转换成Integer和Double等:
<mvc:annotation-driven />
或
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean" />
其实 <mvc:annotation-driven /> 标签会默认创建并注册一个 RequestMappingHandlerMapping(在Spring3.2之前是DefaultAnnotationHandlerMapping) 和 RequestMappingHandlerAdapter (Spring3.2之前是AnnotationMethodHandlerAdapter),当然,如果上下文有对应的显示实现类,将该注解注册的覆盖掉。该注解还会创建一个ConversionService,即 FormattingConversionServiceFactoryBean。
如果想把一个字符串转换成其它实体类型,spring没有提供这样默认的功能,我们需要自定义类型转换器。
这里有个实体类Employee。

1 package com.proc;
2
3 public class Employee {
4
5 private String name;
6 private Integer age;
7 private String gender;
8 public String getName() {
9 return name;
10 }
11 public void setName(String name) {
12 this.name = name;
13 }
14 public Integer getAge() {
15 return age;
16 }
17 public void setAge(Integer age) {
18 this.age = age;
19 }
20 public String getGender() {
21 return gender;
22 }
23 public void setGender(String gender) {
24 this.gender = gender;
25 }
26 @Override
27 public String toString() {
28 return "Employee [name=" + name + ", age=" + age + ", gender=" + gender
29 + "]";
30 }
31
32 }

规定将字符串转换成实体类的规则为: name-age-gender
那么接下来就写一个类型转换器,需要实现一个接口org.springframework.core.convert.converter.Converter

1 package com.proc;
2
3 import org.springframework.core.convert.converter.Converter;
4 import org.springframework.stereotype.Component;
5
6 @Component
7 public class EmployeeConverter implements Converter<String, Employee> {
8
9 @Override
10 public Employee convert(String str) {
11 Employee emp=null;
12 //字符串格式 name-age-gender
13 if(str!=null && str.split("-").length==3){
14 emp=new Employee();
15 String[] arr=str.split("-");
16 emp.setName(arr[0]);
17 emp.setAge(Integer.parseInt(arr[1]));
18 emp.setGender(arr[2]);
19 }
20 return emp;
21 }
22 }

这里我们为转换器加上@Component注解,是为了让Spring自动扫描该转换器到容器中。这样就不用通过配置文件配置<bean>了
接下来编写控制器

1 package com.proc;
2
3 import org.springframework.stereotype.Controller;
4 import org.springframework.web.bind.annotation.RequestMapping;
5 import org.springframework.web.bind.annotation.RequestParam;
6
7 @Controller
8 public class EmployeeController {
9
10 @RequestMapping("/add")
11 public String add(@RequestParam("employee") Employee employee){
12 System.out.println(employee);
13 return "add";
14 }
15 }

这里可以看到,参数的名字为employee,所有要为请求定义一个employee参数,该参数传入需要转换的字符串
除此之外,我们还需要在spring配置文件中配置,如下类容。让转换器生效

1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:context="http://www.springframework.org/schema/context"
5 xmlns:mvc="http://www.springframework.org/schema/mvc"
6 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
7 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
8 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
9
10 <context:component-scan base-package="com.proc"></context:component-scan>
11
12 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
13 <property name="prefix" value="/WEB-INF/"/>
14 <property name="suffix" value=".jsp"></property>
15 </bean>
16
17 <mvc:annotation-driven conversion-service="conversionService"/>
18
19 <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
20 <property name="converters">
21 <set>
22 <ref bean="employeeConverter"/>
23 </set>
24 </property>
25 </bean>
26 </beans>

测试代码:http://localhost:8080/springmvc-1/add?employee=caoyc-18-male
结果输出:Employee [name=caoyc, age=18, gender=male]
上面配置文件中我们使用配置了一个ConversionServiceFactoryBean。虽然可以这样,但不建议。我们通常用org.springframework.format.support.FormattingConversionServiceFactoryBean
为什么要这样用呢?这样用的好处是什么呢?
使用FormattingConversionServiceFactoryBean可以让SpringMVC支持@NumberFormat和@DateTimeFormat等Spring内部自定义的转换器。
转自:https://www.cnblogs.com/caoyc/p/5639652.html
SpringMVC自定义类型转换器的更多相关文章
- 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器
之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...
- springmvc——自定义类型转换器
一.什么是springmvc类型转换器? 在我们的ssm框架中,前端传递过来的参数都是字符串,在controller层接收参数的时候springmvc能够帮我们将大部分字符串类型的参数自动转换为我们指 ...
- SpringMVC 自定义类型转换器
先准备一个JavaBean(Employee) 一个Handler(SpringMVCTest) 一个converters(EmployeeConverter) 要实现的输入一个字符串转换成一个emp ...
- springmvc 类型转换器 自定义类型转换器
自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: springmvc 类型转换器 表单数据填错后返回表单页面(接上面的 ...
- springmvc:自定义类型转换器代码编写
字符串转换日期: 1.自定义一个类 /** * 字符串转换日期 */ public class StringToDateConverter implements Converter<String ...
- springmvc中如何自定义类型转换器
package com.hope.utils;import org.springframework.core.convert.converter.Converter;import org.spring ...
- 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写
mvc是基于组件的方式 类型转换的接口Converter,想实现类型转换,必须实现这个接口 Ctrl+N搜索 converter 这是一个接口类 它有很多的实现类.S是字符串.后面T是指要转换类型 新 ...
- 自定义类型转换器 及 使用 ServletAPI 对象作为方法参数
自定义类型转换器使用场景: jsp 代码: <!-- 特殊情况之:类型转换问题 --> <a href="account/deleteAccount?date=2018- ...
- 0023SpringMVC自定义类型转换器
页面录入的字符串:2019/12/05可以映射到实体的日期属性上,但是如果是录入2019-12-05就会报错400 bad request,想要以2019-12-05日期格式的方式映射到实体的日期属性 ...
随机推荐
- Matlab原型模式
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象.Matlab面向对象编程有两种类,一种是Value Class,一种是Ha ...
- HTML学习摘要1
在http://www.w3school.com.cn/ 学习前端知识,利用暑假,自主学习以拓展知识面 DAY 1 HTML 不是一种编程语言,而是一种标记语言 (markup language) 标 ...
- v8--sort 方法 源码 (2) 快速排序法
v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...
- sql 语句中关于 not in 和 null 的问题简单解析
理解这个问题,只需要记住一个逻辑: null 和任何值比较运算都返回的 false Ex: SQL01: SELECT * FROM userinfo WHERE age NOT IN() SQL01 ...
- Linux指令(文件目录类)
pwd 显示当前工作目录的绝对路径 ls [选项] [目录或是文件] 常用选项 -a 显示当前目录所有的文件和目录,包括隐藏的 -l 以列表的方式显示信息 cd [参数] (功能描述:切换到指定目录) ...
- Ubuntu安装Gitlab Runner
第一步: 添加GitLab的官方存储库: curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runne ...
- shell编程之99乘法表
#99乘法表#!/bin/bash #第一种写法 ` #`seq ` 使用反撇号括起来的(不是单引号),表示命令替换 do for j in `seq $i` #seq可以使用变量 do echo - ...
- 【笔记】MAML-模型无关元学习算法
目录 论文信息: Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networ ...
- Altium Designer常用快捷键总结
一.PCB中常用快捷键 ● R+L 输出PCB中所有网络的布线长度 ● Ctrl+左键点击 对正在布的线完成自动布线连接 ● M+G 可更改铜的形状; ● 按P+T在布线状态下,按Shift+A可直接 ...
- 互联网UV,PU,TopN统计
1. UV.PV.TopN概念 1.1 UV(unique visitor) 即独立访客数 指访问某个站点或点击某个网页的不同IP地址的人数.在同一天内,UV只记录第一次进入网站的具有独立IP的访问者 ...