之前的教程, 我们都已经学会了如何使用 Spring MVC 来进行开发, 掌握了基本的开发方法, 返回不同类型的结果也有了一定的了解, 包括返回 ModelAndView, 返回 List,Map 等等, 这里就包含了传统的开发方式, 和写接口的开发方式.
传参我们也学了简单参数和复杂参数的传递和接收, 但是在参数传递过程中, 常常需要把表单中的参数映射到我们对象的属性中, 比如前台传的是 2018-01-01 字符串, 可是我们的实体类中定义的是 Date 类型的变量, 这时就需要用到 SpringMVC 的自定义类型转换器了.
一, 配置方式
如果要使用类型转换器, 我们就需要在 spring-servlet.xml 中配置, 当然配置有两种方式, 我们逐一讲解, 如下:
- <!-- 使用注解扫描机制 -->
- <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 是没有提供具体实现方法的, 需要我们自己定义自己的类型转换器来实现. 如下:
- /**
- * @ClassName: DateConvert
- * @Description: 全局日期处理类
- * @author WangJunnan
- * @date 2018 年 11 月 20 日 下午 2:25:47
- */
- public class DateConvert implements Converter<String, Date> {
- @Override
- public Date convert(String stringDate) {
- SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
- try {
- return simpleDateFormat.parse(stringDate);
- } catch (ParseException e) {
- e.printStackTrace();
- }
- return null;
- }
- }
注意: 如果不想通过 Spring 的配置 Bean 方法来实例化 Bean, 则需要在该类型转换器的类上加 @Component 注解, 目的是为了让 Spring 自动扫描该转换器到容器中.
如果不想使用注解方法, 则还需要在 spring-servlet.xml 中配置, 配置方法如下:
- <bean id="dateConvert" class="com.chinecredit.eccis.common.DateConvert"/>
- <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
- <property name="converters">
- <set>
- <ref bean="dateConvert"/>
- </set>
- </property>
- </bean>
三, 测试
Controller 类:
- @Controller
- @RequestMapping("/test")
- public class TestController {
- @RequestMapping("/add")
- @ResponseBody
- public String add(@RequestBody Student student){
- System.out.println(student);
- return "{'success':true}";
- }
- }
注意: 这里用的是 @RequestBody, 前台传递参数时, 如果使用 Ajax 的话, 则需要使用如下方法传递参数.
- $.Ajax({
- type: "POST",
- url: "${pageContext.request.contextPath}/test/add",
- data: JSON.stringify({"name":'张三',"age":20,"brithday":'2018-01-01'}),
- contentType:"application/json",
- dataType:"JSON",
- success: function(data){
- console.log(data);
- }
- });
Student 类:
- public class Student implements Serializable{
- private String name;
- private String age;
- private Date birthday;
- // 此处省略 getter,setter
- @Override
- public String toString() {
- return "Student [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
- }
- }
到此, 我们的自定义类型就完成了, 大家可以测试一下.
四, 总结
在上面我们使用的是 org.springframework.format.support.FormattingConversionServiceFactoryBean 类, 在这里其实还有另外一个类可以使用 ConversionServiceFactoryBean. 但是使用 FormattingConversionServiceFactoryBean 可以让 SpringMVC 支持 @NumberFormat 和 @DateTimeFormat 等 Spring 内部自定义的转换器.
来源: https://www.cnblogs.com/xinhudong/p/10563495.html