SpringMVC - 对Ajax的处理(包含 JSON 类型)

SpringMVC——对Ajax的处理(包含 JSON 类型)

一、首先要搞明白的一些事情。

1.从客户端来看,需要搞明白:

(1)要发送什么样格式的 JSON 数据才能被服务器端的 SpringMVC 很便捷的处理,怎么才能让我们写更少的代码,如何做好 JSON 数据和实体之间的对应。

(2)如何组织这些发送的数据。

2.从服务器端来看,需要搞明白:

(1)SpringMVC 如何返回 JSON 数据。

(2)SpringMVC 如何处理请求的复杂数据。

3.$.ajax 的几个参数:

(1)contentType:

contentType: 'application/json;charset=utf-8',作为请求头,用来告诉服务器消息的主体是序列化后的 JSON 字符串。除了低版本的 ie 浏览器外,各大浏览器都原生支持 JSON.stringify() 对对象进行序列化。

(2)dataType:预期服务器返回的数据类型。

4.SpringMVC 是如何处理 JSON 数据的

5.总体的思想:

(1)SpringMVC 能完成的,尽量借助于 SpringMVC,而不是我们手动的去解析。

(2)SpringMVC 解析不了的,尽量借助于第三方的 Jar 包来解析。

(3)SpringMVC 和 第三方 Jar 包解决不了的时候,我们再自己去解析。

二、想要搞明白第一个问题,前提是先要搞明白第一个问题:SpringMVC 是如何处理 JSON 数据的。

1.使用 HttpMessageConverter 来处理 JSON 数据的。

Spring 的 HttpMessageConverter 负责将请求信息转换为一个对象,将对象输出为响应信息。

2.API

(1)boolean canRead(Class clazz, MediaType mediaType);

转换器是否可将请求信息转换为 clazz 类型的对象,同时支持指定的 MIME 类型,如: text/html,application/json 等。

(2)boolean canWrite(Class clazz, MediaType mediaType);

转换器是否可以将 clazz 类型的对象写到响应中,响应支持的类型在 mediaType 中定义。

(3)List getSupportedMediaTypes();

改转换器支持的 MediaType 类型。

(4)T read(Class clazz, HttpInputMessage inputMessage);

将请求信息流转换为 clazz 类型的对象。

(5)void write(T t, MediaType contentType, HttpOutputMessage outputMessage)。

将 T 类型的对象写到响应输出流中,同时指定 MediaType。 3.实现类

3.从上图可以看出,Spring 默认支持使用 Jackson来处理 JSON 问题。添加 Jackson Jar 包后,来看 RequestMappingHadlerAdapter 装配的 HttpMessageConverter:

导入的 Jackson Jar 包:

4.具体的处理方法:

(1)使用 @RequestBody 和 HttpEntity 对请求进行处理。

(2)使用 @ResponseBody 和 ResponseEntity 对响应进行处理。

(3)@RequestBody 对处理方法的入参进行标注。

(4)@ResponseBody 对处理方法的签名进行标注。

(5)HttpEntity 和 ResponseEntity 作为处理方法的入参使用。

具体的使用方法会在下面例子中进行说明。

5.@RequestBody 和 @ResponseBody 是可以同时使用的。

三、上面简单介绍了 SpringMVC 是怎么处理 JSON 数据的,现在来看第二个问题:发送什么样格式的 JSON 数据才能被服务器端的 SpringMVC 很便捷的处理,这里主要指的是请求的 JSON 字符串和实体的映射。

以一个简单的实体为例:Person

Person.java

(1)对于简单的一个Person 对象来说,我们甚至都不需要借助于 JSON 就可以完成请求的数据与实体之间的映射。 请求: 复制代码

$(\ $.ajax({

url: \ type: \ data: {

name : \ age : \ },

success: function (result) { console.log(result); } }); }); 复制代码 handler 方法:

@RequestMapping(\public Person testJson(Person person) { System.out.println(\ return person; }

(2)对于Person数组来说,需要发送什么样的格式才能被 SpringMVC 直接处理?

请求: 复制代码

$(\ $.ajax({

url: \ type: \

data:'[{ \\\}, { \\\}, { \\\

contentType: \ success: function (result) { console.log(result); } }); }); 复制代码 handler 方法:

@RequestMapping(\

public String testJson6(@RequestBody List persons) { System.out.println(\ return \} 注意:

(1)需要指定 \,同时需要注意的是:发送的请求数据不在 Form data 中,而是在 Request Payload 中。关于 [Request Payload] ,在后面说明。

(2)必须要指定 @RequestBody ,否则无法解析。

四、第三个问题:如何组织这些数据以及SpringMVC 如何处理这些数据,做好映射。

(1)说明:

上面说的两个例子,仅仅是最简单的一种形式。现在对其进行扩展,在四里,所说的 SpringMVC 如何处理这些数据,不仅仅指的是SpringMVC,也包括SpringMVC处理不了,使用第三方来处理,或者第三方处理不了,我自己来处理。

同时这里的数据也不仅仅指的 JSON 类型的数据。

(2)对于非表单的 Ajax 提交,这里只提供比较简单的一种方式。还是以上面的 Person 为例。

e1:

数据的组织与请求的发送: 复制代码 var personList = [];

personList.push({name: \李四\personList.push({name: \张三\$(\ $.ajax({

type: \ url: \

data: JSON.stringify(personList),//将对象序列化成JSON字符串 contentType: 'application/json;charset=utf-8', //设置请求头信息 success: function (data) { },

error: function (res) { } }); }); 复制代码 handler 方法:

@RequestMapping(\

public String testJson5(@RequestBody List persons) { System.out.println(persons); return \}

(3)基于表单的 Ajax 提交。

提供一个序列化方法: 复制代码

$.fn.serializeObject = function() {

var o = {};

var a = this.serializeArray(); $.each(a, function() {

if (o[this.name] !== undefined) { if (!o[this.name].push) {

o[this.name] = [o[this.name]]; }

o[this.name].push(this.value || '');

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4