【问题标题】:Access Map<Enum, Object> in JSTL在 JSTL 中访问 Map<Enum, Object>
【发布时间】:2010-12-05 20:12:35
【问题描述】:

我有:

public enum MyEnum{
    One, Two, Three
}

从控制器,我放入模型:

HashMap<MyEnum, Long> map = new HashMap<MyEnum, Long>();
map.put(MyEnum.One, 1L);
mav.addObject( "map", map);

如何在我的 JSTL 中以简洁的方式访问映射中的对象以获取键枚举 MyEnum.One?

${map['One']} //does not seem to work...

也没有

${map[MyEnum.One]}

【问题讨论】:

    标签: java jsp enums jstl


    【解决方案1】:

    您不能做到这一点并不完全正确,但解决方案并非完全直截了当。问题是 EL 没有将您作为映射键传入的字符串转换为相应的枚举,因此在映射查找中放置 ${map['One']} 不会使用枚举常量 MyEnum.One。

    我遇到了同样的问题,不想恢复使用字符串键控映射,因此在 JSTL 中面临的挑战是如何获取要在映射查找中使用的实际枚举引用。

    所需的是将 Enum 常量放入 JSP 的范围内,这样您就可以使用实际的 Enum 本身作为键。为此,请在控制器中执行以下操作:

    for (MyEnum e : MyEnum.values()) {
      request.putAttribute(e.toString(), e);
    }
    

    您在这里所做的是将变量添加到命名为枚举的字符串表示的范围中。 (您当然可以通过在 e.toSring() 前面加上一些值来避免命名问题)

    现在,当您执行以下操作时

    ${map[ONE]}
    

    您将使用实际的枚举常量作为键,因此将从映射中取回正确的对应值。 (注意 ONE 周围没有引号,这是因为您在这种情况下引用了请求属性 ONE,这是上面添加的)

    【讨论】:

    • 嗯!创造性的解决方案! :)
    • 非常好,只要您不必使用具有相同名称的常量的枚举。
    【解决方案2】:

    你不能。您最好的选择是更改您的地图以使用 enum.name() 作为键:

    HashMap<String, Long> map = new HashMap<String, Long>();
    map.put(MyEnum.One.name, 1L);
    map.addObject( "map", map);
    

    你的第一种方法会起作用:

    ${map['One']} // works now
    

    如果您不能/不想更改地图,也可以编写自定义 EL 函数来为您完成上述操作。

    【讨论】:

    • 使用自定义 el 函数 - 这是最易于维护的方式。
    【解决方案3】:

    我通常使用这个解决方案:

    <%@page import="my.package.MyEnum"%>
    <c:set var="One" value="<%=MyEnum.One %>" />
    <c:set var="MyEnum_values" value="${map[One]}" />
    

    首先,我导入枚举。然后,我将我想要的枚举值保存到 JSTL 变量中。然后我就可以以这个变量为key来访问map了。

    【讨论】:

      【解决方案4】:
      ${map[MyEnum.One]}
      

      它对我有用。但是你必须写你的类的完整名称:my.package.MyEnum 或导入 MyEnum 类:

      <%@page import="my.package.MyEnum"%>
      

      【讨论】:

      • 它适用于 Pivotal tc Server 3.1.1(来自 STS)和 Tomcat 8.0.28,但不适用于 Tomcat 8.0.14
      • 我正在使用 tomcat 8.5 但似乎无法正常工作
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多