Form.action傳值問題

WBOY
發布: 2016-08-31 08:41:45
原創
2091 人瀏覽過

透過瀏覽器網址列輸入url並透過?傳遞參數請求資源時,?後面的參數叫做"查詢字串",會觸發後台Servlet的doGet(),因為透過瀏覽器網址列直接存取的方式是GET方式。


下面順便了解一下form的method屬性對傳參的影響。

原始表單:








第一種情況:
上面表單的action屬性不寫時,直接點擊「提交」按鈕,會觸發表單的提交事件,此時​​,透過火狐瀏覽器的控制台可以發現:
訊息標頭中有以下關鍵訊息:(1)請求地址後面透過'?'傳遞參數(2)請求方式為GET

 




參數資訊: 查詢字串

 




指定form的method屬性時:







第二種情況:
訊息頭中有以下關鍵資訊:(1)請求地址後面沒有傳遞任何參數(2)請求方式為POST

 



參數資訊: 表單資料

 




上面兩種方式的對應都是刷新後顯示當前頁面,因為form沒有指定action屬性,預設提交的地址就是當前頁面。

現在透過指定action屬性存取Servlet來進一步了解method屬性。

TestServlet.java核心原始碼:

@WebServlet("/servlet/TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVerformat​​i; request, HttpServletResponse response) throws ServletException , IOException {
response.getWriter().print("doGet()");
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().print("doPost( )");
}

}


第三種情況:method="get" action="/test/servlet/TestServlet"







上面的訊息頭,參數和第一種情況是一樣的,不過後台回應了一個doGet().

 



第四種情況: method="post" action="/test/servlet/TestServlet"







上面的訊息頭,參數和第一種情況是一樣的,不過後台回應了一個doPost().

 



TestServlet.java 新增取得參數碼:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletRequest request, HttpServletResponse response) throws Servletalception, 版本; getWriter().print ("doGet() get type="+param);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOception {getpter ).print("doPost() get type="+param);
}


第五種情況,method="get" 在action後面傳參action = "/servlet/TestServlet?type=01",同時在後台Servlet中取得參數

此時瀏覽器網址列:http://localhost:8080/test/servlet/TestServlet?username=

 



可以發現,後台的doGet()是取得不到參數type的.
同時發現,type參數是沒有加入到「查詢字串」的

 






第六種情況,method="post" 在action後面傳參action = "/servlet/TestServlet?type=01",同時在後台Servlet中取得參數

 




可以發現,後台的doPost()是可以取得參數type的。

同時,參數一欄和以前有些不同:既有「查詢字串」又有「表單資料」

 





所以上面給我們一種啟示,就是通過?在form的action後面傳遞參數時,我們需要手動指定form的method="post",不然是獲取不到?後面的參數的;
思維迷思:之前我們在瀏覽器網址列透過url傳遞參數,也是通過?來實現的,它最終也是呼叫doGet()方式,所以我們就認為在的表單(預設method="get")中action後面可以通過?來傳參。


最終原因:(個人總結)get方式提交表單資料時,會重組url,它只會將form的表單資料組裝成“查詢字串”,提交到form的action中指定的url,所以原來通過?方式傳遞的參數是不會提交的,因為url重組了就丟失了。

但是post方式提交表單時,它會將表單資料和?後面的參數,分開保存,一起提交給form中action指定的url。

(參考資源)HTML Form: why action can't have get value in it?
http://stackoverflow.com/questions/3548795/html-form-why-action-cant-have-get-value-in -it

 




 

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!