JSF 2.0中不带参数的methodexexpression调用



我试图通过

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

(不带周围标签)。

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

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

" class '…没有属性'foo'"

错误消息。

从JBoss论坛上的回应来看,方法表达式只能在支持它们的属性中使用。

Stan Silvert写道:

在我看来,这是工作如预期。这与不要争论。你的表达,#{elManagedBean.hello()}被视为ValueExpression。如果你把你的方法改为getHello(),然后它就可以工作了。的问题是,它应该被当作ValueExpression还是MethodExpression吗?例如,如果在an中有相同的表达式action属性,它将被视为MethodExpression

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

你把表达式放在中间Facelets页面,而不是作为属性的值。据我所知知道,这将始终被视为ValueExpression。我不明白这将如何在Glassfish中工作。可能有一些代码将其作为ValueExpression进行尝试,然后将其作为MethodExpression,如果失败。然而,我认为这是违背换句话说,我很惊讶这是可行的Glassfish .

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

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

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

这将在呈现响应之前调用该方法

这取决于您在servlet容器上使用的EL版本。如果使用Tomcat 6,则包含EL 2.1,如果表达式位于Facelets页面的中间,则不支持将'()'作为methodexexpression。包含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在Tomcat 6.0.24下使用EL 2.2

相关内容

  • 没有找到相关文章

最新更新