透過瀏覽器網址列輸入url並透過?傳遞參數請求資源時,?後面的參數叫做"查詢字串",會觸發後台Servlet的doGet(),因為透過瀏覽器網址列直接存取的方式是GET方式。
下面順便了解一下form的method屬性對傳參的影響。
原始表單:
參數資訊: 查詢字串
指定form的method屬性時:
參數資訊: 表單資料
上面兩種方式的對應都是刷新後顯示當前頁面,因為form沒有指定action屬性,預設提交的地址就是當前頁面。
現在透過指定action屬性存取Servlet來進一步了解method屬性。
TestServlet.java核心原始碼:
@WebServlet("/servlet/TestServlet")
public class TestServlet extends HttpServlet {
private static final long serialVerformati; 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"
第四種情況: method="post" action="/test/servlet/TestServlet"
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