我有一个带有以下代码的Struts 2 jsp ......
<s:iterator value="categories" id="category" status="iteratorStatus">
<s:if test='#category == "M" '> snip </s:if>
问题是类别背后的java代码是..
private static final CategoryEnum[] PRIVATE_VALUES = {A,B,C,M };
public static final List<CategoryEnum> VALUES = Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));
public List<CategoryEnum> getCategories() {
return CategoryEnum.VALUES;
}
因此IF语句不起作用,它永远不会评估为真。 我已经尝试过逃避角色等,但没有成功。
我更愿意使用'category'值回调Action类,并决定该怎么做。 e.g。
<s:if test='renderCategory(#category)> snip </s:if>
但我不知道如何将#category传回给行动。
所以任何人都可以帮助我解决如何传递值或使Struts IF标记与枚举一起工作。
我已经读过这篇文章了:这里帮助不大,但无论如何我都会参考iy:
Struts 2: Why won't the 'if' tag evaluate a one char string
有人可以帮我吗?
杰夫波特
答案 0 :(得分:9)
似乎我没有查看CategoryEnum类(只附加.class而不是.java)。
CategoryEnum类虽然它是枚举,但值是它们自己的类,因此在它上面调用toString()将允许我比较每个类中的值。
<s:iterator value="categories" id="category" status="iteratorStatus">
<s:if test='#category.toString() == "M" '> snip </s:if>
答案 1 :(得分:1)
从您的示例中我不清楚什么是PRIVATE_VALUES数组?它看起来像A,B,C和M是CategoryEnum的实例。在这种情况下,您将CaterogyEnum与OGNL表达式中的字符串进行比较,这就是它失败的原因。
您可以在页面呈现之前使用真正的Java 1.5枚举,还是在您的操作上创建一个新的String值列表?