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类源码数据格式:
本文来自博客园,作者:Lz_蚂蚱,转载请注明原文链接:https://www.cnblogs.com/leizia/p/15173426.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步