1. 程式人生 > >傳送DELETE或PUT請求時springmvc獲取引數為NULL

傳送DELETE或PUT請求時springmvc獲取引數為NULL

1. 情況描述:使用 $.aiax({}); 傳送delete和put請求時,springmvc獲取到的請求引數一直為null。

2.後臺程式碼如下,可正常接受POST請求引數。

@RequestMapping(value="/Database/{id}",method=RequestMethod.DELETE)
@ResponseBody
public String deleteDatabase(@PathVariable(name="id",required=true)Integer id,
			@RequestParam(value="name",required=false) String name,
			@RequestParam(value="age",required=false) Integer age
) {
	System.out.println(id+"--"+name+"--"+age);
		
	String result = "0";
		
	return result;
}
3. 有問題的前端js程式碼 :
$.ajax({
	url : "${ctp}/DatabaseOperate/Database/"+node.id,
	type : "delete",
	data : {"name":"mercy","age":22},
	dataType : "json",
	success : function(data){
		console.log(data);
	}
});
在上述程式碼情況下,id可以正常獲取到,但name和age一直是null。用chrome監聽請求,請求方式確實是DELETE,也攜帶了請求引數(Form Data形式),但後臺獲取的name和age就是null。

4. 原因:當在$.aiax

({});直接設定type為delete或put時,請求會到達springmvc控制器,但是無法獲取傳過來的引數。

解決方式:將post請求轉換為delete或put請求,這樣後臺就可以正常獲取到傳過來的請求引數。

① 在web.xml配置檔案中新增一個將post請求轉換為delete或put請求的filter:

<filter>
	<filter-name>HiddenHttpMethodFilter</filter-name>
	<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>

<filter-mapping>
	<filter-name>HiddenHttpMethodFilter</filter-name>
	<servlet-name>springDispatcherServlet</servlet-name>
</filter-mapping>
注意:servlet-name中的值必須時springmvc的對應的servlet名稱

② AJAX請求引數中必須帶上如下鍵值對:_method=delete/put

data : {"_method":"delete","name":"mercy","age":22}
③ AJAX請求型別必須是POST
type : "post"
5.正確完整前端程式碼
$.ajax({
	url : "${ctp}/DatabaseOperate/Database/"+node.id,
	type : "post",
	data : {"_method":"delete","name":"mercy","age":22},
	dataType : "json",
	success : function(data){
		console.log(data);
		layer.msg("刪除成功!");
	}
});
參考部落格:http://blog.csdn.net/u012737182/article/details/52831008