在JSF 2.0中没有参数的MethodExpression调用

时间:2011-09-08 08:45:54

标签: jsf el

我正试图通过

从JSF 2.0 facelet调用无参数方法
#{myBean.foo()}

(没有任何周围的标签)。

根据Burns / Schalk:完整参考:JSF 2.0是可能的(第126页,#{userBean.pullValuesFromFlash()})。

然而,框架将表达式作为值表达式,因此认为foo应该是bean属性。 在JBOSS 7.0.1(以及6)上,我得到了一个

“班级'......'没有属性'foo'”

错误消息。

3 个答案:

答案 0 :(得分:2)

根据this response on the JBoss forum判断,方法表达式只能用于支持它们的属性。

  

Stan Silvert写道:

     

在我看来,这是按预期工作的。这没什么   没有争论。你的表情,   #{elManagedBean.hello()}被视为ValueExpression。如果   您将方法更改为getHello()然后它会起作用。该   问题是,它应该被视为ValueExpression还是a   MethodExpression?例如,如果你有一个相同的表达式   action属性将被视为MethodExpression

<h:commandButton value="Hello" action="#{elManagedBean.hello()}" 
     id="submit_button"/>
     

你把表达放在了中间   Facelets页面而不是属性的值。就我而言   知道,这将始终被视为ValueExpression。我没有看到   这将如何在Glassfish中起作用。可能有一些   将代码作为ValueExpression进行尝试然后将其作为a尝试的代码   MethodExpression如果失败。但是,我认为这会违反   EL规格。换句话说,我很惊讶这会起作用   Glassfish的。

答案 1 :(得分:2)

McDowell回答了问题的原因:内联表达式被视为值表达式,而不是方法表达式。

至于如何实现功能要求,请使用<f:event>

<f:event type="preRenderView" listener="#{myBean.foo}" />

这将在渲染响应之前调用该方法。

答案 2 :(得分:0)

这取决于您在servlet容器上使用的EL版本。如果使用Tomcat 6,则包含EL 2.1,如果表达式位于Facelets页面的中间,则不支持'(')作为MethodExpression。包含EL 2.2的Tomcat 7确实支持这个甚至是增强功能,因为它能够将参数传递给方法表达式:

所以你这样做:

<h:outputText value="#{object.test(10)}" ></h:outputText>

并在bean中接收参数(可能需要额外的转换和验证):

public String test(MyObject o)
{
    ...
    return value;
}

参考文献: http://tomcat.apache.org/whichversion.html Using EL 2.2 with Tomcat 6.0.24