当前位置: 首页 > news >正文

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

转载于:https://www.cnblogs.com/xinhudong/p/10563495.html

相关文章:

  • 洛谷 P1616 疯狂的采药
  • 【BW系列】SAP 讲讲BW/4 HANA和BW on HANA的区别
  • Shell的一些基本概念
  • 剑指Offer——二叉搜索树的第K个节点
  • python 排序 桶排序
  • ubuntu之路——day7.2 regularization
  • 查看mysql数据库大小
  • Java程序员编程性能优化必备的34个小技巧
  • HTTP/1.1-HTTP/2.0-HTTP/3.0-HTTPS
  • DP总结
  • 全网最详细python3包管理工具教程-pip
  • nginx 配置简单的静态页面
  • Finer Resolution Observation and Monitoring -Global Land Cover更精细的分辨率观测和监测-全球土地覆盖...
  • boost.python编辑,以及c++api的python封装
  • 使用Docker搭建多人使用GPU服务器
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • Electron入门介绍
  • HTML5新特性总结
  • JavaScript类型识别
  • Laravel核心解读--Facades
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • ucore操作系统实验笔记 - 重新理解中断
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • XML已死 ?
  • 百度地图API标注+时间轴组件
  • 大整数乘法-表格法
  • 基于webpack 的 vue 多页架构
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端自动化解决方案
  • 使用SAX解析XML
  • 一些css基础学习笔记
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 阿里云服务器购买完整流程
  • ​Spring Boot 分片上传文件
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • # Java NIO(一)FileChannel
  • ###STL(标准模板库)
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • %check_box% in rails :coditions={:has_many , :through}
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (26)4.7 字符函数和字符串函数
  • (javascript)再说document.body.scrollTop的使用问题
  • (二)学习JVM —— 垃圾回收机制
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .net利用SQLBulkCopy进行数据库之间的大批量数据传递