您的位置:首页 > 理论基础 > 计算机网络

HttpServletRequest的getParameter方法

2017-09-25 13:05 295 查看

HttpServletRequest的getParameter方法:

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();尝试获取请求体内容,可以得到吗?

第二个问题,如果我在请求行里的URI部分这么写:
/testServlet?name=baolin
,接着又在请求体里附加
name=baobao
,然后post提交,这时候在后台Servlet调用
request.getParameter("name");
获取的是baolin还是baobao呢?

第三个问题,如果我写了两个一样的参数,我应该怎样获取这两个参数呢?

答案:

(该问题的前提是参数在请求体里,并且Content-Type是
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息