2011-09-08 34 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