混合表达式和表达式语言(<%=%>在c:if中)

时间:2011-01-13 10:55:37

标签: java jsp expression

我需要访问jsp中的一些常量,遗憾的是EL不提供任何功能。 有一些选项,如非标准标签库,但我想保持它更标准。

我试过了:

<%@ page import = "com.jackdane.Constants"%>
<c:if test="${object.display == '<%=com.jackdane.Constants.YES %>}'">
//some display logic
</c:if>

但这似乎并没有成功。 我已经使用了一个表达式已经有一段时间了,所以我可能犯了一个错误。任何意见都表示赞赏。

编辑: 为了澄清,常量类不在我的控制范围内。它在我收到的jar文件中。 它包含无getter / setters 。 只需private static final Strings

3 个答案:

答案 0 :(得分:1)

public class Constants
{

    public static final String YES = "yes";

    public String getYES()
    {
        return YES;
    }


}

jsp

<jsp:useBean id="cons" class="com.abc.Constants" scope="session"/>

<c:if test="${object.display == cons.YES}">

答案 1 :(得分:0)

Jigar Joshi的回答对我来说很好看。如果你不能修改常量类,那么只需将其包装到另一个类中:

public class ConstantsAccessor {
    public String getYES() {
        return Constants.YES;
    }
}

答案 2 :(得分:0)

  

该主题是关于如何使用EL访问常量。我问的是在EL中使用表达式时出错的地方。

Scriptlets和EL不在相同的上下文中运行。虽然有变通方法/黑客攻击,但大家一致认为你不应该混淆它们。使用其中一个。由于scriptlet是discouraged十年以来,EL是最佳选择。我建议改用enum。即使您无法直接引用它们,也可以将它们表示为字符串。

public class Foo {
    public enum Display {
        YES, NO
    }

    private Display display;

    // ...
}

<c:if test="${foo.display == 'YES'}">
    ...
</c:if>

另见: