經常使用表單,一直使用的都是POST方式,POST將數據封裝到請求體中,相對於GET安全一點;而POST處理中文編碼問題也比GET簡單(GET需要將URL編碼,后台接受到后還需要解碼)。今天我想要使用GET方式提交表單,卻遇到了參數丟失的問題(姑且這樣稱呼這個問題吧),並不是GET方式表單提交的數據就會丟失,而是自己對表單理解的還不到位,使用錯誤。
一個GET方式提交的表單:
<form action="${pageContext.request.contextPath }/myServlet?name=lz" method="GET"> <input type="text" name="password"/> <input type="submit" value="提交"/> </form>
重點在於?號后面的name參數,我想當然的以為password的值會最加到后面,就如:
http://localhost:8888/11/myServlet?name=lz&password=123
但是事實上,真正的URL為:
http://localhost:8888/11/myServlet?password=123
沒錯,完全不管?號后面是否有值,直接將password追加到?號后面,所以我們在后台想要得到這個name的值,當然就得不到了。
而我們常用的POST方式會怎樣呢?
將method改為POST之后,再次提交,可以發現提交的URL:
http://localhost:8888/11/myServlet?name=lz
而password參數封裝在請求體中傳給后台,所以后台既可以得到name的值,也可以得到password的值,都沒有問題。
我們姑且將追加在?后面的參數稱之為查詢字符串,而將寫在input中的值稱之為表單數據。
注意:查詢字符串不能使用GET方式的表單進行提交,想要提交可以使用隱藏域的方式(作為表單數據),而POST沒有問題;表單數據不論使用哪種方式提交都是可以正確提交到后台的。
這個例子即使是比較極端的,但是如果有類似的需求還是需要注意一下。
既然這里說到表單,我再記錄一下如何使用表單發PUT或者DELET類型的請求,其實表單只支持GET或POST的請求,其method的方法選項也只有這兩種,如果我們使用RestFul風格的URl,就需要解決這個問題。
步驟:
1.在web.xml中配置HiddenHttpMethodFilter 這個Filter,其實就是這個Filter將POST請求轉變為PUT或是DELET,其實在頁面發的還是POST請求:
<!--配置將POST轉換為PUT,DELETE的Filter --> <filter> <filter-name>HiddenHttpMethodFilter</filter-name> <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class> </filter> <filter-mapping> <filter-name>HiddenHttpMethodFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
2.表單一定要使用POST請求,然后在表單中添加一個隱藏域:
<%-- 因為使用PUT提交,所以需要一個隱藏域name=_method --%> <input type="hidden" name="_method" value="PUT"/>
隱藏域input的名應定要是_method,至此,就可以根據隱藏域value的值發出PUT或DELETE請求了。
