为什么`request.getParameterMap().get(name)`的参数值是一个对象哈希码?

3
为什么参数值是对象哈希码:
input_name:[[Ljava.lang.String;@3f4d64]

我认为这段代码 request.getParameterMap().get(name); 应该会返回请求参数的值:

    Enumeration params = request.getParameterNames();
    while(params.hasMoreElements())
    {
        String name = (String)params.nextElement(); 
        String value = request.getParameterMap().get(name);
        logger.log(name + ": " + value);
    }

2
这段代码不会编译。我认为您最初使用了Object value。将来,请确保您发布的是实际的代码,以避免红鲱鱼。 - BalusC
3个回答

10
因为它返回的是一个 String[],而不是一个 String。在 getParameterMap() 的 javadoc 中也说明了:

返回:

包含参数名称作为键和参数值作为映射值的不可变的 java.util.Map。参数映射中的键的类型为 String。参数映射中的值的类型为 String 数组。

因此,您需要将其视为数组。如果您想获取单个(第一个)参数值,请改用 request.getParameter()。这里是一种重写方式:
for (String name : Collections.<String>list(request.getParameterNames())) {
    String value = request.getParameter(name); 
    logger.log(name + ": " + value);
}

如果你真的想检查所有可能的参数值,那么只需迭代地遍历该映射的entryset:

Map<String, String[]> map = request.getParameterMap();
for (Entry<String, String[]> entry : map.entrySet()) {
    String name = entry.getKey();
    String[] values = entry.getValue();
    logger.log(name + ": " + Arrays.toString(values));
}

谢谢。但是我对上面的第一个代码块有一个问题。Collections.list部分会产生错误:“无法将元素对象转换为字符串类型”。是否需要在某个地方进行强制转换? - Dieter Gantz
抱歉,我忘记了它没有参数化,我已经修复了这段代码。 - BalusC
如何仅获取特定参数,例如:http://localhost:8080/project/?pid=1&cid=20&start=1&end=24&uid=9。如果我只想获取 pidcid,该如何使用 getParameterMap() 仅获取这些属性? - Anil Kumar Pandey

5
参数映射是一个从参数名称到值数组的映射。这是因为您可能有相同参数的多个值。例如,考虑以下请求:

http://www.example.com/var=value1&var=value2

在这种情况下,当获取var的参数时,您将获得{"value1", "value2"}
如果您想打印给定参数的所有值,可以对值数组使用Arrays.toString
如果您知道每个变量最多只有一个值,可以使用getParameter。从文档中得知:

仅在您确定参数仅具有一个值时才使用此方法。如果参数可能具有多个值,请使用 getParameterValues(java.lang.String)。


赞赏你解释了“为什么”。像往常一样,“其他程序员”是我们无法拥有好东西的原因。 - gws

1

HttpServletRequest 有什么原因呢?

Map<String, String[]> map = request.getParameterMap();

这是因为表单提交具有相同参数名称但不同值。您可以使用具有1个或多个相同参数名称但不同值的URL表单。

请参见BalusC的回复。


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