2012-05-23 29 views
0

叫我創造的JSF2用戶認證,並在每一頁上顯示我的頭包含此:H:在JSF鏈接就會自動

<c:if test="#{user.loggedIn}"> 
    <li><h:link value="Log out" outcome="#{user.logout}"/></li> 
</c:if> 

用戶指的UserBean,並註銷()只是使會話無效,併發出重定向到登錄頁面。因此,當用戶登錄時,user.loggedIn成爲true,並且顯示註銷鏈接,但立即被調用,用戶立即註銷。

有沒有人有一個想法,爲什麼會發生這種情況?我想過使用h:commandLink,但它需要一個表單,我試圖避免它。

編輯: 我複製了錯誤的代碼...只是我的運氣花了一個小時後,找出爲什麼用戶無法登錄。您可以查看以前的修訂版以查看錯誤的代碼。

回答

4

當JSF標記不能被識別和解析時,會發生這種情況,並且它可以有效地呈現爲純文本,其中所有的EL表達式都被評估爲值表達式。它會在你的情況基本上打印 #{user.logout()}返回的值。但是,雖然EL這樣做,但方法的邏輯當然是被調用的。

如果刪除action屬性,打開瀏覽器頁面,並做了查看源,然後你會看到一個未解析<h:commandLink>標記,而不是生成的HTML <a>元素。

確保您在視圖文件的根標記中的右側URI上定義了h: XML名稱空間。

xmlns:h="http://java.sun.com/jsf/html" 


更新:在<h:link>不intented調用豆的行動。它被認爲是一個純粹的GET鏈接。 outcomeper specification評估爲值表達式,而不是方法表達式。 outcome必須表示鏈接必須導航到的視圖ID。當EL將你的方法評估爲值表達式時,它當然立即被調用。只要繼續使用<h:commandLink>結合重定向。另外的好處是這不是可收藏的,也不是searchbot可以抓取的。

+0

我很抱歉,但我複製了錯誤的代碼(我在試驗解決方案時使用了一個代碼)。請參閱上面的修改。 – Misa

+0

''無法調用bean操作。這純粹是頁面到頁面導航的GET鏈接。 「結果」是按規範評估爲值表達式。只需使用''結合重定向。其他優點是它不可收藏,也不可搜索。 – BalusC

+0

好的,不知道。謝謝! – Misa

-1

這是jsfToolbox的例子:

<h:commandLink id="link1" 
       value="#{bundle.checkoutLabel}" 
       action="#{shoppingCartBean.checkout}" /> 

獲取註銷時結束擺脫你的括號中。

+0

我得到一個服務器錯誤:「類'project.UserBean'沒有屬性'註銷'。」我應該使用bean中的方法做一些特殊的事情嗎? – Misa

+0

這隻能證實我的答案。 EL正在將它評估爲一個值表達式,並且在沒有括號的情況下,它正在尋找一個不存在的'getLogout()'方法。 – BalusC

+0

查看BalusC的回答。 –