tomcat或者其他的Servlet容器在調(diào)用程序員的Servlet之前已經(jīng)幫我們做了很多事情了,比如解析HttpRequestLine(HTTP請(qǐng)求行)和解析HttpHeader(HTTP請(qǐng)求頭)等等,但事實(shí)上在Servlet之前,服務(wù)器只解析到Header就停了,剩下的請(qǐng)求體留在request.getInputStream的流里,所以,如果你想在Servlet里面獲得請(qǐng)求體里的內(nèi)容,直接去讀request.getInputStream()就好了。 但事情可能還沒(méi)那么簡(jiǎn)單,我們知道,當(dāng)我們?cè)谇岸颂峤灰粋€(gè)表單的時(shí)候,假設(shè)表單的內(nèi)容為:name=baolin&password=mima
,我們是可以直接在Servlet里調(diào)用request.getParameter("name");
來(lái)獲取到name的值的,大家有沒(méi)有想過(guò),如果form表單用的是POST方法提交,那么毫無(wú)疑問(wèn)參數(shù)是在請(qǐng)求體里的,前面說(shuō)過(guò),如果想獲取請(qǐng)求體里的內(nèi)容,是可以在request流里直接讀的,那么問(wèn)題來(lái)了:
request.getInputStream()
讀取完了請(qǐng)求體,這時(shí)候我再來(lái)用request.getParameter("name");
獲取name的值,得到的是真實(shí)值還是個(gè)空呢?或者我先調(diào)用了request.getParameter();再來(lái)request.getInputStream();嘗試獲取請(qǐng)求體內(nèi)容,可以得到嗎?/testServlet?name=baolin
,接著又在請(qǐng)求體里附加name=baobao
,然后post提交,這時(shí)候在后臺(tái)Servlet調(diào)用request.getParameter("name");
獲取的是baolin還是baobao呢?答案:
application/x-www-form-urlencoded
)因?yàn)榱魇遣荒芡刈x的,所以如果程序員自己通過(guò)request獲取的InputStream讀完了請(qǐng)求體,那么再來(lái)調(diào)用request.getParameter試圖獲取參數(shù)得到的是null,反之亦然。request.getParameter()方法的解析順序?yàn)椋篣RI -> 請(qǐng)求體,所以如果在URI獲取到了需要的參數(shù),那就不會(huì)再去請(qǐng)求體解析了
【很明顯這句是有問(wèn)題的,Tomcat解析Parameter的邏輯應(yīng)該是:parameter的name和value是一對(duì)多的關(guān)系,tomcat會(huì)先解析URI里的queryString,然后判斷如果是post請(qǐng)求&&content-type=”aplication/x-www-form-urlencoded”不管之前有沒(méi)有獲取到需要的參數(shù)都會(huì)去解析body,也就是說(shuō)如果不是post請(qǐng)求而是delete或者其它請(qǐng)求或者content-type不是”aplication/x-www-form-urlencoded”則不會(huì)去讀取body,這種情況getInputSteam讀取body會(huì)得到數(shù)據(jù)】
2017-10-24勘誤
可以用request.getParameterValues(“name”)方法來(lái)獲取所有name
對(duì)于httprequrest的request.getParameter()的作用,之前我只是在用它而不知道它到底有什么作用,今天看了一遍文章突然明白了其中的意思。
大致的內(nèi)容如下:
<form action="xxxxxxx.do" > <input name="name" value="哈哈"/> <input type="submit" value="提交"/> </form> 這個(gè)form提交請(qǐng)求后,在你的action中 String name = request.getparameter("name"); 那么name的值就是“哈哈”它是一種取參數(shù)的方法。把jsp文件中的數(shù)據(jù)讀取到出來(lái)。然后就可以封裝利用起來(lái)。
再看這里:
<body>
<form action="${pageContext.request.contextPath }/login.action" name="frmLogin" method="post">
用戶名: <input type="text" name="name"> <br/>
密碼: <input type="text" name="pwd"> <br/>
<input type="submit" value="登陸"> <br/>
</form>
</body>
</html>
// 1. 獲取請(qǐng)求數(shù)據(jù),封裝
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
User user = new User();
user.setName(name);
user.setPwd(pwd);
一、 簡(jiǎn)單的對(duì)比
request.getParameter用的比較多,相對(duì)熟悉
request.getParameterValues(String name)是獲得如checkbox類(名字相同,但值有多個(gè))的數(shù)據(jù)。 接收數(shù)組變量 ,如checkobx類型
request.getParameter(String name)是獲得相應(yīng)名的數(shù)據(jù),如果有重復(fù)的名,則返回第一個(gè)的值 . 接收一般變量 ,如text類型
例:
1. 三個(gè)名字相同的text標(biāo)簽
<input type="text" name="test" value="1" />
<input type="text" name="test" value="2" />
<input type="text" name="test" value="3" />
request.getParameterValues("test") ----------------- [1, 2, 3]
request.getParameter("test") ------------------ 1
${paramValues.test}
${param.test}
2. checkbox
<input type="checkbox" name="habit" value="read">看書
<input type="checkbox" name="habit" value="movie">電影
<input type="checkbox" name="habit" value="game">游戲
request.getParameterValues("habit")
二、與此相關(guān)的話題------隱含對(duì)象
1. JSP隱含對(duì)象(Implicit Object)
所謂隱含對(duì)象,是指當(dāng)編寫jsp網(wǎng)頁(yè)時(shí),不必做任何聲明就可以直接使用的對(duì)象。 JSP2.0定義了九個(gè)隱含對(duì)象
request response pageContext session application out conifg page exception
這里只提一下request 和 response 兩個(gè)對(duì)象
request 對(duì)象表示客戶端請(qǐng)求的內(nèi)容,比如我們從request中取得了用戶輸入的內(nèi)容,實(shí)現(xiàn)了javax.servlet.http.HttpServletRequest接口
response對(duì)象表示響應(yīng)客戶端的結(jié)果。
上面我們使用了request的兩個(gè)方法getParameter 和 getParameterValues,其實(shí)request還有其他幾個(gè)比較重要的方法,這里只涉及幾個(gè)獲取請(qǐng)求參數(shù)的方法
String getParameter(String name) 取得name的參數(shù)值
String[] getParameterValues(String name) 取得所有name的參數(shù)值
Enumeration getParameterNames() 取得所有的參數(shù)名稱
Map<String, String[]> getParameterMap() 取得request的所有參數(shù)的一個(gè)映射
//
Returns a java.util.Map of the parameters of this request. Request parameters are extra information sent with the request. For HTTP servlets, parameters are contained in the query string or posted form data.
Returns:
an immutable java.util.Map containing parameter names as keys and parameter values as map values. The keys in the parameter map are of type String. The values in the parameter map are of type String array.
//
response等其他幾個(gè)隱含對(duì)象也有非常重要的身份,有機(jī)會(huì)專門整理一下,宣揚(yáng)一下它們的顯赫地位。
2. EL隱含對(duì)象
EL即Experssion Language,自JSP2.0后正式成為JSP的標(biāo)準(zhǔn)規(guī)范之一,支持Servlet2.4/JSP2.0的Container也就相應(yīng)的支持EL語(yǔ)法。
一個(gè)常見(jiàn)的形式如,<c:out value="${ 3 + 7 * 4}" />
EL的隱藏對(duì)象有11個(gè) PageContext PageScope RequestScope sessionScope applicationScope
param paramValues header headerValues cookie initParam
其中param 和 paramValues即對(duì)相應(yīng)ServletRequest.getParameter(String name)和ServletRequest.getParameterValues(String name)
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲瑥V大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇