每個request對象都封裝著一次使用者請求,並且所有的請求參數都被封裝在request對象中,因此request對象是擷取請求參數的重要途徑。
一.擷取請求參數和要求標頭
Web應用是請求/響應架構的應用,瀏覽器發送請求時通常總會附帶一些要求標頭,還可能包含一些請求參數發送給伺服器,伺服器端負責解析要求標頭/請求參數的就是JSP或Servlet,而JSP或者Servlet取得請求參數的途徑就是request。request是HttpServletRequest介面的執行個體,它提供了如下幾個方法來擷取請求參數。
(1)String getParameter(String paramName) 擷取paramName請求參數的值。
(2) Map getParameterMap() 擷取所有請求參數名和參數值組成的Map對象。
(3)Enumeration getParameterNames() 擷取所有請求參數名所組成的Enumeration對象
(4) String[] getParameterValues(String paramName) paramName請求參數的值,當該請求參數有多個值時,該方法將返回多個值所組成的數組。
HttpServletRequest提供了如下方法來訪問要求標頭
(1)String getHeader(String name) 擷取指定要求標頭的值
(2)java.util.Enumeration<String>getHeaderNames 擷取所有要求標頭的名稱
(3)java.util.Enumeration<String>getHeaders(String name) 擷取指定要求標頭的多個值
(4)int getIntHeader(String name) 擷取指定要求標頭的值,並將該值轉換為整數值.
對於developder來說,要求標頭和請求參數都由使用者發送到伺服器的資料,區別在於要求標頭通常由瀏覽器自動添加,因此一次請求總是包含若干要求標頭;而請求參數則通常需要開發人員控制添加,讓用戶端發送請求參數通常有兩種方式
1.GET方式的請求:直接在瀏覽器地址欄輸入訪問地址所發送的請求或提交表單發送的請求時,該表單對應的form元素沒有設定設定method屬性,或設定method屬性為get,這幾種請求都是GET方式的請求。GET方式的請求會將請求參數的名和值轉換成字串,並且附加在原URL之後,因此可以在地址欄中看到請求參數名和值。且GET請求傳送的資料量較少,一般不能大於2KB
2.POST方式的請求:這種方式通常使用提交表單(由form HTML元素表示)的方式來發送,且需要設定form元素的method屬性為post。POST方式傳送的資料量較大,通常認為POST請求參數的大小不受限制,但往往取決於伺服器的限制,POST請求傳輸的資料量總比GET傳輸的資料量大。而且POST方式發送的請求參數以及對應的值放在HTML HEADER中傳輸,使用者不能在地址欄裡看到請求參數值,安全性相對較高。
表單提交的案例,擷取要求標頭和請求參數
<form if="form1" method="post" action="request1.jsp"> 使用者名稱:<br> <input type="text" name="name"><hr> 性別:<br> 男<input type="radio" name="gender" value="男"> 女<input type="radio" name="gender" value="女"><hr> 喜歡的顏色: 紅:<input type="checkbox" name="color" value="紅"> 綠:<input type="checkbox" name="color" value="綠"> 藍:<input type="checkbox" name="color" value="藍"><hr> 來自的國家: <select name="country"> <option value="中國">中國</option> <option value="美國">美國</option> <option value="俄羅斯">俄羅斯</option> </select> <hr> <input type="submit" value="提交"> <input type="reset" value="重設"> </form>
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
<body> <% //擷取所有要求標頭/請求參數名稱 Enumeration<String> HeaderNames=request.getHeaderNames(); while(HeaderNames.hasMoreElements()){ String headerName=HeaderNames.nextElement(); out.println(headerName+"--->"+request.getHeader(headerName)+"<br>"); } out.print("<hr>"); //設定解碼方式,對於簡體中文,使用utf解碼,編譯頁面用什麼字元格式設定,就用相應的格式解碼 request.setCharacterEncoding("utf-8"); //一次擷取表單的值 String username=request.getParameter("name"); String gender=request.getParameter("gender"); String[] color=request.getParameterValues("color"); String national=request.getParameter("country"); %> <%-- 下面依次輸出表單的值 --%> 您的姓名:<%=username %><hr> 您的性別:<%=gender %><hr> 您喜歡的顏色: <% for(String c:color){%><%=c %><hr><% } %> 您來自的國家:<%=national %><hr> </body>
註:並不是每個表單域都會產生請求參數,而是有name屬性的表單域才會產生請求參數,關於表單域和請求參數的關係遵循如下4點:
1.每個有name屬性的表單域對應一個請求參數
2.如果有多個表單域有相同的那麼屬性,則多個表單域只產生一個請求參數。只是該參數有多個值。
3.表單域的name屬性指定參數名,value指定請求參數值。
4.如果某個表單網域設定了disabled=“disabled”屬性,則該表單域不再產生請求參數。
二.擷取GET要求標頭裡的中文字元
<%
//擷取要求標頭裡面的查詢字串
String rawQueryStr=request.getQueryString();
//使用URLDecoder進行解碼字串
String queryStr=URLDecoder.decode(rawQueryStr,"utf-8");
%>
三.執行forward或include
request還有一個功能就是執行forward和include,也就是代替JSP所提供的forward和include動作指令。
HttpServletRequest類提供了一個getRequestDispatcher(String path),其中path就是希望forward或者include的目標路徑,該方法返回RequestDispatcher,該對象提供了如下兩個方法
1.forward(ServletQuest request,ServletResponse reponse) 執行forward
2.include(ServletQuest request,ServletResponse reponse) 執行include
eg------getRequestDispatcher("/a.jsp").forward(request,reponse)