3

アプリケーションに JSF v1.2 を使用しています。これは、数日前に回答済みとしてマークしたこのスレッド (BalusC が回答) と似たような質問です。

JSF 1.2 ライフサイクルの理解: InvokeApplication フェーズで ValueChangeListener メソッドを実行する

dataTable今回はいいえ、 adropdownと apanelgridを含むフォームのみoutputTextです。dropdownユーザーが選択した値に基づいて、outputText内にあるいくつかのフィールドpanelGridに入力する必要があります。

以下は、ドロップダウンのコードです。

<h:selectOneMenu id="drpDownLoans" value="#{loanBean.loanId }" valueChangeListener="#{loanBean.getLoanDetails }"  onchange="submit()">
        <f:selectItem itemLabel="--Select--" itemValue="0"/>
        <f:selectItems value="#{loanBean.availableLoans }"/>
    </h:selectOneMenu>  

ドロップダウン値の変更時。DB からデータを取り込みたいのですoutputTextが、以下のコードは次のとおりです。

<h:panelGrid columns="2">
        <h:outputLabel id="lblLoanId" value="Loan Id"></h:outputLabel>
        <h:outputText id="txtLoanId" value="#{loanBean.loanId }"></h:outputText>
        <h:outputLabel id="lblROI" value="Rate of Interest (% pa)"></h:outputLabel>
        <h:outputText id="txtROI" value="#{loanBean.rateOfInterest }"></h:outputText>
        <h:outputLabel id="lblNOI" value="No. of Installments (months))"></h:outputLabel>
        <h:outputText id="txtNOI" value="#{loanBean.noOfInstallments }"></h:outputText>
    </h:panelGrid>

以下は、LoanBean.java で実行されるコードです。

public void getLoanDetails(ValueChangeEvent event){
    Integer value = (Integer)event.getNewValue();
    DataService service = new DataService();
    LoanBean loanBean = service.getLoanDetails(value);
    this.setLoanId(loanBean.getLoanId());
    this.setRateOfInterest(loanBean.getRateOfInterest());
    this.setNoOfInstallments(loanBean.getNoOfInstallments());
}

コードは完全に機能していますが、理由がわかりません:(

私の理解: Integer ie 0 および String ie null のデフォルト値を表示する必要があります

どうして

dropdownと の両方が要素outputTextに存在しformます。ドロップダウン値の変更時にフォームが送信されると、に存在するフィールドの値がデフォルトにpanelGrid設定されます。私はコンバーター/バリデーターを持っていないので、component#Value もforとfor になります。次にが実行され、すべての値がDB からフェッチされた値に基づいてコンテンツに設定されます。次に、フェーズ 4 で、db ヒットによってフェーズ 3 で設定されたすべての値を、Convertor/Validator の後に設定された component#value に基づいてデフォルト値にリセットする必要があります。integer0Stringnull0integernullStringValueChangeEventpanelGrid0integerと。null_ Stringでは、なぜ値がデフォルト値ではなく正しく入力されるのでしょうか?

ライフサイクルイベントに概念的に固執しました:(私の誤解で何が欠けているかを正確に指摘してください。

4

1 に答える 1

1

TLDR: フィールドは読み取り専用です

whichpanelGridへのバインドloanBeanは変更可能ですが、は、定義上読み取り専用であるpanelGrid出力コンポーネント ( のサブクラス) のみを使用しています。これらには、リクエスト値を処理するメソッド (つまり、と)javax.faces.component.UIOutputがありません。実際、フォームが送信されると、リクエストにはコンポーネントからデコードされた値が含まれません。UIInput.setSubmittedValueUIInput.getSubmittedValueUIInput.setValueOutputText

このため、ValueChangeListenerプロセス中にトリックを実行する必要はありません。モデル値の適用フェーズで上書きされることを心配することなく、モデル値を安全に更新できます。


UIInput Javadoc: http://docs.oracle.com/cd/E17802_01/j2ee/j2ee/javaserverfaces/1.2/docs/api/javax/faces/component/UIInput.html

デバッグ・フェーズ: http://www.ibm.com/developerworks/java/tutorials/j-jsf2/section7.html

于 2013-05-06T04:51:29.763 に答える