2013-08-24 39 views
1

我正在使用JSF 2,PrimeFacces 3.4和CDI。我有2頁:page1.xhtmlpage2.xhtml。每個頁面都有自己的管理bean:Page1BeanPage2Bean作用域和@PostConstruct

page1.xhtml有一個<p:remoteCommand>actionListener顯示page2.xhtml

page2.xhtml包含<ui:include>下的3個組件和一個提交按鈕。這3個組件中的每一個都綁定到不同的託管bean Component1Bean,Component2BeanComponent3Bean。提交按鈕顯示page1.xhtml

這三個ComponentXBean s有一個@PostConstruct方法與一些初始化代碼。我嘗試了以下豆類的範圍:

  • @SessionScoped:一切工作正常單提交操作。當我重複它時,那些bean不會被@PostConstruct重新初始化,因爲它們是會話範圍的。
  • @ViewScoped@PostConstruct被多次調用。
  • @ConversationScoped:與@ViewScoped相同的行爲。

爲什麼@PostConstruct在視圖和會話範圍中多次調用?我怎麼能讓他們每次提交操作只被調用一次?

+0

當我清理公式並改進了問題的格式後,我開始相信你正在使用'binding'屬性將這些組件綁定到bean。這是真的?而且你正在使用比2.1.18更早的Mojarra版本?然後,以視圖範圍完全解釋您的問題的原因。 – BalusC

回答

0

每次在'preRender'下運行您的初始化代碼可能是不正確的。由於初始化將清除所需的數據。

將您的preRender從初始化中分離出來。你可以單獨掛鉤它們,或者有一個標誌只調用一次initialize()。

如果可能,避免使用會話範圍的bean;會話範圍是設計糟糕的Web應用程序和(以最簡單的形式)實現頁面間流程非常糟糕的方式的標誌。在網頁之間傳遞URL或POST參數以實現流量。

如果有必要,頁間參數可以是到存儲在HttpSession中的對象的唯一句柄。但是,如果沒有對應用程序真正具有全局性(例如「loggedInUser」)或由唯一分配的句柄引用,那麼不要將其轉儲到Session中。