我们在使用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. 2019 UCloudjava面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.UCloud等公司offer,岗位是Java后端开发,因为发展原因最终选择去了UCloud,入职一年时间了,也 ...

  2. pandas-04 多级index操作

    pandas-04 多级index操作 在pandas中可以为series和dataframe设置多个index,也就是说可以有多级index和column.这样可以对pandas的操作更加灵活. i ...

  3. ES6 新增基本数据类型Symbol

    ES6 增加了一个新的基本数据类型 symbol. 不过,和其他基本数据类型相比,它有点与众不同,因为它没有字面量的表现形式,而且创建的方式也有点奇怪,只能通过调用全局函数Symbol()来完成. l ...

  4. Linux添加硬盘创建新的逻辑卷方式

    有同仁看了上文<Linux添加硬盘扩充已有分区存储空间方式>一文后,提出疑问,现在很多云服务器本来没有逻辑卷,添加数据盘后需要自行添加,如何处理? 此文将以某云服务器为例,详细进行解说. ...

  5. Centos7搭建Harbor私有仓库(二)

    1 说明 前文Centos7搭建Harbor私有仓库(一)中成功搭建了Harbor,但,是以http方式搭建的,这里我们修改为https方式 以下基于镜像CentOS-7-x86_64-Minimal ...

  6. docker启动报错解决及分析(Cannot create container for service *******: cannot mount volume over existing file, file exists /var/lib/docker/overlay2/)

    现象: Cannot create container for service *******: cannot mount volume over existing file, file exists ...

  7. css样式设定样例说明

    <style> .classA .classB{*}; //表示设置class为classA标签下的classB标签的样式(A). .classA , .classB{*}; //表示同时 ...

  8. 查看zookeeper版本

    命令 echo stat|nc localhost 2181 zookeeper@kafka-zookeeper-0:/$ echo stat|nc localhost 2181 Zookeeper ...

  9. 构建之法——beta版本

    一.开头☀️ 这个作业属于哪个课程 课程链接 这个作业要求在哪里 要求链接 团队名称 Running Man 这个作业的目标 完成团队的Beta版本项目 二.时间任务安排☀️ 时间安排: 冲刺总时间为 ...

  10. Rendering in UE4

    Intro Thinking performance. Identify the target framerate, aim your approach on hitting that target ...