vlambda博客
学习文章列表

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 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring 提供了两种途径:

  • 使用 @RequestBody/@ResponseBody 对处理方法进行标注

  • 使用 HttpEntity<T>/ResponseEntity<T> 作为处理方法的入参或返回值

    • @RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容(json数据)转换为java对象并绑定到Controller方法的参数上。
    • @ResponseBody注解用于将Controller的方法返回的对象,通过springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端
    • 当控制器处理方法使用到 @RequestBody/@ResponseBodyHttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错

    • @RequestBody@ResponseBody 不需要成对出现

这里都要配置注解驱动。<mvc:annotation-driven/>

往期回顾


 



 

  

Coding dance