2010-10-27 105 views
3

我有一个变量从映射到枚举的弹簧控制器传递到我的JSP视图。它正在'ENUM_VALUE'打印出来,不是很方便用户。EL枚举字符串处理

什么是最好的方式来将其转换为更可读的形式,如“枚举值”。

我宁愿一个纯粹的EL解决方案,以避免在控制器写更多的代码来解析这个,但所有的意见都表示赞赏。

回答

5

该值来自Enum#name()方法。只需在你的枚举中添加一个getter,返回友好的名字。例如。

public String getFriendlyName() { 
    return name().toLowerCase().replace("_", " "); 
} 

您可以在EL中使用它,如${bean.someEnum.friendlyName}

+3

在2.1 JSP-EL(2006年5月8日)规范$ {} myEnum不会调用toString()方法。在2.1 JSP-EL规范的第1.18.2节中,您可以看到它将调用name()方法。这与2.2 JSP-EL规范相同。 – Kacper86 2013-07-01 08:26:40

+0

Like @ Kacper86 toString不起作用,请改用getter方法 – VDev 2014-08-06 19:26:05

+0

@VDev:我解决了答案。 – BalusC 2014-08-06 19:40:15

1

我会为每个枚举添加一个描述文字,当你定义它们时。像这样的东西。

public enum MyEnum { 

    ENUM_VALUE("your friendly enum value"); 

    private String description; 

    //constructor 
    private MyEnum(String description) { 
     this.description = description; 
    } 

    //add a getter for description 
} 

你EL看起来像$ {} yourenum.description

0

像Kacper86说,2.1规范说,枚举到字符串胁迫应该调用.name(),而不是toString()。我无法得到BalusC的答案。

就我个人而言,我更喜欢使用EL函数,而不是在我的枚举上使用getDescription方法。我发现我通常总是覆盖toString()方法,因此添加另一种方法来获得相同的值似乎是一个糟糕的设计。如果我在Java中工作,我只需拨打toString(),所以我的问题仅限于EL领域。另外,EL函数可以让你在每次你想在你的网页上打印一个新的枚举时不必修改你的枚举类;你只需将你的EL函数重用于任何枚举。

下面是一些简单的代码来创建一个EL功能:

public final class JSTLUtilityFunctions 
{ 
    public static String enumToStr(Enum<?> enumInst) { 
     return enumInst.toString(); 
    } 
} 

在你的TLD:

<taglib> 
    <!-- Other stuff... --> 
    <function> 
     <name>enumToStr</name> 
     <function-class>yourpackage.JSTLUtilityFunctions</function-class> 
     <function-signature>java.lang.String enumToStr(java.lang.Enum)</function-signature> 
    </function> 
</taglib> 

用法:

<%@taglib prefix="util" uri="your-TLD-uri.tld" %> 
<span>${ util:enumToStr(myEnumInstance) }</span> 

很明显,你可以改变方法签名如果您愿意,可以接受Object的任何实例。

-1

你可能只是做这样的事情在JSP中:

<span>${myenum.toString()}</span>