【问题标题】:How come JSF 2.x with EL 2.2 allows MethodExpression in place for ValueExpression?带有 EL 2.2 的 JSF 2.x 为何允许将 MethodExpression 用于 ValueExpression?
【发布时间】:2012-04-29 09:36:10
【问题描述】:

我看到几个问题询问如何将参数传递给 JSF 方法。使用 EL2.2 和 servlet 3.0,它使用户能够将参数传递给方法调用。 一个例子:How to pass an argument to method from rendered h:outputText? 问题是:在 JSF 2.x 中,每个标记属性都应该采用 ValueExpression 或 MethodExpression。在链接的示例中,“rendered”应该只采用 ValueExpression。但是,我确实看到它仍然可以与 MethodExpression 一起使用,如果我们放置 () 以明确它是一个方法调用而不是一个属性。这是 JSF 2.x 规范搞砸了还是我遗漏了什么?

【问题讨论】:

    标签: jsf-2 el rendered-attribute


    【解决方案1】:

    在值表达式中使用新的 EL 2.2 invoking-methods-with-arguments 语法不会自动使其成为方法表达式或其他东西。它仍然是一个价值表达。值表达式使用给定 EL 表达式的返回值作为值。方法表达式在与组件关联的操作事件上调用给定的 EL 表达式。

    EL 表达式本身是调用属性 getter 方法还是调用带有参数的任意方法对于如何处理整个 EL 表达式实际上并不重要。

    【讨论】:

    • BalusC,非常感谢您的快速回复。我很喜欢你的 JSF 博客,它对我帮助很大。你的回答很有道理。但是,我仍然感到困惑。使用 EL 的技术(例如 JSF 2.x)决定 EL 是被视为 ValueExpression 还是 MethodExpression。因此,如果对于 JSF 动作属性,我使用 action="aBean.aMethod()",并且如果 aMethod 返回文字字符串“aBean.action”,那么您是说将调用 aBean 中的动作方法吗?在我看来,EL 表达式总是在 JSF 机制之前首先被调用,如果我们在 EL 中有 (),那么它不会使用 getter 而是调用方法。
    • 不,这是标签处理程序根据每个属性决定的。您可以在tag documentation 中查看它的处理方式(检查“类型”列,例如h:commandButton)。这无论如何都不依赖于 EL 语法。
    • 同意,标签处理程序决定了。但是标签处理程序来自 JSF 实现。所以决定这一点的是 JSF。我刚刚修改了以前的 cmets。如果你有时间,能详细说明一下吗?谢谢。
    • 方法表达式不是值表达式。
    • 我之前确实检查过标签文档。您能否提供“新的 EL 2.2 调用方法与参数语法”的链接?这是特定于 ValueExpression 的吗?如果是这样,我想这就是我所有困惑的来源。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 2012-10-30
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    相关资源
    最近更新 更多