我试图通过以下方式从JSF2.0 facelet调用一个无参数方法
#{myBean.foo()}(没有任何周围的标签)。
根据Burns/Schalk:完整的引用:JSF2.0是可能的(第126页,#{userBean.pullValuesFromFlash( )})。
但是,框架将表达式视为值表达式,因此认为foo应该是bean属性。在JBoss7.0.1(和6也是)上,我得到一个
“该类‘.’没有属性'foo'"
错误信息。
发布于 2011-09-08 11:06:56
从这是JBoss论坛上的回应判断,方法表达式只能在支持它们的属性中使用。
斯坦·西尔弗特写道: 在我看来,这一切都如期而至。这与缺乏论据毫无关系。您的表达式,
#{elManagedBean.hello()}被视为一个ValueExpression。如果您将方法更改为getHello(),那么它就会工作。问题是,应该将其视为ValueExpression还是MethodExpression?例如,如果动作属性中有相同的表达式,则它将被视为MethodExpression。 “ 您已经将表达式放在Facelets页面的中间,而不是作为属性值。据我所知,这将永远被视为一个ValueExpression。我看不出这在玻璃鱼身上是怎么回事。有可能有一些代码将其作为ValueExpression进行测试,如果失败,则将其作为MethodExpression进行尝试。然而,我认为这违反了EL规范。换句话说,我很惊讶这会适用于玻璃鱼。
发布于 2011-09-08 12:31:11
McDowell已经回答了问题的原因:内联表达式被视为值表达式,而不是方法表达式。
至于如何实现功能需求,请使用。
<f:event type="preRenderView" listener="#{myBean.foo}" />这将在呈现响应之前调用该方法。
发布于 2012-12-12 22:36:23
这取决于您在servlet容器上使用的EL版本。如果使用Tomcat 6,则包含El2.1,如果表达式位于Facelets页面的中间,它不支持'()‘作为MethodExpression。Tomcat 7,包括EL 2.2,支持此功能,甚至支持增强的特性,因为它能够将参数传递给方法表达式:
所以你这么做:
<h:outputText value="#{object.test(10)}" ></h:outputText>并在bean中接收参数(可能需要额外的转换和验证):
public String test(MyObject o)
{
...
return value;
}参考资料:http://tomcat.apache.org/whichversion.html 使用EL 2.2与Tomcat 6.0.24
https://stackoverflow.com/questions/7345417
复制相似问题