SpringMVC返回JSON数据格式及HttpMessageConverter介绍

2022-08-02,,,,

一. 返回JSON数据格式

现在的开发中,几乎都是前后端分离的形式,越来越多的请求使用Ajax的异步请求,而不再是传统的跳转,使用Ajax异步请求之后,我们后端处理结果大多以JSON的形式进行响应,响应给前端,前端得到响应结果后,进行处理和渲染。在SpringMVC中,使用JSON非常的简单,SpringMVC中可以将集合等数据自动的转换成JSON数据格式,当然我们需要加入JSON相关的jar包。

jackson-annotations-2.1.5.jar

jackson-core-2.1.5.jar

jackson-databind-2.1.5.jar

范例:

前端发送Ajax异步请求:

$(function(){
	$("#sendAjax").click(function(){
		var url = "${pageContext.request.contextPath}/testJson";
		$.post(url,function(data){
			console.log(data);
		});
		

		return false;
	});

});

请求处理器的目标方法:

@ResponseBody //表示将请求处理器目标方法的返回值,作为响应结果,响应到页面
	@RequestMapping("/testJson")
	public List<Emp> selectEmp(){
		return empManagerSerivce.selectEmp();
	}

使用了@ResponseBody后,SpringMVC会自动的将响应到前端的数据转换成JSON格式。

二. HttpMessageConverter原理

HttpMessageConverter是Spring3.0之后添加的一个新的接口,负责将请求信息转换成一个对象,也负责将一个对象转换为响应信息。

流程:

三. HttpMessageConverter的使用

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

  2. 我们的@RequestBody/@ResponseBody 或HttpEntity/ResponseEntity不需要成对出现。

  3. @RequestBody 和 目标方法入参为HttpEntity 效果一样,@ResponseBody 和目标方法返回值为ResponseEntity效果一样。

  4. @ResponseBody使用在方法上,@RequestBody 在入参前注解

范例:使用ResponseEntity作为返回值,完成JSON数据的响应:

	@RequestMapping("/testJson")
	public ResponseEntity<List<Emp>> selectEmp(){
		
	List<Emp> list = this.empManagerSerivce.selectEmp();//查询数据
	
	ResponseEntity<List<Emp>> responseEntity = new ResponseEntity<>(list,HttpStatus.OK);//准备响应数据
	
	return responseEntity;
}

和@ResponseBody注解 的效果一样,那么在开发中,一般使用第一种途径,也就是注解方式。

范例:@RequestBody 使用,读取文件内容

前端请求界面:

<form action="${pageContext.request.contextPath}/testRequestBody" method="post" enctype="multipart/form-data">
		File:<input type="file" name="file">
		<br>
		Desc:<input type="text" name = "desc">
		<br>
		<button>Submit</button>
	</form>

请求处理器的目标方法:

@ResponseBody
	@RequestMapping("testRequestBody")
//	public String testRequestBody(@RequestBody String body) {
	public String testRequestBody(HttpEntity<String> httpEntity) {
		System.out.println(httpEntity.getBody());
		return "Hello World";
	}

小结

在返回JSON格式的数据的时候,必须要加入JSON开发包,然后在DispatcherServlet中才会存在JSON的消息转换器;

对于HttpMessageConverter,我们要知道使用**@RequestBody注解目标方法的入参**、使用@ResponseBody注解目标方法,表示指定请求内容或者是相应内容到底使用哪个消息转换器。

对于HttpEntity和ResponseEntity只不过是@RequestBody 和@ResponseBody 的不同写法,这两个类需要指定泛型,此泛型就表示调用哪个对应的消息转换器。

本文地址:https://blog.csdn.net/codeliang20/article/details/107390443

《SpringMVC返回JSON数据格式及HttpMessageConverter介绍.doc》

下载本文的Word格式文档,以方便收藏与打印。