SpringMVC处理json:使用HttpMessageConverter

一句话:简单到没有朋友,特别的简单

1.@ResponseBody注解

位置:方法上

作用:

  • 将Controller目标方法的返回值直接写入 HTTP response body 中,一般在异步获取数据时使用(AJAX),值得注意的是,标注@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。

首先我们要导入3个jar包,如下:
在这里插入图片描述

现在index.jsp写一个超链接

<a href="testJson" id="testJson">Test Json</a>

我们需要他返回employee成员变量,所以需要一些js代码

<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>

Controller目标方法

@ResponseBody //
@RequestMapping("/testJson")
public Collection<Employee> testJson(){
	return employeeDao.getAll();
}

结果
在这里插入图片描述

2. HttpMessageConverter的工作原理

原理图:
在这里插入图片描述
HttpMessageConverter 的实现类
在这里插入图片描述
SpringMVC默认搭载6个实现类
在这里插入图片描述
加入Json jar包后就会自动多搭载一个
在这里插入图片描述

3. 使用HttpMessageConverter

  1. HttpMessageConverter 将请求信息转化并绑定到处理方法的入参中或将响应结果转为对应类型的响应信息,Spring提供了两种途径:
  • 使用 @RequestBody / @ResponseBody 对处理方法进行标注
  • 使用 HttpEntity<T> / ResponseEntity<T> 作为处理方法的入参或返回值
  1. 当控制器处理方法使用到 @RequestBody/@ResponseBodyHttpEntity<T>/ResponseEntity<T> 时, SpringMVC首先根据请求头或响应头的Accept 属性选择匹配的 HttpMessageConverter, 进而根据参数类型或泛型类型的过滤得到匹配的HttpMessageConverter, 若找不到可用的HttpMessageConverter 将报错

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

3.1 @RequestBody / @ResponseBody示例

在这里插入图片描述

  • handle15()方法:SpringMVC根据handle15()方法的返回值类型(byte)和标注的注解@ResponseBody,会自动去匹配ByteArrayHttpMessageConverter,把我们返回的数组返回给客户端(转换后返回给客户端)
  • handle14()方法:SpringMCV根据handle14()方法入参的类型和入参标注的@RequestBody,会自动的去匹配StringHttpMessageConverter,将请求信息转换为String类型的字符串传入到目标方法(转换后传入目标方法)

文件上传代码示例:
Controller目标方法

@ResponseBody
@RequestMapping("/testHttpMessageConverter")
public String testHttpMessageConverter(@RequestBody String body){
	System.out.println(body);
	return "helloworld! " + new Date();
}

index.jsp

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

3.2 HttpEntity<T>/ResponseEntity<T>示例

文件下载代码示例:
Controller目标方法

@RequestMapping("/testResponseEntity")
public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException{
	byte [] body = null;
	ServletContext servletContext = session.getServletContext();
	InputStream in = servletContext.getResourceAsStream("/files/abc.txt");
	body = new byte[in.available()];
	in.read(body);
		
	HttpHeaders headers = new HttpHeaders();
	headers.add("Content-Disposition", "attachment;filename=abc.txt");
		
	HttpStatus statusCode = HttpStatus.OK;
		
	ResponseEntity<byte[]> response = new ResponseEntity<byte[]>(body, headers, statusCode);
	return response;
}

index.jsp

<a href="testResponseEntity">Test ResponseEntity</a>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值