2011-09-08 33 views
4

我试图通过而不在JSF参数2.0

#{myBean.foo()} 

从JSF 2.0的facelet调用参数方法MethodExpression的调用(没有任何周围标记)。根据Burns/Schalk:完整参考:JSF 2.0(可能为第126页,#{userBean.pullValuesFromFlash()})。

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

“类 '......' 没有财产 '富'”

错误消息。

回答

2

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

斯坦Silvert写道:

在我看来像这样按预期工作。这没有什么 做缺乏参数。您的表情, #{elManagedBean.hello()}正在被视为ValueExpression。如果 您将您的方法更改为getHello(),那么它会起作用。 的问题是,它应该被视为ValueExpression还是 MethodExpression?例如,如果您在 action属性中具有相同的表达式,则它将被视为MethodExpression

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

你已经把表达的 中间的Facelets页面,而不是作为一个属性的值。据我所知,这总是被视为ValueExpression。我没有看到 这将如何在Glassfish中起作用。可能有一些 代码将其作为ValueExpression进行尝试,如果失败,则尝试将其作为 MethodExpression。不过,我认为这将违背EL规范 。换句话说,我很惊讶这可以在 Glassfish上运行。

2
道尔

已应答该问题的原因:直列表达式被视为值表达式,而不是方法表达式。

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

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

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

+0

看来日在'el'标签维基页面上有个不好的例子。即'$ {bean.list.size()}'。它不会工作,原因有二:首先 - 因为内联表达式被视为值表达式,而第二 - javax.el.ListELResolver'首先工作,并尝试通过索引'size'获取列表中的项(使用NumberFormatException失败)。 – Andrey

+0

你说得对,特别的例子很糟糕,特别是因为使用了'ListELResolver'。我修复了这个wiki来删除它。但另一个原因并非如此,因为该方法不是“无效”的。 – BalusC

+0

维基看起来确定知道。但关于内联el表达式。当方法有参数,然后调用它(例如$ {bean.find(param.id)}),如果没有参数,那么解析器试图找到一个属性($ {bean.find()}将失败,因为没有getFind方法,而不考虑find()返回类型)。有趣的是在这方面的规格。 – Andrey

0

这取决于您在servlet容器上使用的EL版本。如果使用Tomcat 6,则包含EL 2.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 Using EL 2.2 with Tomcat 6.0.24