1

私はリッチフェイスでJSFを使用しています。コア IP の convertDateTime を使用して、inputText を Date に変換しています。

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

SearchBeanのcreationDateはJava util Date 型であり、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)

2 番目のケースでは、2 つのステップが欠落していることは明らかです。私は JSF に非常に慣れていないため、JSF の内部動作についてはよくわかりません。さらに、検証/変換の例外はありません。私はここで立ち往生しており、どこで解決策を探すべきかわかりません。どんな助けでも大歓迎です。

4

2 に答える 2

2

日付を入力しない場合、モデルを更新してアプリケーションを呼び出す理由が表示されないのは、検証が失敗したためです。検証が失敗した場合、モデルは UI コンテンツで更新されず、アプリケーション ロジック (カスタム コード) は呼び出されません。

.properties ファイルにエラー メッセージを追加した場合は、次を追加します。

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 を日付として送信すると、変換エラーが発生します。

于 2012-05-25T07:57:37.340 に答える
1

JSF1.2とRichFaces3.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がある場合。

詳細はこちら:

于 2012-05-25T14:53:37.777 に答える