最近寫ajax跟SpringMVC交互的程序比較多,遇到問題也比較多,總結(jié)一下。
1、客戶端jquery使用ajax向服務(wù)器傳值并取返回的值:
$.ajax({
url:url,//服務(wù)地址
data:{"name":"jack"},//請(qǐng)求的參數(shù)
dataType:'json',//返回值格式,html,json,jsonp等,
contentType: 'application/x-www-form-urlencoded',//請(qǐng)求的格式,默認(rèn)這個(gè),還有application/json等
type:'POST',//GET或POST
processData:true,//只要不是字符串,都會(huì)轉(zhuǎn)成查詢字符串,可以手動(dòng)設(shè)置false
success:function(data){//成功時(shí)出發(fā)的函數(shù),返回的是json對(duì)象,可以直接取值,如果是jsonp格式,需要自己去殼。
var userId = data.userId;
},
error:function(XMLHttpRequest, textStatus, errorThrown) {//報(bào)錯(cuò)時(shí)觸發(fā)的函數(shù)
var msg = XMLHttpRequest.status+"_"+XMLHttpRequest.readyState+"_"+textStatus+"_"+errorThrown;
}
});
1)type
如果type為GET,那么參數(shù)列表會(huì)跟在url后邊,url?name=jack&age=16,在瀏覽器中可以被用戶看到。
如果type為POST,參數(shù)會(huì)在body中傳遞,不會(huì)被看到。
2)data
data比較多樣,一般為字符串或json對(duì)象。如果是json對(duì)象,processData 不為false的話,json對(duì)象會(huì)轉(zhuǎn)成字符串,
注意:{"name":"jack"}這是json對(duì)象,‘{"name":"jack"}‘這是字符串(json對(duì)象的字符串),data需要傳json對(duì)象。
想以字符串的形式傳參數(shù),需要自己寫成name=jack&age=16 的格式。
3)dataType:
"xml": 返回 XML 文檔,可用 jQuery 處理。
"html": 返回純文本 HTML 信息;包含的 script 標(biāo)簽會(huì)在插入 dom 時(shí)執(zhí)行。
"script": 返回純文本 JavaScript 代碼。不會(huì)自動(dòng)緩存結(jié)果。除非設(shè)置了 "cache" 參數(shù)。注意:在遠(yuǎn)程請(qǐng)求時(shí)(不在同一個(gè)域下),所有 POST 請(qǐng)求都將轉(zhuǎn)為 GET 請(qǐng)求。(因?yàn)閷⑹褂?DOM 的 script標(biāo)簽來加載)
"json": 返回 JSON 數(shù)據(jù) 。
"jsonp": JSONP 格式。使用 JSONP 形式調(diào)用函數(shù)時(shí),如 "myurl?callback=?" jQuery 將自動(dòng)替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。
"text": 返回純文本字符串
4)contentType
默認(rèn)是application/x-www-form-urlencoded,絕大多數(shù)情況通用,也可根據(jù)需要改為application/json等
2、服務(wù)端取傳過去的值,并返回值
@RequestMapping("mlogin")
public void domLogin(HttpServletRequest request,HttpServletResponse response) {
try{
StringuserId= req.getParameter("userId");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
String strJSON = "{\"name\":\"" +userId+ "\"}";
response.getWriter().write(strJSON);
}catch(Exception e){
logger.error("respone Exception : ", e.getMessage());
}
//JsonP格式的數(shù)據(jù)
/*try{
String callback = request.getParameter("callback");
StringuserId= req.getParameter("userId");
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
String strJSON = callback+"({\"name\":\"" +userId+ "\"})";
response.getWriter().write(strJSON);
}catch(Exception e){
logger.error("respone Exception : ", e.getMessage());
}*/
}
注意點(diǎn)1
不管是json還是jsonp,ajax和服務(wù)器需要統(tǒng)一。
注意點(diǎn)2
另外,服務(wù)器端以request.getParameter("userId")這種方式取值,需要客戶端滿足以下條件:
1)、客戶端訪問方式是GET,意味著所有參數(shù)在url后邊。contentType 無所謂。
或者2)、客戶端是POST,contentType需要為默認(rèn)的application/x-www-form-urlencoded,data需要是個(gè)json對(duì)象,或自己把json對(duì)象組織成name=jack&age=16形式的字符串。
注意點(diǎn)3
如果contentType 為application/json,那么數(shù)據(jù)會(huì)以流的形式寫在inputstream里,需要自己取出來轉(zhuǎn)換。用的不多,不寫代碼了。