SpringMVC 学习笔记(七) JSON返回:HttpMessageConverter作用

1.1. 返回JSON

在POM.XML:

<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.1.4</version>
		</dependency>

在方法上面添加@ResponseBody注解

1.2. HttpMessageConverter

HttpMessageConverter<T> 是 Spring3.0 新添加的一个接口,负责将请求信息转换为一个对象(类型为 T),将对象(类型为 T)输出为响应信息

public interface HttpMessageConverter<T> {

	/**
	 * 指定转换器可以读取的对象类型,
     * 即转换器是否可将请求信息转换为 clazz 类型的对象,
     * 同时指定支持 MIME 类型(text/html,applaiction/json等)
	 */
	boolean canRead(Class<?> clazz, MediaType mediaType);

	/**
	 * 指定转换器是否可将 clazz 类型的对象写到响应流中,
     * 响应流支持的媒体类型
     * 在MediaType 中定义。
	 */
	boolean canWrite(Class<?> clazz, MediaType mediaType);

	/**
	 * 该转换器支持的媒体类型。
     */
	List<MediaType> getSupportedMediaTypes();

	/**
	 * 将请求信息流转换为 T 类型的对象。
	 */
	T read(Class<? extends T> clazz, HttpInputMessage inputMessage)
			throws IOException, HttpMessageNotReadableException;

	/**
	 * 将T类型的对象写到响应流中,同时指定相应的媒体类型为 contentType
	 */
	void write(T t, MediaType contentType, HttpOutputMessage outputMessage)
			throws IOException, HttpMessageNotWritableException;

}

1.2.1. HttpMessageConverter<T> 的实现类

1.2.2. 处理流程

DispatcherServlet 默认装配RequestMappingHandlerAdapter ,

而RequestMappingHandlerAdapter 默认装配如下HttpMessageConverter:

当加入jsckson 包后,RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:

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

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

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

当控制器处理方法使用到@RequestBody/@ResponseBody

或HttpEntity<T>/ResponseEntity<T> 时, Spring 首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的 HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错

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

1.2.3. @RequestBody和@ResponseBody示例

	@ResponseBody
	@RequestMapping("/responseBody")
	public byte[] responseBody(HttpSession session) throws IOException {
		ServletContext servletContext = session.getServletContext();
		InputStream in = servletContext.getResourceAsStream("/WEB-INF/files/download.txt");
		byte[] fileData = FileCopyUtils.copyToByteArray(in);
		return fileData;
	}

	@RequestMapping("/requestBody")
	public String requestBody(@RequestBody String body){
		System.out.println(body);
		return "helloworld";
	}

JSP:

<form action="requestBody" method="POST" enctype="multipart/form-data">
	File: <input type="file" name="file"/>
	Desc: <input type="text" name="desc"/>
	<input type="submit" value="Submit"/>
</form>
<br>
<br>
<a href="responseBody"> responseBody </a>
<br>
<br>

1.2.4. HttpEntity和ResponseEntity 示例

	@RequestMapping("/httpEntity")
	public String httpEntity(HttpEntity<String> entity){
		System.out.println(entity.getHeaders().getContentLength());
		return "helloworld";
	}

	@RequestMapping("/download")
	public ResponseEntity<byte[]> responseEntity(HttpSession session) throws IOException{
		byte [] body = null;
		ServletContext servletContext = session.getServletContext();
		InputStream in = servletContext.getResourceAsStream("/WEB-INF/files/download.txt");
		body = new byte[in.available()];
		in.read(body);

		HttpHeaders headers = new HttpHeaders();
		headers.add("Content-Disposition", "attachment;filename=download.txt");

		HttpStatus statusCode = HttpStatus.OK;

		ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
		return response;
	}
JSP:
<br>
<a href="download"> download </a>
<br>
<br>
<a href="httpEntity"> httpEntity </a>
<br>
<br>
时间: 2024-08-29 16:53:09

SpringMVC 学习笔记(七) JSON返回:HttpMessageConverter作用的相关文章

springmvc学习笔记(18)-json数据交互

springmvc学习笔记(18)-json数据交互 springmvc学习笔记18-json数据交互 springmvc进行json交互 环境准备 添加json转换的依赖 配置json转换器 json交互测试 输入json串输出是json串 输入keyvalue输出是json串 本文主要介绍如何在springmvc中进行json数据的交互,先是环境准备和配置,然后分别展示了"输入json串,输出是json串"和"输入key/value,输出是json串"两种情况下

SpringMVC学习笔记七:SpringMVC的数据验证

SpringMVC支持JSR(Java Specification Requests, Java规范提案)303-Bean Validation数据验证规范,该规范的实现者很多,其中较常用的是 Hibernate Validator 需要加入的包pom.xml <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-validator --> <dependency> <groupId>org.hi

SpringMVC学习笔记七:SpringMVC统一异常处理

发现有位前辈写得比我从书上看到的还详细,我就不写了,前辈的博文地址如下:  http://blog.csdn.net/eson_15/article/details/51731567

springMVC学习笔记汇总(持续更新)

SpringMVC 学习笔记(一) Hello World SpringMVC 学习笔记(二) @RequestMapping.@PathVariable等注解 SpringMVC 学习笔记(三) 使用ServletAPI 和 实体 做为参数 SpringMVC 学习笔记(四) 处理模型数据 SpringMVC 学习笔记(五) 基于RESTful的CRUD SpringMVC 学习笔记(六) 数据绑定和JSR校验 SpringMVC 学习笔记(七) JSON返回:HttpMessageConve

【Spring学习笔记-MVC-4】返回Json数据-方式2

摘要 本文讲解另外一种利用spring MVC返回json数据的方法. 前文回顾 在<[Spring学习笔记-MVC-3]返回Json数据-方式1>中介绍了通过: @ResponseBody声明返回值: 配置<mvc:annotation-driven />: 来返回json数据.效果如下:   ==>, 从上面的效果看,只能返回一个对象,不能返回多个对象,不能做到形如下图的返回结果, 存在局限性(可能可以返回多个,自己不知道如何实现). 下面介绍的方式2,利用spring

SpringMVC学习笔记(二): 日常使用功能

前提: 1.web.xml 和spring-mvc核心配置如:SpringMVC学习笔记(一): 基础知识中注解实现. 2.类的@RequestMapping(value="/annotationController") 3.spring-mvc 推荐使用注解实现. 一.数据的接收 (一)URL参数数据的接收 1.使用 HttpServletRequest 获取参数 <span style="font-size:18px;"><span style

史上最全的SpringMVC学习笔记

SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet> <servlet-name>springmvc</servlet

springmvc学习笔记(9)-springmvc整合mybatis之controller

springmvc学习笔记(9)-springmvc整合mybatis之controller springmvc学习笔记9-springmvc整合mybatis之controller springmvcxml 配置webxml 编写Controller就是Handler 编写jsp 本文介绍如何配置springmvc配置文件和web.xml,以及如何编写controller,jsp springmvc.xml 在resources/spring文件下下创建springmvc.xml文件,配置处理

springmvc学习笔记--REST API的异常处理

前言: 最近使用springmvc写了不少rest api, 觉得真是一个好框架. 之前描述的几篇关于rest api的文章, 其实还是不够完善. 比如当遇到参数缺失, 类型不匹配的情况时, 直接抛出异常, 返回的内容是500+的错误页面, 而不是json内容, 这让移动端的调用方很难处理. 本文主要讲述对于rest api, springmvc对异常的解决处理方案. 系列整理: springmvc学习笔记系列的文章目录: • idea创建springmvc项目 • 面向移动端的REST API