SpringMVC:学习笔记(6)——转换器和格式化
转换器和格式化
说明
SpringMVC的数据绑定并非没有限制,有案例表明,在SpringMVC如何正确绑定数据方面是杂乱无章的,比如在处理日期映射到Date对象上。
为了能够让SpringMVC进行正确地数据绑定,我们需要用到Converter和Formatter来协助SpringMVC完成。
举例:
我们知道HTTP表单中的所有请求参数都是String类型的,而且日期时间数据没有特定的形式1997-3-20,1997:03:20乃至20/03/1997对于我们人来说都是正确的形式都应该可以映射到Date对象上,但对于计算机来说都是陌生的,我们就要构建一种桥梁,来让计算机正确绑定数据。
Converter和Formatter都可以用于将一种对象类型转换成另一种对象类型。
区别:
Converter是通用元件,可以在应用程序的任意层使用。
Formatter是专用元件,专门为Web层设计。
Converter
说明
Converter转换器可以进行格式转换,这是一种通用的元件。下面我们要实现的效果是:

按照图示所示的日期格式让SpringMVC可以识别并转换成Date对象。
编写Converter步骤:
1.编写一个实现了org.springframework.core.convert.converter.Converter接口的Java类。

public class MyConverter implements Converter<String,Date> {
//<源类型,目标类型>
private String dataPattern;
public MyConverter(String dataPattern)
{
this.dataPattern=dataPattern;
System.out.println("DataPattern is"+dataPattern);
}
public Date convert(String s) {
try {
SimpleDateFormat simpleDateFormat= new SimpleDateFormat(dataPattern);
simpleDateFormat.setLenient(false);
//设置日期/时间的解析是否不严格,为false表示严格
return simpleDateFormat.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
2.在SpringMVC的配置文件中编写一个ConversionService bean.
说明:
Bean的类名称必须是org.springframework.context.support.ConversionServiceFactoryBean.
这个Bean必须包含一个converters属性,它将列出在应用程序中用到的所有定制Converter.
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converter.MyConverter">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy"/>
</bean>
</list>
</property>
</bean>
3.要给annotation-driven元素的conversion-service属性赋bean名称
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
">
<context:component-scan base-package="controller"/>
<context:component-scan base-package="Service"/>
<!--
<mvc:annotation-driven>元素注册用于支持基于注解的控制器的请求处理方法的Bean对象。
详解:https://my.oschina.net/HeliosFly/blog/205343
-->
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean> <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="converter.MyConverter">
<constructor-arg type="java.lang.String" value="MM-dd-yyyy"/>
</bean>
</list>
</property>
</bean>
</beans>
其余代码
1.编写控制器
package controller; import domain.Employee;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping; /**
* Created by zy on 17-3-3.
*/
@Controller
public class EmployeeController {
private static final Log logger = LogFactory.getLog(EmployeeController.class); @RequestMapping("employ_input")
public String inputEmployee(Model model)
{
model.addAttribute("employee",new Employee());
return "EmployeeForm";
}
@RequestMapping("employ_save")
public String saveEmployee(@ModelAttribute Employee employee,BindingResult bindingResult,Model model)
{
if(bindingResult.hasErrors())
{
FieldError fieldError = bindingResult.getFieldError();
logger.info("Code:" +fieldError.getCode()+",field"+fieldError.getField());
return "EmployeeForm";
}
model.addAttribute("employee",employee);
return "EmployeeForm";
}
}
2.编写视图
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EmployeeInput</title>
</head>
<body>
<form:form commandName="employee" action="employ_save" method="post">
<legend>Add Employee</legend>
<p>
<label for="firstName">姓</label>
<form:input path="firstName" tabindex="1"/>
</p>
<p>
<label for="lastName">名</label>
<form:input path="lastName" tabindex="2"/>
</p>
<p>
<form:errors path="birthDate" cssClass="error"/>
</p>
<p>
<label for="birthDate">出生日期</label>
<form:input path="birthDate" tabindex="3"/>
</p>
<p>
<input type="submit" value="Add Employee">
</p>
</form:form>
</body>
</html>
Formatter
说明
Formatter就像Converter一样,也是将一种类型转换成另外一种类型。但是,Formatter的源类型必须是String,而Converter则适用于任意的源类型。
Formatter更适合在Web层使用,处理表单输入,始终应该选择Formatter,而不是Converter。
编写Formatter
1.编写一个实现了org.springframework.format.Formatter接口的Java类。

2.在SpringMVC的配置文件中编写一个ConversionService bean.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
">
<context:component-scan base-package="controller"/>
<context:component-scan base-package="Service"/>
<!--
<mvc:annotation-driven>元素注册用于支持基于注解的控制器的请求处理方法的Bean对象。
详解:https://my.oschina.net/HeliosFly/blog/205343
-->
<mvc:annotation-driven conversion-service="conversionService"/> <bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--需要配置此项来扫描Formatter-->
<context:component-scan base-package="formatter"/>
<bean id="formatterConversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="formatters">
<set>
<bean class="formatter.DateFormatter">
<constructor-arg type="java.lang.String"
value="MM-dd-yyyy"/>
</bean>
</set>
</property>
</bean>
</beans>
选择Converter还是Formatter
在SpringMVC应用程序中当然是Formatter更合适~\(≧▽≦)/~啦啦啦
SpringMVC:学习笔记(6)——转换器和格式化的更多相关文章
- springmvc学习笔记(简介及使用)
springmvc学习笔记(简介及使用) 工作之余, 回顾了一下springmvc的相关内容, 这次也为后面复习什么的做个标记, 也希望能与大家交流学习, 通过回帖留言等方式表达自己的观点或学习心得. ...
- SpringMVC学习笔记之二(SpringMVC高级参数绑定)
一.高级参数绑定 1.1 绑定数组 需求:在商品列表页面选中多个商品,然后删除. 需求分析:功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按钮把商品id传递给Cont ...
- springmvc学习笔记(18)-json数据交互
springmvc学习笔记(18)-json数据交互 标签: springmvc springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 加入json转换的依赖 ...
- 史上最全的SpringMVC学习笔记
SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于Spring ...
- springmvc学习笔记--REST API的异常处理
前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出 ...
- springmvc学习笔记---面向移动端支持REST API
前言: springmvc对注解的支持非常灵活和飘逸, 也得web编程少了以往很大一坨配置项. 另一方面移动互联网的到来, 使得REST API变得流行, 甚至成为主流. 因此我们来关注下spring ...
- SpringMVC:学习笔记(8)——文件上传
SpringMVC--文件上传 说明: 文件上传的途径 文件上传主要有两种方式: 1.使用Apache Commons FileUpload元件. 2.利用Servlet3.0及其更高版本的内置支持. ...
- springmvc学习笔记(常用注解)
springmvc学习笔记(常用注解) 1. @Controller @Controller注解用于表示一个类的实例是页面控制器(后面都将称为控制器). 使用@Controller注解定义的控制器有如 ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
随机推荐
- Java对象类型的判断
instanceof 判断某个对象是否是某个类的实例或者某个类的子类的实例.它的判断方式大概是这样的: public<T> boolean function(Object obj, Cla ...
- oracle中查看sql语句的执行计划
1.在pl/sql中打开cmd命令容器 2.在cmd命令窗口中输入:explain plan for select * from t; 3.查看sql语句的执行计划:select * from tab ...
- ToString(string format)输出格式简述
ToString说明 ToString 是 .NET Framework 中主要的格式化方法.它将对象转换为其字符串表现形式,使它适合于显示.(有关对 .NET Framework 中的格式设置支持的 ...
- 算法之动态规划(最长递增子序列——LIS)
最长递增子序列是动态规划中最经典的问题之一,我们从讨论这个问题开始,循序渐进的了解动态规划的相关知识要点. 在一个已知的序列 {a1, a 2,...an}中,取出若干数组成新的序列{ai1, ai ...
- apple touch icon 大小总结
<!-- For Chrome for Android: --> <link rel="icon" sizes="192x192" href= ...
- Android 混淆完全解析
1.http://blog.csdn.net/jddkdd2/article/details/8858909
- c++标准库之thread
class thread是对线程的抽象.以下分别介绍thread是如何表示线程的大部分特征的. 执行体 线程的执行体由一个可执行(callable)对象来表示.这个执行体可以在thread创建的时候指 ...
- jdbc 中 excute executeUpdate的用法作用
Statement 接口提供了三种执行 SQL 语句的方法:executeQuery.executeUpdate 和 execute.使用哪一个方法由 SQL 语句所产生的内容决定. 方法execut ...
- python 集合set remove update add
1. 集合(set):把不同的元素组成一起形成集合,是python基本的数据类型. 集合对象是一组无序排列hashable value:集合成员可以做字典的键. 集合就像是 list 和 dict 的 ...
- 升级Ubuntu
最近需要升级Ubuntu,所以查了这方面的资料,做点小记: 1.apt-get update 与 apt-get ugrade 其实这个和Ubuntu升级没关系,这是升级安装包相关的命令,apt-ge ...