Springmvc之Json
springmvc和前台交互主要有两种形式,如下图所示:
导入依赖的jar包
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.5.1</version> </dependency>
JSON转换器
如果是配置了注解适配器org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter的话,需要在该适配器中配置json转换器
<!-- 用于将对象转换为 JSON --> <bean id="stringConverter" class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=UTF-8</value> </list> </property> </bean> <bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="stringConverter" /> <ref bean="jsonConverter" /> </list> </property> </bean>
如果使用<mvc:annotation-driven />
注解驱动的话就不用以上的配置了,默认已经配好了
前台传送JSON数据
在使用AJAX传递JSON数据的时候要将contentType的类型设置为“application/json”,否则的话会提示415错误
<script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery-1.4.4.min.js"></script> <script type="text/javascript"> function requestJson() { var jsonData={ "name":"iphoneX", "price":"999" }; $.ajax({ type:'post', url:'${pageContext.request.contextPath}/user/requestJson', contentType:'application/json;charset=utf-8', data:JSON.stringify(jsonData), success:function (data) { alert(data.name); } }); } </script>
Controller控制器
@RequestMapping("/requestJson")
public @ResponseBody Phone requestJson(@RequestBody Phone phone){
return phone;
}
public class Phone {
private String name;
private float price;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
}
前台传输的是key/value格式的数据
function requestJsonByKV(){ $.ajax({ type:"post", url:"${pageContext.request.contextPath}/user/requestJsonByKV", // contentType: 默认就是key/value类型 data:'name=iphoneX&price=999', success:function(data){ alert(data.name); } }); }
Controller
@RequestMapping("/requestJsonByKV") public @ResponseBody Phone requestJsonByKV(Phone phone){ return phone; }
@responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML,在使用此注解之后不会再走试图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
response.getWriter.write(JSONObject.fromObject(user).toString());
问题:
随着项目越来越复杂,需求越来越复杂,对于处理器返回数据的类型要求越来越多。比如要求能够返回JSON类型的数据、或者能够返回XML格式的数据,或者返回二进制的数据流等等。
SpringMVC提供这样的一个机制,允许控制器返回的数据不经过正常的视图处理流程,而是直接将返回的数据写入响应体中(response body)。
当然HTTP协议支持的各种数据类型与我们程序运行中产生的各种数据类型是不一样的,因此需要有一个机制将处理器返回的数据转换成某种类型的HTTP协议支持的数据类型。
数据类型转换
SpringMVC提供一种数据转换机制,这种机制可以根据预先设定的media type,调用合适的转换器将数据转换成合适的类型。
默认包含的转换器
SpringMVC默认包含一系列的数据转换器,此处不一一列举,就介绍几种常用的。
MappingJackson2XmlHttpMessageConverter 基于Jackson的XML转换器,能够将对象转换成XML格式的数据
MappingJackson2HttpMessageConverter 基于 Jackson 的JSON转换器,能够将对象转换成JSON格式的数据
GsonHttpMessageConverter 基于Gson的JSON转换器,能够将对象转换成JSON格式数据
对于系统中默认包含的转换器,只要我们在项目中加入转换器所依赖的JAR包,相关转换器就会被加载。
设置数据转换类型 media type
明确如何允许控制器直接将返回结果写入响应体中,并且明确处理器将返回的数据写入响应体之前会进行相应的转换。
但是发现SpringMVC中默认携带的转换器不止一种,那么如何确定处理器返回的数据交给合适的转换器,转换成我们想要的数据类型呢?
只需要使用 @ReuqestMapping注解的一个参数进行设置即可
@RequestMapping(value="/json", produces={"application/json; charset=UTF-8"}) @ResponseBody public Book abc() { Book book = new Book("spring-framework", "12345", "2016-10-12"); return book; }
将原本使用@RequestMapping设置的路径设置为 value属性的值,此外另外设置一个属性 produces,这个属性接受一个字符串数组。接受的数据类型是 media type。上面这个例子就是标明这个方法的返回结果要转换成UTF-8编码的JSON数据。
系统默认的设置的 media type[4]
在一些简单的环境中,比如项目返回的数据类型只需要JSON格式,可能就不需要设置 produces的类型,来指定 media type,也能够按照要求返回正常的JSON数据,这是为什么?
因为SpringMVC在项目初始化时,会去扫描系统中的JAR包,然后根据扫描到的JAR包设置默认的转换类型,大概的扫描过程是:
1)检查系统中是否存在jackson-xml的JAR包,如果存在,就将数据转换类型列表中设置XML类型,以及其对应的转换器
2)检查系统中是否存在jackson-json的JAR包,如果存在,就在数据转换类型列表中设置JSON类型,以及其对应的转换器
因为是先检测的XML,因此XML排在JSON前面,如果系统两者的JAR包都存在,那么默认情况下数据会被转换成XML格式
设置XML数据示例
jackson中有包含转XML的包
jackson-dataformat-xml-2.8.5.jar
不过它依赖于下列一系列的包
jackson-annotations-2.8.5.jar jackson-core-2.8.5.jar jackson-databind-2.8.5.jar jackson-module-jaxb-annotations-2.8.5.jar stax2-api-3.1.4.jar woodstox-core-5.0.3.jar
编写控制器
@RequestMapping(value="/xml", produces={"application/xml; charset=UTF-8"}) @ResponseBody public Book abc() { Book book = new Book("spring-framework", "12345", "2016-10-12"); return book; }
参考:
https://blog.csdn.net/eson_15/article/details/51742864