SpringMVC詳解(六)------與json交互


  Json(JavaScript Object Notation),它是一種輕量級數據交換格式,格式簡單,易於讀寫,目前使用特別廣泛。那么這篇博客我們主要談談在 SpringMVC 中,如何對 json 數據格式進行解析和轉換?

   本篇博客源碼鏈接:http://pan.baidu.com/s/1kURnwDx 密碼:b37t

1、兩種交互模式

  

 

  上圖顯示了客戶端請求數據的兩種格式,一種是 直接請求 json 數據,另一種是 key/value 數據。但是不管請求是哪種數據,為了在前端頁面方便對結果進行解析。最終我們都轉換為 json 數據格式。

 

2、導入相應的 jar 包(詳情參看源碼)

   

 

3、在 springmvc.xml 文件中配置 json 轉換器

  第一種方法:

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

  第二種方法:

<!-- 用於將對象轉換為 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 頁面

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

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

//請求為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  文件,發現無論使用絕對路徑還是相對路徑,系統總是找不到這個文件?

<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中配置攔截器的過濾請求

<!--要寫在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 中配置對靜態資源不過濾

<!-- 配置靜態文件過濾器 -->
	<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),

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM