代码之家  ›  专栏  ›  技术社区  ›  Patrick

jstl中的access map<enum,object>

  •  11
  • Patrick  · 技术社区  · 15 年前

    我有:

    public enum MyEnum{
        One, Two, Three
    }
    

    从控制器,我输入模型:

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

    如何在JSTL中以一种简洁的方式访问key enum my enum.one映射中的对象?

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

    也不

    ${map[MyEnum.One]}
    
    4 回复  |  直到 7 年前
        1
  •  11
  •   ChssPly76    15 年前

    不能。您最好的办法是将映射更改为使用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函数来为您执行上述操作。

        2
  •  15
  •   binkdm    13 年前

    你不能做到这一点并不完全正确,但解决办法并非完全是直截了当的。问题是,el没有将作为map键传入的字符串转换为相应的枚举,因此在map lookup中放入$map['one']不会使用枚举常量myenum.one。

    我遇到了同样的问题,不想返回到使用字符串键控的映射,所以接下来的挑战是在JSTL中如何获取要在映射查找中使用的实际枚举引用。

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

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

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

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

    ${map[ONE]}
    

    您将使用实际的枚举常量作为键,因此将从映射中获取适当的对应值。(注意,其中一个没有引号,这是因为您引用了上面添加的请求属性1)

        3
  •  1
  •   Vojtěch Å albaba    7 年前

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

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

    首先,我导入枚举。然后,我将想要的枚举值保存到JSTL变量中。然后我可以用这个变量作为键访问映射。

        4
  •  0
  •   Valeriu Mosescu    8 年前
    ${map[MyEnum.One]}
    

    它对我有用。但您必须编写类的完整名称:my.package.myenum或导入myenum类:

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