zoukankan      html  css  js  c++  java
  • 《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内部自定义的转换器。

  • 相关阅读:
    Python-内置数据结构listdictset
    Python-内置结构listsetdicttuple
    Python-内置数据结构
    Python-函数作用域和集合列表字典元祖
    Python-函数参数和文档
    Python-while循环+函数
    Python-分支循环
    Python基础
    五、Jmeter-数据库数据进行参数化
    mysql索引:四种类型,两种方法
  • 原文地址:https://www.cnblogs.com/xinhudong/p/10563495.html
Copyright © 2011-2022 走看看