2012-05-25 23 views
1

我正在使用帶有richfaces的JSF。我正在使用core的convertDateTime將inputText轉換爲Date。JSF中convertDateTime的奇怪行爲

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield"> 
    <f:convertDateTime pattern="yyyy-MM-dd" /> 
</h:inputText> 

creationDateSearchBean是類型的Java util的日期,我使用一個jQuery datpicker來填充輸入字段。

問題是它不能正常工作。當我沒有輸入任何日期(空輸入字段)提交表單時,一切正常。但是,當我選擇日期時,調用不會到達bean(在調試模式下進行測試)。該頁面只是刷新自己,沒有任何異常/在服務器端登錄。

我實現了一個快速LifeCycleListener這表明以下的輸出:

隨着充滿日期輸入字段:

START PHASE RESTORE_VIEW(1) 
END PHASE RESTORE_VIEW(1) 
START PHASE APPLY_REQUEST_VALUES(2) 
END PHASE APPLY_REQUEST_VALUES(2) 
START PHASE PROCESS_VALIDATIONS(3) 
END PHASE PROCESS_VALIDATIONS(3) 
START PHASE UPDATE_MODEL_VALUES(4) 
END PHASE UPDATE_MODEL_VALUES(4) 
START PHASE INVOKE_APPLICATION(5) 
END PHASE INVOKE_APPLICATION(5) 
START PHASE RENDER_RESPONSE(6) 
END PHASE RENDER_RESPONSE(6) 

空日期:

START PHASE RESTORE_VIEW(1) 
END PHASE RESTORE_VIEW(1) 
START PHASE APPLY_REQUEST_VALUES(2) 
END PHASE APPLY_REQUEST_VALUES(2) 
START PHASE PROCESS_VALIDATIONS(3) 
END PHASE PROCESS_VALIDATIONS(3) 
START PHASE RENDER_RESPONSE(6) 
END PHASE RENDER_RESPONSE(6) 

這是明確在第二種情況下缺少兩個步驟。我對JSF非常陌生,對它的內部工作沒有多少了解。此外,沒有驗證/轉換例外。我被困在這裏,我不知道在哪裏尋找解決方案。任何幫助表示讚賞。

回答

2

更新模型和調用應用程序時不顯示日期的原因是因爲您的驗證失敗,在驗證失敗的情況下,未使用UI內容更新模型,並且不會調用應用程序邏輯(您的自定義代碼)。

如果你已經在你的屬性文件添加錯誤信息,然後添加以下

javax.faces.converter.DateTimeConverter.DATE=value ({0}) must be a date 

否則

<h:inputText styleClass="datepicker" value="#{searchBean.creationDate}" id="inputfield" converterMessage="Please Enter creation date in yyyy-MM-dd format"> 
    <f:convertDateTime pattern="yyyy-MM-dd" /> 
</h:inputText> 

這將使顯示錯誤消息時驗證失敗。

當您提交null作爲日期時,您將收到轉換錯誤。

+0

什麼樣的驗證。在這種情況下,是不是應該拋出一個可見的異常? –

+0

@UmerHayat更新了我的文章 – mprabhat

+1

@UmerHayat您還需要在頁面中指定消息顯示。在頁面中使用''或者使用'「/>',那麼只有它會顯示在頁面 –

1

如果您使用的是JSF 1.2和RichFaces 3.x,然後使用rich:calendar標記組件來處理日期,它將在後臺使用jquery來顯示。在你的榜樣使用它:

<rich:calendar id="calCreationDate" popup="true" 
    value="#{searchBean.creationDate}" 
    enableManualInput="true" 
    locale="#{application.locale}" 
    datePattern="#{application.datePattern}" 
    showApplyButton="false" /> 

在我的應用程序:

public class ApplicationBean { 
    private Locale locale; 
    private String datePattern; 

    public ApplicationBean() { 
     locale = new Locale("es"); //for spanish 
     datePattern = "dd/MM/yyyy"; //you can change it to yyyy-MM-dd 
    } 
} 

凡ApplicationBean中有ApplicationScope。

此處瞭解詳情: