做個批量處理訂單的功能,前端backbone,對於restful api的接口設計上,用backbone自己去判斷是update操作,然后發送PUT請求,再加上參數,總感覺不好。
還是用$.ajax吧,type設置為PUT,當參數放在data里時,后端是取不到的,拼在url里可以。
暫時先拼在ajax的url里吧。
轉
SpringMVC控制器接收不了PUT提交的參數的解決方案
這次改造了下框架,把控制器的API全部REST化,不做不知道,SpringMVC的REST有各種坑讓你去跳,順利繞過它們花了我不少時間,這次來提下SpringMVC的PUT提交參數為null的情況。
照常先貼出我的控制器代碼,沒什么特別的,就是打印出接受到的前台參數值:
1
2
3
4
5
6
7
8
9
10
11
|
@RequestMapping
(value =
"/{id}"
, method = RequestMethod.PUT)
@ResponseBody
public
Map<String, Object> update(
@RequestParam
(value =
"isform"
, required =
false
) String isform,
@PathVariable
(
"id"
) String id) {
System.out.println(
"id value: "
+ id);
System.out.println(
"isform value: "
+ isform);
return
null
;
}
|
很常規的PUT控制器,用來修改原有的記錄,原有的的web.xml中,我只添加了一個和REST涉及的過濾器
org.springframework.web.filter.HiddenHttpMethodFilter
1
2
3
4
5
6
7
8
|
<
filter
>
<
filter-name
>HttpMethodFilter</
filter-name
>
<
filter-class
>org.springframework.web.filter.HiddenHttpMethodFilter</
filter-class
>
</
filter
>
<
filter-mapping
>
<
filter-name
>HttpMethodFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|
這個因為大多數人都知道它的作用,這里再啰嗦提一下:
瀏覽器form表單只支持GET與POST請求,而DELETE、PUT等method並不支持,spring3.0添加了一個過濾器,可以將這些請求轉 換為標准的http方法,使得支持GET、POST、PUT與DELETE請求,該過濾器為HiddenHttpMethodFilter,只需要在表單中添加一個隱藏字段"_method"
1
2
3
4
|
<
form
action
=
"..."
method
=
"post"
>
<
input
type
=
"hidden"
name
=
"_method"
value
=
"put"
/>
......
</
form
>
|
下邊我們來看下,運行的結果,我會在我的前台發起一個PUT請求作為案例,
我們來看下后台的參數打印情況:
id參數順利的獲取到了,因為它其實是由@PathVariable獲取的,這個沒有什么問題,但是http body中提交的參數值isform卻為null,查詢了一番,原因是:
如果是使用的是PUT方式,SpringMVC默認將不會辨認到請求體中的參數,或者也有人說是Spirng MVC默認不支持 PUT請求帶參數,
解決方案也很簡單,就是在web.xml中把原來的過濾器改一下,換成org.springframework.web.filter.HttpPutFormContentFilter
1
2
3
4
5
6
7
8
|
<
filter
>
<
filter-name
>HttpMethodFilter</
filter-name
>
<
filter-class
>org.springframework.web.filter.HttpPutFormContentFilter</
filter-class
>
</
filter
>
<
filter-mapping
>
<
filter-name
>HttpMethodFilter</
filter-name
>
<
url-pattern
>/*</
url-pattern
>
</
filter-mapping
>
|
在更改之后我們繼續一下剛才的案例,發送一個PUT請求,參數基本都不變
看下后台打印的結果:
ok,現在已經可以成功的獲取並打印出前台的參數。