HttpServletRequest - 获取查询字符串参数,无表单数据

时间:2011-07-27 15:41:03

标签: java servlets query-string

HttpServletRequest中,getParameterMap返回所有查询字符串参数的地图并发布数据参数。

有没有办法获取一个只有查询字符串参数的Map?我试图避免使用getQueryString并解析出值。

6 个答案:

答案 0 :(得分:63)

如果查询字符串类似于

,则可以使用request.getQueryString()
username=james&password=pwd

要获得名字,你可以这样做

request.getParameter("username"); 

答案 1 :(得分:20)

与cularis所说的相反,参数图中可以存在两者。

我看到的最好方法是代理参数Map,并为每个参数检索检查queryString是否包含“&?< parameterName> =”。

请注意,在进行此项检查之前,parameterName需要进行URL编码,正如Qerub指出的那样。

这可以节省您的解析,但仍然只提供URL参数。

答案 2 :(得分:18)

servlet API缺少此功能,因为它是在许多人认为查询字符串和消息体只是两种不同的发送参数的方式创建的,而没有意识到参数的用途根本不同。

查询字符串参数?foo = bar是URL的一部分,因为它们涉及识别资源(可能是许多资源的集合),例如“所有42岁的人”:

GET /人?年龄= 42

POST或PUT中的消息体参数用于表示对目标资源的修改。 Fx将值设置为属性“hair”:

PUT /人?年龄= 42

头发=灰色

因此,同时使用查询参数和body参数绝对是RESTful,分开以便您可以将它们用于不同的目的。 Java servlet API中肯定缺少该功能。

答案 3 :(得分:11)

正如其他答案所述,使用servlet api无法获取查询字符串参数。

因此,我认为获取查询参数的最佳方法是自己解析查询字符串。 (迭代参数并检查查询字符串是否包含参数更复杂)

我在下面写了代码来获取查询字符串参数。使用apache StringUtils和ArrayUtils。

Invalid operands to binary operation('double' and 'complex<float>')

答案 4 :(得分:3)

Java 8

return Collections.list(httpServletRequest.getParameterNames())
                  .stream()
                  .collect(Collectors.toMap(parameterName -> parameterName, httpServletRequest::getParameterValues));

答案 5 :(得分:2)

我担心没有办法从post参数中单独解析查询字符串参数。顺便说一句,这种API缺席的事实可能意味着您应该检查您的设计。为什么在发送POST时使用查询字符串?如果您真的想要将更多数据发送到URL,请使用类似REST的约定,例如而不是发送

http://mycompany.com/myapp/myservlet?first=11&second=22

说:

http://mycompany.com/myapp/myservlet/11/22