2013-04-09 110 views
3

我很好奇如何讓JSF只在頁面加載加載一定的業務邏輯當我點擊一個按鈕(ActionEvent)未運行這段代碼或執行AjaxBehaviorEventManaged Bean的 - 僅在頁面加載執行代碼

我的bean在@RequestScoped中,使用JSF 2.1和Primefaces。

由於ActionEventAjaxBehaviorEvent後來被調用,我不知道如何告訴Bean在@PostConstruct它是因爲事件而被調用。

是因爲bean放在了錯誤的範圍內?

+0

注入ViewScoped Bean上有@PostConstruct代碼到你RequestScoped豆。可能有更好的方法。所以請稍等... – 757071 2013-04-09 12:20:22

+0

我的ViewScoped出現嚴重問題。它總是需要一個序列化的類,我覺得anoying;) - 另外它會導致sligth問題,'java.sql' – ctekk 2013-04-09 12:22:04

回答

7

只有在 頁面加載 GET請求執行代碼

查一下(後)構造函數,如果FacesContext#isPostback()回報false

@PostConstruct 
public void init() { 
    if (!FacesContext.getCurrentInstance().isPostback()) { 
     // ... 
    } 
} 

在即將到來的JSF 2.2,你可以通過該方式使用這個新的<f:viewAction>代替。

<f:viewAction action="#{bean.init}" onPostback="false" /> 

是因爲放置在錯誤的範圍bean的?

取決於具體的功能要求。另請參見How to choose the right bean scope?


我有嚴重的問題ViewScoped。它總是需要一個序列化類我覺得這是煩人;) - 此外,它會導致「java.sql中的」

sligth問題,這說明一個問題用自己的代碼設計,而不是與視圖範圍。 JDBC代碼不屬於JSF託管bean。像Connection等JDBC資源應該被never, never聲明爲實例變量。

+0

感謝您的詳細解答。我會讀到,但現在需要一段時間。因此,我現在又得到了另一個問題:我應該使用JDBC內部的try-finally塊還是一個單獨的類,並從bean中調用它(這是否會有所不同?)?或者更好地切換到JPA或類似的東西? – ctekk 2013-04-09 12:38:25

+0

第一步是停止將JDBC資源聲明爲實例變量。他們不可序列化應該已經足以暗示你以錯誤的方式做了事情。以後你做什麼取決於你。牢記可重用性,可測試性和可維護性。仔細閱讀鏈接的文章及其所有鏈接。 – BalusC 2013-04-09 12:40:06

1

一個RequestScoped bean是從客戶端發送到服務器的每個請求重新創建,這就是爲什麼在執行中@PostConstruct邏輯每次你點擊一個按鈕,我想你應該使用一個ViewScoped豆,這是對每個創建頁面加載。

您可以找到有關此主題的這個環節上寫的BalusC一個很好的教程:http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ManagedBeanScopes

相關問題