HttpServletRequest的getParameter方法

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呢?
  • 第三个问题,如果我写了两个一样的参数,我应该怎样获取这两个参数呢?

答案:

  1. (该问题的前提是参数在请求体里,并且Content-Type是application/x-www-form-urlencoded)因为流是不能往回读的,所以如果程序员自己通过request获取的InputStream读完了请求体,那么再来调用request.getParameter试图获取参数得到的是null,反之亦然。
  2. 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勘误

  3. 可以用request.getParameterValues(“name”)方法来获取所有name

转载自:https://blog.csdn.net/shuangmulin45/article/details/78083992

posted @ 2018-06-05 11:38  厸清扬  阅读(3345)  评论(0编辑  收藏  举报