【问题标题】:Mixing expressions and expression language (<%= %> inside of c:if)混合表达式和表达式语言(<%= %> 在 c:if 中)
【发布时间】:2011-01-13 10:55:36
【问题描述】:

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

我试过了:

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

但这似乎并不奏效。 自从我使用表达式以来已经有一段时间了,所以我可能犯了一个错误。任何意见表示赞赏。

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

【问题讨论】:

标签: java jsp expression


【解决方案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}">

【讨论】:

  • java 类不在我的控制范围内,所以这不是一个选项。
  • 如果没有 setter/getter,你不能从 EL 访问它
  • 我知道我需要 getter 和 setter。但我希望混合 EL 和表达式。如果我将表达式放在引号之外,并且 c:if 我得到了该常量的预期值。
  • 你的test 表达是假的。 == 必须进入表达式内部。
【解决方案2】:

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

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

【讨论】:

  • 问题是每次他们更改它时,我还必须更新该类。如果我能找到一种方法让我原来的 sn-p 工作,那会更加用户友好。 (或者如果他们最终为 EL 添加了一个函数)
  • 我个人更喜欢在一个地方更改它(ConstantsAccessor),并在编译时检测一个常量已消失或更改其名称,而不是必须在我的所有 JSP 中更改它,并且仅在运行时发现问题。如果他们改变它,你无论如何都必须改变它。
【解决方案3】:

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

Scriptlet 和 EL 不在同一个上下文中运行。虽然有变通办法/黑客,但共识是你不应该混合它们。使用其中之一。由于 scriptlet 十年以来一直是 discouraged,因此 EL 是要走的路。我建议改用枚举。即使您不能直接引用它们,也可以将它们表示为字符串。

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

    private Display display;

    // ...
}

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

另见:

【讨论】:

    猜你喜欢
    • 2011-01-28
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-26
    • 2023-03-26
    • 1970-01-01
    • 2013-11-04
    相关资源
    最近更新 更多