六、与json交互

1、两种交互模式

  

  上图显示了客户端请求数据的两种格式,一种是 直接请求 json 数据,另一种是 key/value 数据。但是不管请求是哪种数据,为了在前端页面方便对结果进行解析。最终我们都转换为 json 数据格式。

2、导入相应的 jar 包(详情参看源码)

   

3、在 springmvc.xml 文件中配置 json 转换器

  第一种方法:

1
<mvc:annotation-driven ></mvc:annotation-driven>

  第二种方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!-- 用于将对象转换为 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>

  

4、请求为 json 数据测试

  这里我们需要注意两个注解:

  @ResponseBody把后台pojo转换json对象,返回到页面。

  @RequestBody接受前台json数据,把json数据自动封装pojo。

  ①、jsp 页面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<%@ 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>SpringMVC和 json 交互</title>
<script type= "text/javascript"  src= "${pageContext.request.contextPath}/js/jquery-2.1.4.min.js"  ></script>
</head>
<script type= "text/javascript" >
     var dataJson = {
             'username' : 'Bob' ,
             'sex' : '男'
     };
     function requestJson(){
         $.ajax({
             type: "POST" ,
             url: "${pageContext.request.contextPath}/requestJson" ,
             //指定数据格式为 json
             contentType: "application/json;charset=UTF-8" ,
             data:JSON.stringify(dataJson),
             dataType: "json" ,
             success:function(data){
                 console.log(data.username);
                 console.log(data.sex);
             }
         });
     }
     
</script>
<body>
     <button onclick= "requestJson()"  value= "请求是json,返回json" >请求是json,返回json</button>
     
</body>
</html>

  

  ②、Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package  com.ys.controller;
 
import  org.springframework.stereotype.Controller;
import  org.springframework.web.bind.annotation.RequestBody;
import  org.springframework.web.bind.annotation.RequestMapping;
import  org.springframework.web.bind.annotation.ResponseBody;
 
import  com.ys.po.User;
 
@Controller
public  class  UserController {
     
     
     //请求为json,返回json
     @RequestMapping ( "/requestJson" )
     //@RequestBody将请求信息的json串转成user对象
     //@ResponseBody将user对象转成json输出
     @ResponseBody
     public  User requestJson( @RequestBody  User user)  throws  Exception{
         System.out.println(user);
         return  user; //由于@ResponseBody注解,将user转成json格式返回
     }
     
}

  ③、测试

  我们访问上面的jsp页面,然后点击按钮,进入到 Controller

  

  然后我们查看返回的数据:

  

5、请求为 key/value 数据测试

  ①、JSP 页面

   ②、Controller

1
2
3
4
5
6
7
8
//请求为key/value,返回json
     @RequestMapping ( "/requestKeyValue" )
     //@RequestBody将请求信息的json串转成user对象
     @ResponseBody
     public  User requestKeyValue(User user)  throws  Exception{
         System.out.println(user);
         return  user;
     }

  ③、测试

  

  然后返回数据:

  

6、遇到的问题

  ①、如下代码,由于我们使用 Ajax 提交,我们在 JSP 页面引入了jquery  文件,发现无论使用绝对路径还是相对路径,系统总是找不到这个文件?

1
<script type= "text/javascript"  src= "${pageContext.request.contextPath}/js/jquery-2.1.4.min.js"  ></script>

  原因:因为你在web.xml 文件中,对于过滤器的配置是拦截所有请求。所以类似于*.js,或者*.css这样的文件也被拦截了,故访问不到。

  

  解决办法:

    第一种办法:我们可以使用上面配置的拦截器只拦截 *.do,或者*.action,而不是 “/”。那么SpringMVC容器将不会拦截*.js,*.css这样的文件。但是这种风格不支持 Restful,建议不采用。

    第二种方法:在web.xml中配置拦截器的过滤请求

1
2
3
4
5
6
7
8
9
<!--要写在DispatcherServlet的前面, 让 defaultServlet先拦截请求,这样请求就不会进入Spring了,我想性能是最好的吧。--> 
     <servlet-mapping> 
         <servlet-name> default </servlet-name> 
         <url-pattern>*.css</url-pattern> 
     </servlet-mapping> 
     <servlet-mapping> 
         <servlet-name> default </servlet-name> 
         <url-pattern>*.js</url-pattern> 
     </servlet-mapping> 

    第三种方法:在spingmvc.xml 中配置对静态资源不过滤

1
2
3
<!-- 配置静态文件过滤器 -->
     <mvc:resources location= "/WEB-INF/css/"  mapping= "/css/**" />
     <mvc:resources location= "/WEB-INF/js/"  mapping= "/js/**" />

  

  ②、也是比较容易犯的错误 415

  

  

   这个错误产生的原因有很多。我们需要一步一步的排查:

  第一步:必须保证导入的 jackson相关的jar包是全的。

  第二步:在springmvc.xml文件中的配置的json转换器一定不能缺少,如何配查看本篇博客的第三点

  第三步:书写 Ajax 请求时。contentType:"application/json;charset=UTF-8",不要不写 contentType 这个属性

  第四步:Ajax传给后台的不要直接传字符串,要转换成json,即 data:JSON.stringify(dataJson),

猜你喜欢

转载自www.cnblogs.com/zhoanghua/p/9292246.html