3

日付の範囲を指定するために double フィールドを使用しているJSF 2のフォームがあります。その目的は、ユーザーが 2 番目の日付より前の最初の日付を選択できないようにすることです。p:calendarそのため、コンポーネントを使用して、フォームが送信される前に検証を実行したいと考えています。最初のコンポーネントに内部的にアクセスして日付を比較するために、バリデーターを 2 番目のカレンダー入力に関連付けます。

ここに私のxhtmlページがあります:

<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:ui="http://java.sun.com/jsf/facelets"
    xmlns:p="http://primefaces.org/ui">

<h:head />
<h:body>
    <h:form id="date_form">
        <p:calendar id="date1input" value="#{dateTestBean.date1}" />
        <p:calendar value="#{dateTestBean.date2}" validator="dateValidator">
            <f:attribute name="date1" value="#{date1input}" />
        </p:calendar>
        <p:commandButton value="Submit" action="#{dateTestBean.submit}"
            ajax="false" />
    </h:form>
</h:body>
</html>

私のマネージドBean:

@ManagedBean
@ViewScoped
public class DateTestBean {

    private Date date1;

    private Date date2;

    public Date getDate1() {
        return date1;
    }

    public void setDate1(Date date1) {
        this.date1 = date1;
    }

    public Date getDate2() {
        return date2;
    }

    public void setDate2(Date date2) {
        this.date2 = date2;
    }

    public void submit() {
        System.out.println("Submited " + date1 + " " + date2);
    }

}

私のバリデータークラス:

@FacesValidator(value = "dateValidator")
public class DateValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component,
            Object value) throws ValidatorException {
        System.out.println(((UIInput) context.getViewRoot().findComponent(
                "date_form:date1input")).getValue());
        UIInput date = (UIInput) component.getAttributes().get("date1");
        System.out.println(date);
        //Will perform date comparison
    }
}

2013-10-10最初の日付と2013-10-122 番目の日付として送信する出力は次のとおりです。

木曜日 10 月 10 日 00:00:00 CEST 2013

ヌル

提出済み Thu Oct 10 00:00:00 CEST 2013 Sat Oct 12 00:00:00 CEST 2013

これは、他の入力コンポーネントの場合と同様に、コンポーネントf:attributeのタグが機能していないことを示唆しています。ただし、ビュー ルート経由で最初のカレンダーにアクセスできますが、検証するコンポーネントのクライアント ID のパス全体を知る必要があります。両方の値は後で問題なくマネージド Bean に設定されます。p:calendar

回避策は、最初の日付が変更されたときに ajax 呼び出しを使用してモデルに配置し、UIInput を送信する代わりに日付自体として送信することf:attributeです (私はすでにそのようにしています)。

より良い方法はありませんか?おそらく、この場合のように単一のコンポーネントに結合する必要がありますか?

4

2 に答える 2

2

あなたのコードから、

<p:calendar id="date1input" ... />
<p:calendar ...>
    <f:attribute name="date1" value="#{date1input}" />
</p:calendar>

#{date1input}では表されませんid="date1input"。これらのコード例に示されているように、 で表されbinding="#{date1input}"ます。

それに応じて修正します。

<p:calendar binding="#{date1input}" ... />
<p:calendar ...>
    <f:attribute name="date1" value="#{date1input}" />
</p:calendar>

以下も参照してください。

于 2013-10-30T13:10:32.600 に答える