以下均是在環境配置好的情況下執行
1.基本數據類型及包裝類型:
根據文本域的name屬性值
jsp表單:
<form action="name.do" method="post">
<label>書名:</label><input type="text" id="bookName" name="bookName">
<label>編號:</label><input type="text" id="bookId" name="bookId">
<label>分類:</label><input type="text" id="bookCategroy" name="bookCategroy">
<label>價格:</label><input type="text" id="bookPrice" name="bookPrice">
<input type="submit" id="subName" value="提交" >
</form>
controller代碼:
@RequestMapping(value="name.do")
@ResponseBody
public void nameBimds(String bookName,int bookId,String bookCategroy,float bookPrice){
System.out.println("書名:"+bookName);
System.out.println("分類:"+bookCategroy);
System.out.println("編號:"+bookId);
System.out.println("價格:"+bookPrice);
}
基本數據類型綁定最基本的方法就是jsp表單中文本標籤屬性name值與後臺Controller中函數名稱一致,即可完成數據綁定。
但是對於int和float類型的數據,如果前臺傳值爲null或”“,則會出現數據轉換異常,前臺瀏覽器提示狀態值400 bad request無效的請求,在SpringMVC中很可能就是類型不匹配。在實際開發中可以使用對應的基本數據類型的包裝類型:Integer(int),Float(float)
public void nameBimds(String bookName,Integer bookId,String bookCategroy,Float bookPrice){ ......}
自定義變量名(只是在controller中函數參數可以與name值不一致)
前臺不變
Controller
@RequestMapping(value="name.do")
@ResponseBody
public void nameBimds(@RequestParam("bookName")String Name,@RequestParam("bookId")Integer Id,@RequestParam("bookCategroy")String Categroy,@RequestParam("bookPrice")Float Price){
System.out.println("書名:"+Name);
System.out.println("分類:"+Categroy);
System.out.println("編號:"+Id);
System.out.println("價格:"+Price);
}
可以發現其實還是指明數據綁定對應規則,即jsp表單值與函數參數值如何一一對應。
大家可以看到在函數前有@ResponseBody,到底什麼作用那?在執行這個函數後會跳到一個空白的頁面而不是原來的頁面(沒有寫跳轉代碼),在ajax代碼中這個問題就會暴露出來了,也會費解,這裏記錄一下(網上找的)
Ajax請求通過XMLHttpRequest對象發送請求,該對象有四個狀態(readyState):
0-未初始化
1-正在初始化
2-發送數據
3-正在發送數據
4-完成
當XMLHttpRequest.readyState爲4時,表示請求已經完成可以得到響應結果。當然success和error方法還是根據響應狀態碼來觸發。當XMLHttpRequest.status爲200的時候,表示響應成功,此時觸發success().其他狀態碼則觸發error().
除了根據響應狀態碼外,ajax還會在下列情況下走error方法:
1. 返回數據類型不是JSON
2. 網絡中斷
3. 後臺響應中斷
js中ajax代碼請求添加提交按鈕onclick函數 jsp去掉form標籤,否則不能識別函數
function subName(){
$.ajax({
url:'name.do',
type:'post',
data:{
bookName:$("#bookName").val(),
bookId:$("#bookId").val(),
bookCategroy:$("#bookCategroy").val(),
bookPrice:$("#bookPrice").val()
},
success:function(){
alert("success");
},
error:function(){
alert("error");
}
});
}
提交後會發現後臺正確執行,前臺卻執行error函數,挺急人,數據沒有錯,name就是沒有返回正確的狀態碼200,前臺顯示狀態碼400 bad request,這就找到問題所在了,後來查找說是SpringMVC默認是跳轉頁面的,如果沒有指定跳轉頁面,那麼就必須標記@ResponseBody,從而可以返回前臺200狀態碼。
這裏在介紹一下@ResponseBody和@RequestBody
@RequestBody
作用:
i) 該註解用於讀取Request請求的body部分數據,使用系統默認配置的HttpMessageConverter進行解析,然後把相應的數據綁定到要返回的對象上;
ii) 再把HttpMessageConverter返回的對象數據綁定到 controller中方法的參數上。
@ResponseBody
作用:
該註解用於將Controller的方法返回的對象,通過適當的HttpMessageConverter轉換爲指定格式後,寫入到Response對象的body數據區。
使用時機:
返回的數據不是html標籤的頁面,而是其他某種格式的數據時(如json、xml等)使用;
結合上面知識在前臺瀏覽器資源中可以看到200的response 裏面有綁定的數據。