2012-05-04 27 views
1

我使用convertDateTime標籤DataTable中每個組件的Ajax請求。將託管bean屬性連接到timezone屬性。在這種情況下,每個Ajax請求都會重新創建Managed Bean。使用convertDateTime標籤並重新創建Managed Bean的

管理bean範圍視圖作用域。

<h:column> 
    <f:facet name="header"> 
     <h:outputLabel value="Date"/> 
    </f:facet> 
    <h:outputText value="#{item.date}"> 
     <f:convertDateTime timeZone="#{myBean.timezone}" locale="tr" pattern="dd.MM.yyyy"/> 
    </h:outputText> 
</h:column> 




@ManagedBean(name="myBean") 
@ViewScoped 
public class MyBean { 

    @PostConstruct 
    public void initBeanMethod(){ 
     System.out.println("PostConstruct method is called..."); 
    } 

    private TimeZone timezone = TimeZone.getDefault(); 

    public TimeZone getTimezone() { 
     return timezone; 
    } 

    public void setTimezone(TimeZone timezone) { 
     this.timezone = timezone; 
    } 

顯示每個AJAX請求後,下面的輸出:「PostConstruct方法被稱作......」

你有關於每個請求豆再創造的想法?

注:我爲我的英語不好道歉:)

回答

2

在綁定到一個視圖標籤處理器的屬性,這將確實發生作用域bean。這與JSF issue 1492有關,它爲即將到來的JSF 2.2修復。簡而言之,視圖範圍的bean存儲在視圖狀態中。所以當視圖被恢復時,視圖範圍的bean還不可用。但是,標記處理程序(和JSF組件的idbinding屬性)建立視圖中運行,所以它會隱式地創建一個全新的視圖作用域bean實例。恢復視圖後,這些新的視圖範圍的bean實例將被視圖狀態中的視圖取代。另見@ViewScoped fails in tag handlers

有幾種方法來解決這個特定的問題,所有人都在這個答案概述:How to set converter properties for each row of a datatable?你的具體情況有可能是一個更簡單的解決方案:你似乎要使用系統默認的時區中的所有日期時間轉換器。您也可以通過在web.xml中設置以下上下文參數來實現此目的:

<context-param> 
    <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> 
    <param-value>true</param-value> 
</context-param> 
+0

Hi BalusC。感謝您的啓發迴應。我已經使用上下文參數,但這不足以獲得準確的結果。您的共享鏈接將仔細閱讀。再次感謝你... – hakdogan