HttpServletRequest.getParameterValues() 中的值排序

2022-09-01 23:01:42

HttpServletRequest.getParameterValues()返回 包含给定 HTTP 请求参数的所有值的 。有谁知道这个数组中值的顺序是否由规范保证,与这些值在请求中传递的顺序相同?String[]

例如,如果我有GET查询字符串,我是否保证在调用时收到?它似乎在实践中有效,但我找不到任何指定必须如此的东西,所以我不愿意依赖它。x=1&x=2&x=3String[] {"1", "2", "3"}getParameterValues()


答案 1

ServletRequest 的 javadoc (v2.5 javadoc) 没有提到任何关于该方法的值排序的信息。因此,我不会依赖保留的顺序。


更新:还检查了 2.5 的规范文档,其中包含以下与 getParameterValues() 相关的信息。它没有提到任何关于查询字符串排序的内容,所以我认为你看到的行为是实现细节,而不是定义为接口的一部分。

参数存储为一组名称-值对。对于任何给定的参数名称,都可以存在多个参数值。ServletRequest 接口的以下方法可用于访问参数:

  • getParameter
  • getParameterNames
  • getParameterValues
  • getParameterMap

getParameterValues 方法返回一个 String 对象数组,其中包含与参数名称关联的所有参数值。从 getParameter 方法返回的值必须是 getParameterValues 返回的 String 对象数组中的第一个值。getParameterMap 方法返回请求参数的 java.util.Map,其中包含作为键的名称和作为映射值的参数值。

为了将来参考,Java Servlet规范可以从Sun下载,我的意思是Oracle的网站。您可以仔细检查您感兴趣的特定 Servlet 版本。


答案 2

是的,Servlet 规范保证了 返回的值和 中的条目的顺序。这段经文是这样写的:getParamterValues(String)getParameterMap()

来自查询字符串和帖子正文的数据将聚合到请求参数集中。查询字符串数据显示在正文数据之前。例如,如果使用查询字符串 a=hello 和 a=goodbye&a=world 的后置正文发出请求,则生成的参数集将排序为 a=(hello, goodbye, world)。

(这来自 Servlet 规范(版本 2.4 中的 SRV.4.1,版本 2.5 中的 SRV.3.1)的“请求”一章中的“HTTP 协议参数”部分。

似乎没有一种干净的方法来按顺序获取名称(按浏览器给出的顺序返回名称)。我想,我可以解析原始GET字符串或解析原始POST字符串,但我认为我将添加另一个隐藏参数,然后用于获取其顺序。getParameterNames()getQueryString()getInputStream()getParameterValues(String)

如果你很好奇为什么我想要按顺序排列参数,那是因为我有控件,用户可以使用jQuery重新排列,我想知道用户选择的顺序:

<form>
  <ul id=variables>
    <li>
      <input name=hello>hello
      <input type=hidden name=variableOrder value=hello>
    <li>
      <input name=world>world
      <input type=hidden name=variableOrder value=world>
  </ul>
</form>
<script src="jquery.js"></script>
<script src="jquery-ui.js"></script>
<script>
  jQuery('#variables').sortable().disableSelection();
</script>

推荐