8.处理JSON

返回 JSON

加入 jar 包
jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
编写目标方法,使其返回 JSON 对应的对象或集合

@ResponseBody //SpringMVC 对 对 JSON  的支持
@RequestMapping("/testJSON")
public Collection<Employee> testJSON(){
	return employeeDao.getAll();
}

增加页面代码:index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script type="text/javascript" src="scripts/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
	$(function(){
		$("#testJSON").click(function(){
			var url = this.href ;
			var args = {};
			$.post(url,args,function(data){
				for(var i=0; i<data.length; i++){
					var id = data[i].id;
					var lastName = data[i].lastName ;
					alert(id+" - " + lastName);
				}
			});
			return false ;
		});
	});
</script>
</head>
<body>
	<a href="empList">To Employee List</a>
	<br><br>
	<a id="testJSON" href="testJSON">testJSON</a>
</body>
</html>
HttpMessageConverter原理
HttpMessageConverter

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

  • Boolean canRead(Class<?> clazz,MediaType mediaType): 指定转换器可以读取的对象类型,即转换器是否可将请求信息转换为 clazz 类型的对象,同时指定支持 MIME 类型(text/html,applaiction/json 等)
  • Boolean canWrite(Class<?> clazz,MediaType mediaType):指定转换器是否可将 clazz 类型的对象写到响应流中,响应流支持的媒体类型在 MediaType 中定义。
  • List getSupportMediaTypes():该转换器支持的媒体类型。
  • T read(Class<? extends T> clazz,HttpInputMessage inputMessage):将请求信息流转换为 T 类型的对象。
  • void write(T t,MediaType contnetType,HttpOutputMessgae outputMessage):将 T 类型的对象写到响应流中,同时指定相应的媒体类型为 contentType。
    在这里插入图片描述
    在这里插入图片描述

DispatcherServlet 默认装配 RequestMappingHandlerAdapter ,而 RequestMappingHandlerAdapter 默认装配如下 HttpMessageConverter:
在这里插入图片描述

加入 jackson jar 包后, RequestMappingHandlerAdapter装配的 HttpMessageConverter 如下:
在这里插入图片描述

默认情况下数组长度是 6 个;增加了 jackson 的包,后多一个MappingJackson2HttpMessageConverter

使用 HttpMessageConverter

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

  • 使用 @RequestBody / @ResponseBody 对处理方法进行标注
  • 使用 HttpEntity / ResponseEntity 作为处理方法的入参或返回值

当控制器处理方法使用到 @RequestBody/@ResponseBody 或HttpEntity/ResponseEntity 时, Spring 的 首先根据请求头或响应头的 Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的 HttpMessageConverter 将报错
@RequestBody 和 和 @ResponseBody 不需要成对出现
Content-Disposition:attachment; filename=abc.pdf
在这里插入图片描述

@RequestBody @ResponseBody

<form action="testHttpMessageConverter" method="post" enctype="multipart/form-data">
	文件: <input type="file" name="file"/><br><br>
	描述: <input type="text" name="desc"/><br><br>
	<input type="submit" value="提交"/>
</form>
@ResponseBody // @ResponseBody:是将内容或对象作为 Http 响应正文返回
@RequestMapping("/testHttpMessageConverter")
// @RequestBody:是将 Http 请求正文插入方法中,修饰目标方法的入参
public String testHttpMessageConverter(@RequestBody String body){
	System.out.println("body="+body);
	return "Hello," + new Date(); //不再查找跳转的页面
}

HttpEntity ResponseEntity
在这里插入图片描述

/files/abc.txt 准备一个下载的文件

<a href="testResponseEntity">abc.txt</a>
@RequestMapping("testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
	ServletContext servletContext = session.getServletContext();
	InputStream resourceAsStream = servletContext.getResourceAsStream("/files/abc.txt");
	byte[] body = new byte[resourceAsStream.available()] ;
	resourceAsStream.read(body);
	MultiValueMap<String, String> headers = new HttpHeaders();
	headers.add("Content-Disposition", "attachment;filename=abc.txt");
	HttpStatus statusCode = HttpStatus.OK;
	ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(body, headers, statusCode);
	return responseEntity ;
}
  • 21
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我超爱写bug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值