8.返回Object对象<mvc:annotation-driven />说明

8.返回Object对象

目前响应格式主要使用json数据格式,对于java对象转换为json字符串,需要加入处理json的工具包依赖,springmvc默认使用jackson。在springmvc配置文件中加入注解驱动。

<mvc:annotation-driven />

添加注解驱动需要注意重名的属性

在处理器方法上添加@ResponseBody注解,处理器方法返回Object,可以转换为json输出到浏览器。

注解驱动实现的功能是完成java对象到json、xml、text、二进制等数据格式的转换。

{mvc:annotation-driven}在加入到springmvc配置文件后,会自动创建HttpMessageConverter接口的7个实现类对象(框架版本不同实现类个数有区别),包括 MappingJackson2HttpMessageConverter(使用jackson工具库中的ObjectMapper实现java对象转为json字符串)

HttpMessageConvter接口:消息转换器,作用是定义了java对象转换为json、xml等数据格式的方法,这个接口有很多实现类,这些实现类完成java对象到json,java对象到xml,java对象到二进制数据的转换。

HttpMessageConverter.class

public interface HttpMessageConverter<T> {
/*
canWrite方法和write方法是控制器类把结果输出给浏览器时使用的。
canWrite方法作用检查处理器方法的返回值var1,能不能转为var2表示的数据格式。MediaType见下面说明。
*/
boolean canWrite(Class<?> var1, @Nullable MediaType var2);
/*
write方法把处理器方法的返回值对象,调用jackson中的ObjectMapper转为json字符串。当然也可转换为其他数 据格式
如:
ObjectMapper om = new ObjectMapper();
json = om.writeValueAsString(student);
*/
void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException;
List<MediaType> getSupportedMediaTypes();
boolean canRead(Class<?> var1, @Nullable MediaType var2);
T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException;
}

MediaType.class

类中定义各种数据格式类型常量

public class MediaType extends MimeType implements Serializable {
...
public static final String APPLICATION_FORM_URLENCODED_VALUE = "application/x-www-form-urlencoded";
public static final MediaType APPLICATION_JSON = new MediaType("application", "json");
public static final String APPLICATION_JSON_VALUE = "application/json";
...

响应一个对象的处理流程说明:

/**
* 处理器方法返回一个Student对象,通过框架转为json,响应请求
* @ResponseBody:
* 作用:把处理器方法返回对象转为json后,通过HttpServletResponse输出给浏览器。
* 位置:方法的定义上面。和其它注解没有顺序的关系。
*
* 返回对象框架的处理流程:
* 1. 框架会把返回Student类型,调用框架的中ArrayList<HttpMessageConverter>中每个类的canWrite()方法
* 检查哪个HttpMessageConverter接口的实现类能处理Student类型的数据--MappingJackson2HttpMessageConverter
*
* 2.框架会调用实现类的write()方法,MappingJackson2HttpMessageConverter的write()方法
* 把李四同学的student对象转为json,调用Jackson的ObjectMapper实现转为json格式
* contentType: application/json;charset=utf-8
*
* 3.框架会调用@ResponseBody把步骤2转换后的结果数据输出到浏览器,请求处理完成。
*/
@RequestMapping(value = "/returnStudentJson.do")
@ResponseBody
public Student doStudentJsonObject(String name, Integer age) {
// 调用service,获取请求结果数据 ,Student对象表示结果数据
Student student = new Student();
student.setName("李四同学");
student.setAge(20);
// 会被框架转为json
return student;
}

响应一个String字符串的处理流程说明:

/**
* 处理器方法返回的是String,String表示数据的,不是视图。
* 区分返回值String是数据,还是视图,看有方法上没有@ResponseBody注解
* 如果有@ResponseBody注解,返回String就是数据,反之就是视图
*
* 返回对象框架的处理流程:
* 1. 框架会把返回String类型,调用框架的中ArrayList<HttpMessageConverter>中每个类的canWrite()方法
* 检查那个HttpMessageConverter接口的实现类能处理String类型的数据--StringHttpMessageConverter
*
* 2.框架会调用实现类的write()方法,StringHttpMessageConverter的write()方法
* StringHttpMessageConverter类中默认把字符按照指定的编码处理 text/plain;charset=ISO-8859-1
* 但是默认使用“text/plain;charset=ISO-8859-1”作为contentType,会导致中文有乱码
* 解决方案:给RequestMapping增加一个属性 produces, 使用这个属性指定新的contentType数据编码格式
*
* 3.框架会调用@ResponseBody把步骤2的结果数据输出到浏览器,请求处理完成
*/
@RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=utf-8")
@ResponseBody
public String doStringData(){
return "Hello SpringMVC 返回对象,表示数据,不是视图名称";
}

StringHttpMessageConverter类源码数据格式:

posted @   Lz_蚂蚱  阅读(82)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起