Spring Mvc與Json資料互動
在web開發中,如果想做頁面區域性重新整理的功能,那麼使用ajax最合適不過了。在spring mvc逐漸替代struts框架的今天,掌握spring mvc和json的資料互動式很有必要的。
ajax與後臺的資料互動格式有好幾種,本文主要講解以ajax以json格式和key/value鍵值對的方式向後臺傳送資料,返回的是json格式的資料,以便於前端對資料的解析。兩種格式的後臺處理過程如下。
兩者的區別是:如果使用的json格式,那麼在controller對應的方法引數加@RequestBody註解,這個註解能夠把json串轉為javabean物件。如果是key/value格式,那麼不需要@RequestBody註解,因為傳過來的鍵值對spring mvc自動裝配成bean。
1.現在來搭建實驗環境,在jsp頁面中,需要載入jquery庫,因為jquery對ajax的封裝,很方便操作。這裡我直接用微軟的cdn了,只需要在jsp頁面的head標籤中引入jquery就行了。
<script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.0.js"></script>
2.在jsp頁面建立一個button按鈕,並當我們點選這個按鈕時,觸發ajax請求函式。
<button onclick="requestJson()">傳送Json請求</button><br />
處理ajax請求的函式如下:
function requestJson() {
$.ajax({
type : "post",
url : "${pageContext.request.contextPath}/testJson/requestJson",
contentType : "application/json;charset=utf-8",
//資料格式是json串,傳進一個person
data : '{"userName" : "shizongger","gender" : " male"}',
success:function(data){
console.log("伺服器處理後的使用者名稱是:" + data.userName);
console.log("伺服器處理後的性別是:" + data.gender);
}
});
}
上訴引數的各自含義是:
type:http請求的方式,據說http請求方式有6種方式,但是一般開發中用的最多的就是post和get這兩種方式。
url:請求的url地址,就是我們要訪問的cotroller對映的地址。
contentType:這裡要特別注意這個問題,如果是key/value值,那麼這個請求的值應該是: “application/x-www-form-urlencoded/charset=utf-8“,而預設值就是這個值,可以不用寫。如果是json格式的話,應該是:”application/json;charset=utf-8“,這裡必須寫對。
3.引入spring mvc需要的jar包,主要是兩個jar包,分別是:jackson-core-asl-x.x.xx.jar和jackson-mapper-asl-x.x.xx.jar。如果你不是一個maven專案,那麼首先將jar包下載下來,然後把這兩個包放進lib資料夾。如果你是一個maven專案,那麼它的依賴檔案如下:
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
4.在spring mvc的註解配置器中中加入messageConenters。
<mvc:annotation-driven />
5.寫controller的處理方法。
/**
*
* @param person RequestBody註解將json串轉為javabean person
* @return 返回javabean person,ResponseBody將javabean轉為json返回到客戶端
*/
@RequestMapping("/requestJson")
public @ResponseBody Person requestJson(@RequestBody Person p) {
System.out.println("json傳來的串是:" + p.getGender() + " " + p.getUserName() + " " + p.isAdalt());
p.setUserName(p.getUserName().toUpperCase());
return p;
}
上述的Person javabean定義為:
public class Person {
/*
* 姓名
*/
private String userName;
/**
* 性別
*/
private String gender;
/*
* 是否成年,測試json是否能夠傳遞boolean值
*/
private boolean adalt;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public boolean isAdalt() {
return adalt;
}
public void setAdalt(boolean adalt) {
this.adalt = adalt;
}
}
將專案執行起來,在瀏覽器控制輸出結果如下:
伺服器處理後的使用者名稱是:SHIZONGGER
伺服器處理後的性別是:male
伺服器後臺輸出結果如下:
json傳來的串是:male shizongger false
這裡我在伺服器只做了一個處理,就是將前端傳遞過來的使用者名稱轉換為大寫,再將其返回。
下面是處理key/value鍵值對的情形。
function responseJson() {
console.log("b");
$.ajax({
type : 'post',
url : '${pageContext.request.contextPath}/testJson/responseJson',
data : 'userName="JAVA程式設計師"&gender="男"&male="true"',
success : function(data) {
console.log("伺服器處理後的使用者名稱是:" + data.userName);
console.log("伺服器處理後的性別是:" + data.gender);
}
});
}
@RequestMapping("/responseJson")
public @ResponseBody Person responseJson(Person p) {
System.out.println("json傳來的串是:" + p.getGender() + " " + p.getUserName() + " " + p.isAdalt());
p.setUserName(p.getUserName().toUpperCase());
return p;
}
兩者的區別是:
1,在ajax請求中,json需要些contentType,而key/value不需要。
2,在controller處理器中,json需求@RequestBody註解才能將json串轉為person物件,而key/value不需要。
一般而言,key/value請求比json請求簡單,所以前者使用的較多,而controller返回給前端的引數格式,一般都是json。
如果你在搭建環境是出錯,可能有以下原因:
1.瀏覽器返回狀態嗎:415 Unsupported Media Type
原因是你可能忘記在配置檔案里加入這句話:< mvc:annotation-driven />,或者jar包沒有引入進去,又或者,你的json格式資料寫錯了。
2.eclipse報錯:D:\JavaProgram\userysys-v2.0\target\m2e-wtp\web-resources\META-INF\MANIFEST.MF (系統找不到指定的路徑。)
解決辦法:點選eclipse的project->clean->Clean all projects或者Clean projects below,或者必須選中你出錯的專案