tomcat或者其他的Servlet容器在调用程序员的Servlet之前已经帮我们做了很多事情了,比如解析HttpRequestLine(HTTP请求行)和解析HttpHeader(HTTP请求头)等等,但事实上在Servlet之前,服务器只解析到Header就停了,剩下的请求体留在request.getInputStream的流里,所以,如果你想在Servlet里面获得请求体里的内容,直接去读request.getInputStream()就好了。 但事情可能还没那么简单,我们知道,当我们在前端提交一个表单的时候,假设表单的内容为:name=baolin&password=mima
,我们是可以直接在Servlet里调用request.getParameter("name");
来获取到name的值的,大家有没有想过,如果form表单用的是POST方法提交,那么毫无疑问参数是在请求体里的,前面说过,如果想获取请求体里的内容,是可以在request流里直接读的,那么问题来了:
request.getInputStream()
读取完了请求体,这时候我再来用request.getParameter("name");
获取name的值,得到的是真实值还是个空呢?或者我先调用了request.getParameter();再来request.getInputStream();尝试获取请求体内容,可以得到吗?/testServlet?name=baolin
,接着又在请求体里附加name=baobao
,然后post提交,这时候在后台Servlet调用request.getParameter("name");
获取的是baolin还是baobao呢?答案:
application/x-www-form-urlencoded
)因为流是不能往回读的,所以如果程序员自己通过request获取的InputStream读完了请求体,那么再来调用request.getParameter试图获取参数得到的是null,反之亦然。request.getParameter()方法的解析顺序为:URI -> 请求体,所以如果在URI获取到了需要的参数,那就不会再去请求体解析了
【很明显这句是有问题的,Tomcat解析Parameter的逻辑应该是:parameter的name和value是一对多的关系,tomcat会先解析URI里的queryString,然后判断如果是post请求&&content-type=”aplication/x-www-form-urlencoded”不管之前有没有获取到需要的参数都会去解析body,也就是说如果不是post请求而是delete或者其它请求或者content-type不是”aplication/x-www-form-urlencoded”则不会去读取body,这种情况getInputSteam读取body会得到数据】
2017-10-24勘误
可以用request.getParameterValues(“name”)方法来获取所有name
对于httprequrest的request.getParameter()的作用,之前我只是在用它而不知道它到底有什么作用,今天看了一遍文章突然明白了其中的意思。
大致的内容如下:
<form action="xxxxxxx.do" > <input name="name" value="哈哈"/> <input type="submit" value="提交"/> </form> 这个form提交请求后,在你的action中 String name = request.getparameter("name"); 那么name的值就是“哈哈”它是一种取参数的方法。把jsp文件中的数据读取到出来。然后就可以封装利用起来。
再看这里:
<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. 获取请求数据,封装
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
User user = new User();
user.setName(name);
user.setPwd(pwd);
一、 简单的对比
request.getParameter用的比较多,相对熟悉
request.getParameterValues(String name)是获得如checkbox类(名字相同,但值有多个)的数据。 接收数组变量 ,如checkobx类型
request.getParameter(String name)是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型
例:
1. 三个名字相同的text标签
<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")
二、与此相关的话题------隐含对象
1. JSP隐含对象(Implicit Object)
所谓隐含对象,是指当编写jsp网页时,不必做任何声明就可以直接使用的对象。 JSP2.0定义了九个隐含对象
request response pageContext session application out conifg page exception
这里只提一下request 和 response 两个对象
request 对象表示客户端请求的内容,比如我们从request中取得了用户输入的内容,实现了javax.servlet.http.HttpServletRequest接口
response对象表示响应客户端的结果。
上面我们使用了request的两个方法getParameter 和 getParameterValues,其实request还有其他几个比较重要的方法,这里只涉及几个获取请求参数的方法
String getParameter(String name) 取得name的参数值
String[] getParameterValues(String name) 取得所有name的参数值
Enumeration getParameterNames() 取得所有的参数名称
Map<String, String[]> getParameterMap() 取得request的所有参数的一个映射
//
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等其他几个隐含对象也有非常重要的身份,有机会专门整理一下,宣扬一下它们的显赫地位。
2. EL隐含对象
EL即Experssion Language,自JSP2.0后正式成为JSP的标准规范之一,支持Servlet2.4/JSP2.0的Container也就相应的支持EL语法。
一个常见的形式如,<c:out value="${ 3 + 7 * 4}" />
EL的隐藏对象有11个 PageContext PageScope RequestScope sessionScope applicationScope
param paramValues header headerValues cookie initParam
其中param 和 paramValues即对相应ServletRequest.getParameter(String name)和ServletRequest.getParameterValues(String name)
如对本文有疑问,请提交到交流论坛,广大热心网友会为你解答!! 点击进入论坛