2011-08-25 91 views
1

是否可以在EL中使用FacesContext或其他隱式對象如request,session等嵌套如下所示的變量調用?這當然不起作用。我得到這個錯誤EL中的嵌套變量

錯誤解析:#{myBean.myMethod(。#{FacesContext.getCurrentInstance()getViewRoot()getViewId()})}

這種嘗試

<ui:include src="#{myBean.myMethod(#{FacesContext.getCurrentInstance().getViewRoot().getViewId() })}"> 
+0

至於嘗試接受答案:未註冊的用戶帳戶由瀏覽器cookie支持,因此綁定到特定的PC /瀏覽器。您需要通過OpenID註冊您的用戶帳戶,以便您可以從所有PC /網頁瀏覽器使用相同的用戶帳戶。否則,您需要從發佈問題的地方返回PC/webbrowser(如果cookie未被刪除)。一旦你註冊了你的用戶賬戶,管理員將能夠將任何懸空的未註冊用戶賬戶與你新註冊的賬戶合併。 – BalusC

回答

3

這實際上是無效的EL語法。嵌套的#{}是不允許的。只需將整個表達式放入相同的#{}即可。另外,#{FacesContext}在Facelets的EL範圍中不存在,它是#{facesContext},它已經是當前實例。此外,如果它已經是getter方法,則不一定需要用圓括號指定整個方法名稱。

所以,這應該做

<ui:include src="#{myBean.myMethod(facesContext.viewRoot.viewId)}"> 

(注意,這仍然需要從Servlet 3.0/EL 2.2支持的目標容器)

1

爲了增加BalusC的答案,我要評論作爲一般規則,儘可能簡化EL表達式,並將所有邏輯(特別複雜的邏輯)放入輔助bean的Java中。爲什麼不只是在MyBean中創建一個新的Java方法,它可以實現你想要的並且只是指向那個?

EL功能非常強大,但在我看來,它的功能正在誘惑您將業務邏輯放入表示層。

+0

雖然我絕對同意,應該非常小心,不要把一盎司的商業邏輯放到一個視圖中,那些決定是否應該渲染某些東西的表達式肯定會在家中。並不是每個表達式都應該是對一個屬性的簡單綁定。也意識到* real *業務邏輯也不應該在backing bean中,這幾乎總是xhtml視圖和一些業務服務之間的管道。 –