使用Java Servlet解析关联数组请求参数
是否可以使用Java servlet API从诸如此类的请求中解析字符串键?
http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3 getParameterValues("assocArray") returns ["value3","value1","value1"]
返回数组中值的排序不是键的顺序(不重要)
已解决:有可能将键解释为简单的全局键字符串。 Java不会将它们识别为数组。 使用正则表达式
不是直接的。 []
在HTTP请求参数中没有特殊含义,并且Servlet API不被识别为数组键(您可能是一个PHP程序员,它确实有一个专有的解析器吗?)。 你需要自己解析并自行收集它。
例如,
Map assocArray = new LinkedHashMap(); for (Entry entry : request.getParameterMap().entrySet()) { String name = entry.getKey(); if (name.startsWith("assocArray[")) { String key = name.substring(name.indexOf('[') + 1, name.indexOf(']')); assocArray.put(key, entry.getValue()[0]); } }
对于相同的参数名称,您可能有多个值:
http://localhost:8080/?param1=value1¶m1=value2¶m1=value3
在这种情况下, getParameterValues("param1")
将返回一个包含3个元素的String[]
: "value1"
, "value2"
和"value3"
。
在您给出的示例中,您定义了3个不同的参数: assocArray[key1]
, assocArray[key2]
和assocArray[key3]
。 servlet API将它们视为3个完全不同的参数,没有任何共同点。 因此,您必须调用getParameter("assocArray[key1]")
获取"value1"
, getParameter("assocArray[key2]")
获取"value2"
等。
不可能,AFAIK。 http协议仅指定键和值,没有key[key]=value
通过索引使用字符串数组 – values[0]
, values[1]
等。
您可以进行一些预处理 – 使用request.getParameterMap(..)
,自己解析foo[bar]
语法,并将其放在Map
已解决:有可能将键解释为简单的全局键字符串。 Java不会将它们识别为数组。 使用正则表达式
Java不会将它们识别为数组(元素),因为URL / URI规范并未表示它们代表数组。 您不应该期望 Java(或其他)库实现您基本上已经撤出的自定义语法。
使用正则表达式来解析输入通常是一个坏主意。 对于(完整的)URL,这是一个坏主意,因为URL可以被编码的各种棘手的方式,并且正则表达式很难考虑到这一点。
(如果您使用正则表达式拆分单个请求参数,那么您应该没问题,因为Servlet基础结构已经处理了主URL解析并处理了%-encoding等)
我还想指出你的查询字符串语法是脆弱的。 您正在使用'[‘和’]’字符而不转义它们。 根据URL / URI规范,它们是“保留字符”,并且在用作“数据”时应该被转义。 在大多数情况下,您可能会使用它,但是需要严格符合URI的应用程序将拒绝您的URL。