我们在使用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自定义类型转换器的更多相关文章

  1. 《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

    之前的教程,我们都已经学会了如何使用Spring MVC来进行开发,掌握了基本的开发方法,返回不同类型的结果也有了一定的了解,包括返回ModelAndView.返回List.Map等等,这里就包含了传 ...

  2. springmvc——自定义类型转换器

    一.什么是springmvc类型转换器? 在我们的ssm框架中,前端传递过来的参数都是字符串,在controller层接收参数的时候springmvc能够帮我们将大部分字符串类型的参数自动转换为我们指 ...

  3. SpringMVC 自定义类型转换器

    先准备一个JavaBean(Employee) 一个Handler(SpringMVCTest) 一个converters(EmployeeConverter) 要实现的输入一个字符串转换成一个emp ...

  4. springmvc 类型转换器 自定义类型转换器

    自定义类型转换器的步骤: 1.定义类型转换器 2.类型转换器的注册(在springmvc配置文件处理) 来解决多种日期格式的问题: springmvc 类型转换器 表单数据填错后返回表单页面(接上面的 ...

  5. springmvc:自定义类型转换器代码编写

    字符串转换日期: 1.自定义一个类 /** * 字符串转换日期 */ public class StringToDateConverter implements Converter<String ...

  6. springmvc中如何自定义类型转换器

    package com.hope.utils;import org.springframework.core.convert.converter.Converter;import org.spring ...

  7. 阶段3 3.SpringMVC·_02.参数绑定及自定义类型转换_6 自定义类型转换器代码编写

    mvc是基于组件的方式 类型转换的接口Converter,想实现类型转换,必须实现这个接口 Ctrl+N搜索 converter 这是一个接口类 它有很多的实现类.S是字符串.后面T是指要转换类型 新 ...

  8. 自定义类型转换器 及 使用 ServletAPI 对象作为方法参数

    自定义类型转换器使用场景: jsp 代码:  <!-- 特殊情况之:类型转换问题 --> <a href="account/deleteAccount?date=2018- ...

  9. 0023SpringMVC自定义类型转换器

    页面录入的字符串:2019/12/05可以映射到实体的日期属性上,但是如果是录入2019-12-05就会报错400 bad request,想要以2019-12-05日期格式的方式映射到实体的日期属性 ...

随机推荐

  1. python中的{字典}

    目录 字典--dict { } 字典是无序,可变的数据类型. 字典:用于存储数据,存储大量数据,字典要比列表快:将数据和数据之间进行关联. 定义: dic = {键:值,键:值} #每个 键值对 以逗 ...

  2. 【面试突击】-SpringBoot面试题(一)

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  3. jquery DataTable默认显示指定页

    原文:https://blog.csdn.net/zimuxin/article/details/83304819 主要添加iDisplayStart和iDisplayLength参数即可 $('#t ...

  4. CSS 之 圣杯布局&双飞翼布局

    圣杯布局 和 双飞翼布局 是重要布局方式.两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局. 遵循了以下要点: 两侧宽度固定,中间宽度自适应 中间部分在DOM结构上优先,以便先行 ...

  5. iOS音频播放 (五):AudioQueue

    码农人生 ChengYin's coding life 主页 Blog 分类 Categories 归档 Archives 关于 About Weibo GitHub RSS Where there ...

  6. windows环境下安装mysql5.7.20

    配置my.ini文件 [client] port=3306 default-character-set=utf8 [mysqld] # 设置为自己MYSQL的安装目录 basedir=D:\Progr ...

  7. js的insertRow和insertCell用法

    js的insertRow(-1)和insertCell(-1) 增加最后一行和增加最后一列 js的insertRow(5)和insertCell(5) 第5行后增加一行和增加第5列后增加一列

  8. 如何寻找sql注入漏洞?

    1.sql注入是怎么产生的 2.如何寻找sql注入漏洞 在地址栏输入单双引号造成sql执行异常(get) post请求,在标题后输入单引号,造成sql执行异常.

  9. 调整DataTable的列顺序

    地址:https://www.cnblogs.com/gaocong/p/6490159.html 标题:DataTable 修改列名 删除列 调整列顺序 DataTable myDt =dt; // ...

  10. 代码优化 - 求数组中的第 K 个最大元素

    题目要求: 解法一: 直接用 sort 从大到小排序,取第 k 个 var findKthLargest = function (nums, k) { nums.sort((a, b) => { ...