我正试图通过
从JSF 2.0 facelet调用无参数方法#{myBean.foo()}
(没有任何周围的标签)。
根据Burns / Schalk:完整参考:JSF 2.0是可能的(第126页,#{userBean.pullValuesFromFlash()})。
然而,框架将表达式作为值表达式,因此认为foo应该是bean属性。 在JBOSS 7.0.1(以及6)上,我得到了一个
“班级'......'没有属性'foo'”
错误消息。
答案 0 :(得分:2)
根据this response on the JBoss forum判断,方法表达式只能用于支持它们的属性。
Stan Silvert写道:
在我看来,这是按预期工作的。这没什么 没有争论。你的表情,
#{elManagedBean.hello()}
被视为ValueExpression。如果 您将方法更改为getHello()
然后它会起作用。该 问题是,它应该被视为ValueExpression
还是aMethodExpression
?例如,如果你有一个相同的表达式 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