专栏首页王二麻子IT技术交流园地《SpringMVC从入门到放肆》十二、SpringMVC自定义类型转换器

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

之前的教程,我们都已经学会了如何使用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>
<mvc:annotation-driven conversion-service="conversionService"/>

三、测试

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内部自定义的转换器。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 《项目架构那点儿事》——浅析web层struts2的构建

    【前言】所谓快速开发,实质上为了节省项目的开支成本,减少程序员的开发时 间,固然就形成了种种二次封装的框架,也就是造轮子,然后我们的程序就按照这个轮子去画瓢,这...

    I Tech You_我教你
  • 《项目架构那点儿事》——Hibernate泛型Dao,让持久层简洁起来

    【前言】hibernate作为持久层ORM技术,它对JDBC进行非常轻量级对象封装,使得我们可以随心所欲的使用面向对象的思想来操作数据 库。同时,作为后台开发的...

    I Tech You_我教你
  • 《SpringMVC从入门到放肆》六、SpringMVC开发Controller的方法总结

    到目前为止我们已经大概学习了StringMVC的执行流程,以及详细的处理器映射器和处理器适配器的执行流程,并可以自己写一个配置方式开发的小Demo了。今天我们来...

    I Tech You_我教你
  • 【java开发系列】—— 嵌套类与内部类

    嵌套类与内部类在java中使用的很广泛,为了避免难以理解,这里用了几个小例子,说明它的用法。   嵌套类与内部类的结构如下图 ?   静态嵌套类     ...

    用户1154259
  • Java描述设计模式(02):简单工厂模式

    1)、OCP原则:软件实体,如类、模块和函数,应当对扩展开放,但对修改关闭。 2)、违反设计模式的OCP原则,新增食品类不方便扩展,代码改动较大。

    知了一笑
  • 自定义参数解析器

    开发中,app端给服务端会传基础参数、其他参数,一般基础参数app端都会传给服务端,其他参数则是根据不同接口传不同参数。若以表单的形式提交的数据:

    LiosWong
  • 九、委派模式与模板模式详解

    委派模式(Delegate Pattern ) 又叫委托模式, 是一种面向对象的设计模式, 允许对象组合实现与 继承相同的代码重用。它的基本作用就是负责任务的...

    编程之心
  • 全文搜索实战1-简单网页抓取及搜索

    es是基于docker安装,鉴于当前springboot对应的是7.6.2,为保持一致也安装该版本:

    技术路漫漫
  • 08 Spring框架 AOP (一)

    首先我们先来介绍一下AOP: AOP(Aspect Orient Programming),面向切面编程,是面向对象编程OOP的一种补充。面向对象编程是从静态...

    MindMrWang
  • 【小家Spring】Spring贡献的多个注解相关的工具类:AnnotationUtils、AnnotatedElementUtils、AnnotationConfigUtils...

    本文主要聊聊Spring提供的多个关于注解相关的工具类:AnnotationUtils和AnnotatedElementUtils等等 因为很多逻辑都封装在了...

    YourBatman

扫码关注云+社区

领取腾讯云代金券