使用Java Servlet解析关联数组请求参数

7

使用Java servlet API,是否可以解析类似于此请求的字符串键?

http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3

getParameterValues("assocArray") returns ["value3","value1","value1"]

返回的数组中值的顺序不是键的顺序(虽然这并不重要)

已解决:它是可能的,键被解释为简单的全局键字符串。Java不会将它们识别为数组。请使用正则表达式。

4个回答

19

您可以为同一个参数名称传递多个值:

http://localhost:8080/?param1=value1&param1=value2&param1=value3
在这种情况下,getParameterValues("param1")将返回一个包含3个元素的String[]"value1""value2""value3"
在您提供的示例中,您定义了3个不同的参数:assocArray [key1] assocArray [key2] assocArray [key3] 。Servlet API会将它们视为完全不同的参数,彼此没有任何关系。因此,您必须调用getParameter(“assocArray [key1]”)来获取"value1",调用getParameter(“assocArray [key2]”)来获取"value2",以此类推。

11

不能直接使用[]在HTTP请求参数中表示数组,Servlet API不会识别它们作为数组键(你可能是一名使用PHP的程序员,因为PHP确实有专有的解析器来实现这个功能)。你需要自己循环解析和收集它。

例如,

Map<String, String> assocArray = new LinkedHashMap<String, String>();

for (Entry<String, String[]> 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]);
    }
}

1

据我所知,不可能。HTTP协议仅指定键和值,没有key[key]=value

通过索引使用字符串数组 - values[0]values[1]等。

您可以进行一些预处理 - 使用request.getParameterMap(..),自己解析foo[bar]语法,并将其放入Map<String, String>中。


1
已解决:这是可能的,因为键被解释为简单的全局键字符串。Java不将它们识别为数组。使用正则表达式。
Java不会将它们识别为(数组的)元素,因为URL / URI规范没有说明它们表示数组。您不应该期望Java(或其他)库实现您从空气中提取的自定义语法。
通常情况下,使用正则表达式来解析输入是一个坏主意。对于(完整的)URL,这是一个坏主意,因为有各种棘手的方式可以对URL进行编码,而且很难让正则表达式考虑到这一点。
(如果您正在使用正则表达式来拆分单个请求参数,则应该没问题,因为Servlet基础结构已经处理了主要的URL解析并处理了%-编码等。)
我想指出你的查询字符串语法是脆弱的。在使用 '[' 和 ']' 字符时没有进行转义。根据URL / URI规范,它们是“保留字符”,在用作“数据”时应该进行转义。在大多数情况下,你可能可以得到通过,但要求严格符合URI的应用程序将拒绝你的URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接