《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>

 

 

三、测试

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

人已赞赏
随笔日记

甲醇汽车试点获官方力推 政策利好能否“引爆”市场?

2020-11-9 3:54:13

随笔日记

如何在 Linux 中查看可用的网络接口

2020-11-9 3:54:15

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索