Web时代-Spring MVC 数据操作
Part1SpringMVC类型转换器:
前端传入的值,从表单中传入的值,都是字符串或者是字符串数组的形式传入的,在后端需要进行手动的转换类型,然后才能正确的使用。框架一般对常见的数据类型的转换进行了封装提供,如字符串转换成数字等。我们使用的SpringMVC就是提供了一些内置的转换器。我们先来看下都有哪些类型转换器。
名称 | 说明 |
---|---|
ObjectToStringConverter | java.lang.Boolean -> java.lang.String |
CharacterToNumberFactory | java.lang.Character ->java.lang.Number |
ObjectToStringConverter | java.lang.Character -> java.lang.String |
EnumToStringConverter | java.lang.Enum -> java.lang.String |
NumberToCharacterConverter | java.lang.Number ->java.lang.Character |
NumberToNumberConverterFactory | java.lang.Number ->java.lang.Number |
ObjectToStringConverter | java.lang.Number -> java.lang.String |
StringToBooleanConverter | java.lang.String -> java.lang.Boolean |
StringToCharacterConverter | java.lang.String -> java.lang.Character |
StringToEnumConverterFactory | java.lang.String -> java.lang.Enum |
StringToNumberConverterFactory | java.lang.String -> java.lang.Number |
StringToLocaleConverter | java.lang.String -> java.util.Locale |
StringToPropertiesConverter | java.lang.String -> java.util.Properties |
StringToUUIDConverter | java.lang.String -> java.util.UUID |
ObjectToStringConverter | java.util.Locale -> java.lang.String |
PropertiesToStringConverter | java.util.Properties -> java.lang.String |
同样还包含一些集合类型的转换器,这里我就不列举了,可以在源码中 core目录下org.springframework.core.convert
内去查看。
自定义类型转换器
-
ConversionService 是 Spring 类型转换体系的核心接口。 -
可以利用 ConversionServiceFactoryBean 在 Spring 的 IOC 容器中定义一个 ConversionService. Spring 将自动识别出 IOC 容器中的 ConversionService,并在 Bean 属性配置及Spring MVC 处理方法入参绑定等场合使用它 进行数据的转换 -
可通过 ConversionServiceFactoryBean 的 converters 属性 注册自定义的类型转换器
spring支持的类型转换器
Spring 定义了 3 种类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactroyBean 中:
-
Converter<S,T>:将 S 类型对象转为 T 类型对象 -
ConverterFactory:将相同系列多个 “同质” Converter 封装在一 起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类 (Integer、Long、Double 等)对象)可使用该转换器工厂类 -
GenericConverter:会根据源类对象及目标类对象所在的宿主类 中的上下文信息进行类型转换
我们来看下类型转换的使用:
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!-- 配置conversionService -->
<beans:bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<beans:property name="converters">
<beans:set>
<beans:ref bean="userConverter"/>
</beans:set>
</beans:property>
</beans:bean>
编写转换器:
@Component
public class UserConverter implements Converter<String, User> {
@Override
public User convert(String src) {
if(src !=null){
String[] vals= src.split("-");
if(vals !=null && vals.length ==3){
Integer id =Integer.parseInt(vals[0]);
String username =vals[1];
String password =vals[2];
User user =new User();
user.setId(id);
user.setUsername(username);
user.setPassword(password);
return user;
}
}
return null;
}
}
使用
@RequestMapping("/testConverter")
public String testConverter(@RequestParam("user") User user){
System.out.println(user);
return "result";
}
但是我们一般不会直接使用上面的类型转换器进行操作。
配置项:<mvc:annotion-drivern/>
<mvc:annotation-driven />
会自动注册RequestMappingHandlerMapping,RequestMappingHandlerAdapter 与ExceptionHandlerExceptionResolver 三个bean。还提供了以下支持:
支持ConversionService实例对表单参数的进行类型转换 支持使用@NumberFormat,@DatimeFormat注解完成类型格式化 支持使用@Valid注解进行javaBean的的验证 支持使用@RequestBoay和@ResponseBody注解
Part2SpringMVC数据格式化:
对属性对象的输入/输出进行格式化,从其本质上讲依然 属于 “类型转换” 的范畴。Spring 在格式化模块中定义了一个实现
ConversionService
接口的FormattingConversionService 实现类,该实现类扩展 了GenericConversionService
,因此它既具有类型转换的功能,又具有格式化的功能
FormattingConversionService 拥有一个 FormattingConversionServiceFactroyBean 工厂类,后者用于在 Spring 上下文中构造前者。
-
FormattingConversionServiceFactroyBean 内部已经注册
-
NumberFormatAnnotationFormatterFactroy:支持对数字类型的属性使用 @NumberFormat 注解 -
JodaDateTimeFormatAnnotationFormatterFactroy:支持对日期类的属性使用 @DateTimeFormat 注解 ; -
装配了 FormattingConversionServiceFactroyBean 后,就可 以在 Spring MVC 入参绑定及模型数据输出时使用注解驱动了。
<mvc:annotation-driven/>
默认创建的ConversionService 实例即为 FormattingConversionServiceFactroyBean
1处理日期格式
<!-- 配置Conveter转换器,转换的工厂,可以转换(日期) -->
<bean id="ConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<!-- 配置多个转换器 在list标签下可以提供多个bean -->
<property name="converters">
<list>
<bean class="com.leo.spring.util.DateConveter"></bean>
</list>
</property>
</bean>
java配置代码
/**
* 转换日期
* S:页面传过来的s类型
* T:转换后的类型
* @author leoi555
*
*/
public class DateConveter implements Converter<String, Date> {
@Override
public Date convert(String arg0) {
// TODO Auto-generated method stub
if (null !=arg0) {
DateFormat dFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return dFormat.parse(arg0);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
}
使用注解
支持对日期类的属性使用 @DateTimeFormat
注解 ;
可以对pattern 属性:类型为字符串。指定解析/格式化字段数据的模式 需要配置<mvc:annotation-driven/>
// 将入参格式为date形式
@DateTimeFormat(pattern="yyyy-MM-dd")
// 将数据库中返回的数据格式化为指定的格式
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
private Date birthday;
2处理数字格式
@NumberFormat
可对类似数字类型的属性进行标 注,它拥有两个互斥的属性:
-
style:类型为 NumberFormat.Style。用于指定样式类 型,包括三种:Style.NUMBER(正常数字类型)、 Style.CURRENCY(货币类型)、 Style.PERCENT( 百分数类型) -
pattern:类型为 String,自定义样式, 如patter="#,###";
@NumberFormat(pattern="#,###")
private Integer salary;
3SpringMVC处理json数据:
1.加入jar包:jackson-annotations(core,databind)-2.2.2.jar;
2.编写目标方法使其返回json:
3.在方法上添加 @ResponseBody注解使用的是HttpMessageConverter
;
HttpMessageConverter<T>
接口定义的方法:
-
Boolean canRead(Class<?> clazz,MediaType mediaType):
指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json等) -
Boolean canWrite(Class<?> clazz,MediaType mediaType):
指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在MediaType 中定义。 -
LIst<MediaType> getSupportMediaTypes():
该转换器支持的媒体类型。 -
T read(Class<? extends T> clazz,HttpInputMessage inputMessage):
将请求信息流转换为 T 类型的对象。 -
void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage)
:将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
使用 HttpMessageConverter
-
使用
@RequestBody/@ResponseBody
对处理方法进行标注 -
使用
HttpEntity<T>/ResponseEntity<T>
作为处理方法的入参或返回值 -
@RequestBody
注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。 -
@ResponseBody
注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端 -
当控制器处理方法使用到
@RequestBody/@ResponseBody
或HttpEntity<T>/ResponseEntity<T>
时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错 -
@RequestBody
和@ResponseBody
不需要成对出现
这里都要配置注解驱动。<mvc:annotation-driven/>
往期回顾