基于javaservlet的关联数组请求参数解析

基于javaservlet的关联数组请求参数解析,java,servlets,Java,Servlets,是否可以使用JavaServletAPI从这样的请求中解析字符串键 http://localhost:8080/?assocArray[key1]=value1&assocArray[key2]=value2&assocArray[key3]=value3 getParameterValues("assocArray") returns ["value3","value1","value1"] 返回数组中值的顺序不是键的顺序(并不重要) 已解决:可以将键解释为简单的全局键字符

是否可以使用JavaServletAPI从这样的请求中解析字符串键

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

getParameterValues("assocArray") returns ["value3","value1","value1"]
返回数组中值的顺序不是键的顺序(并不重要)


已解决:可以将键解释为简单的全局键字符串。Java无法将它们识别为数组。使用正则表达式是不可能的。http协议只指定键和值,没有
key[key]=value

按索引使用字符串数组-
值[0]
值[1]


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

对于同一个参数名,您可能有多个值:

http://localhost:8080/?param1=value1&param1=value2&param1=value3
在这种情况下,
getParameterValues(“param1”)
将返回一个
字符串[]
,该字符串包含3个元素:
“value1”
“value2”
“value3”


在您给出的示例中,您定义了3个不同的参数:
assocArray[key1]
assocArray[key2]
assocArray[key3]
。Servlet API将它们视为3个完全不同的参数,没有任何共同点。因此,您必须调用
getParameter(“assocArray[key1]”)
来获取
“value1”
getParameter(“assocArray[key2]”)
来获取
“value2”
,等等。

[]
在HTTP请求参数中没有特殊意义,Servlet API不会将其识别为数组键(您可能是一名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]);
    }
}
Map-assocArray=newlinkedhashmap();
for(条目:request.getParameterMap().entrySet()){
字符串名称=entry.getKey();
if(name.startsWith(“assocArray[”)){
String key=name.substring(name.indexOf('['))+1,name.indexOf(']');
assocArray.put(key,entry.getValue()[0]);
}
}
已解决:有可能,这些键被解释为简单的全局键字符串。Java无法将它们识别为数组。请使用正则表达式

Java不会将它们识别为数组的(元素),因为URL/URI规范没有说它们代表数组。你不应该期望Java(或其他)库实现你从根本上说不出来的自定义语法

一般来说,使用正则表达式解析输入是个坏主意。对于(完整的)URL来说,这是个坏主意,因为URL的编码有多种复杂的方式,正则表达式很难考虑到这一点

(如果您使用正则表达式拆分单个请求参数,那么应该可以,因为Servlet基础设施已经处理了主URL解析和%编码等。)


我还想指出,您的查询字符串语法很脆弱。您使用的是“[”和“]”字符,但没有转义。根据URL/URI规范,它们是“保留字符”,当用作“数据”时,应该转义。在大多数情况下,您可能不会受到影响,但需要严格符合URI的应用程序将拒绝您的URL