我试图通过
从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