【问题标题】:Passing java.util.Map from jsp to servlet将 java.util.Map 从 jsp 传递到 servlet
【发布时间】:2013-05-01 19:20:06
【问题描述】:

我有一些名为 Configuration 的类,它有一些 java.util.List 和 java.util.Map 类型的字段。

public class Configuration {
    List<String> objects;
    Map<String, Integer> maps;
        // getters, setters...
}

我有一些 jsp 页面,用户可以在其中编辑这些字段。

使用 List 我没有问题,我只是将我的输入字段命名为与类中命名的字段相同,然后 spring 将其转换为 @ModelAttribute。

<input type="text" name="objects"/>
<input type="text" name="objects"/>
<input type="text" name="objects"/>

使用 Map 我有一些问题 - 我不知道如何为我的输入字段命名键和值。当我将它们命名为键和值时,我在 servlet 中得到空值。

<input type="text" name="key"/><input type="text" name="value"/>

我将它们命名为 maps.key 和 maps.value 我在 servlet 中得到空映射

<input type="text" name="maps.key"/><input type="text" name="maps.value"/>

当我像地图一样命名它们时,我得到 spring 转换错误

<input type="text" name="maps"/><input type="text" name="maps"/>

将 map 从 jsp 传递到 servlet 的正确方法是什么?

【问题讨论】:

  • 你的意思是把地图从servlet传给jsp吗? jsp 在 servlet 之后得到处理。您通常会将地图设置为 bean,然后使用标记库在 jsp 中呈现 bean 值(地图内容)。
  • 不,我的意思是使用带有 post 方法的表单和带有 post 方法和 @ModelAttribute 的控制器将映射从 jsp 传递到 servlet

标签: java spring jsp servlets


【解决方案1】:

我不会让 Spring 为你做这件事。不知道能不能走这么深。

在您的 jsp 中,也许您有一个 javascript 按钮,每次您想添加一个整数时,它都会为整数添加一个 &lt;input&gt; 字段(假设为 Map&lt;String, Integer&gt;)。您应该能够设置此字段的名称属性并始终使用某些特定前缀。例如,使用前缀 NUMBER_OF_。然后一个字段将变为例如NUMBER_OF_players,其中players 是您提供的值。所以输入看起来像:

<input type="text" name="NUMBER_OF_players" /> 

在您的控制器中,将HttpServletRequest 传递给您的处理程序方法并调用getParameterMap()

Map<String, String[]> parameterMap = request.getParameterMap();
for (String key: parameterMap.keySet()) {
    if (key.startsWith("NUMBER_OF_")) {
        parameterKeyList.add(key); // add it to a list of parameters that are going to be
                                   // used for your Configuration instance
                                   // you know this is a good one because it has the prefix
    }
}

Map<String, Integer> maps = ...;

for (String parameter : parameterKeyList) {
    String value = request.getParameter(parameter); 
    Integer integer = Integer.parseInt(value);
    maps.put(parameter, integer);
}

Configuration config = new Configuration();
config.setMaps(maps);

我还没有添加所有 null 检查和异常处理,我把它留给你。

您可以让 Spring 生成 Configuration 实例的一部分(已知的字段),然后使用上述内容自行完成其余部分。

【讨论】:

  • 感谢您的回答。我也考虑过这个决定,但我仍然希望有一个使用弹簧的简单解决方案。
  • @Xenobyte Spring 使用您的 bean 字段名称来映射请求参数。因为这是一张地图,所以没有什么告诉它要获取哪些参数(使用键)。 Spring 可能让你做的是注册一个自定义 binder,但其中的逻辑类似于上面。
  • @Xenobyte 或者你可以,看看这个答案:stackoverflow.com/questions/736186/…
【解决方案2】:

你可以使用 spring:bind 标签来帮你检查这个link和这个link

【讨论】:

    猜你喜欢
    • 2013-11-25
    • 2012-05-03
    • 2011-05-20
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多