5

BalusC の素晴らしい 2006 年の投稿http://balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.htmlに含まれる情報を、Optimus Prime のさらに以前の投稿http://cagataycivici.wordpress.com/2005と正しく組み合わせた場合/12/28/jsf_component_s_value_local/次の結果が得られました。

私の理解:

  1. APPLY_REQUEST_VALUES フェーズでは、
    • 入力値は、UI コンポーネントの submitValue プロパティに設定されます (例: inputComponent.setSubmittedValue ("test"))。
  2. PROCESS_VALIDATIONS フェーズでは、
    • 必要に応じて、submittedValue プロパティ (おそらく inputComponent.getSubmittedValue ()) から同じ値が読み取られ、変換に使用されます。
    • 変換が成功またはスキップされた場合、結果はコンポーネントの値プロパティに設定されます(例: inputComponent.setValue ("test"))。
    • また、submittedValue はすぐに再度消去されます (例: inputComponent.setSubmittedValue (null)) 。
    • (変換された) 値は、UI コンポーネント (おそらく inputComponent. getValue() )の value プロパティから読み取られ、検証されます。
    • 検証後、バッキング Bean/モデルの格納された値が読み取られ (myBean.getInputValue () など)、新しく変換および検証された値と比較されます異なる場合、valueChangeListener メソッドが呼び出されます。
  3. UPDATE_MODEL_VALUES フェーズでは、
    • 新しく変換され、検証された値は、最終的にバッキング Bean のプロパティ フィールドに格納されます(例: myBean.setInputValue ("test"))。

質問:

  • これは正しいです?
  • POST とバッキング Bean への入力値の保存の間で何が行われるかを完全に理解するには、何か不足しているものはありますか?
  • 入力コンポーネントで immediate="true" を使用すると、これらのイベントを APPLY_REQUEST_VALUES フェーズにシフトするだけですか? それとも、イベントのタイミング/順序以上のものを変更しますか?
4

1 に答える 1

4

ほぼ正しい。コンポーネントのローカル値は、変換検証が成功した場合にのみ設定されます。その後、送信された値は に設定されnullます。検証フェーズのプロセス全体は、メソッド内のかなり自己文書化されたUIInput#validate()方法で見つけることができます (行番号は JSF 2.1 API に準拠しています)。

934    public void validate(FacesContext context) {
935 
936         if (context == null) {
937             throw new NullPointerException();
938         }
939 
940         // Submitted value == null means "the component was not submitted
941         // at all".  
942         Object submittedValue = getSubmittedValue();
943         if (submittedValue == null) {
944             return;
945         }
946 
947         // If non-null, an instanceof String, and we're configured to treat
948         // zero-length Strings as null:
949         //   call setSubmittedValue(null)
950         if ((considerEmptyStringNull(context)
951              && submittedValue instanceof String 
952              && ((String) submittedValue).length() == 0)) {
953             setSubmittedValue(null);
954             submittedValue = null;
955         }
956 
957         Object newValue = null;
958 
959         try {
960             newValue = getConvertedValue(context, submittedValue);
961         }
962         catch (ConverterException ce) {
963             addConversionErrorMessage(context, ce);
964             setValid(false);
965         }
966 
967         validateValue(context, newValue);
968 
969         // If our value is valid, store the new value, erase the
970         // "submitted" value, and emit a ValueChangeEvent if appropriate
971         if (isValid()) {
972             Object previous = getValue();
973             setValue(newValue);
974             setSubmittedValue(null);
975             if (compareValues(previous, newValue)) {
976                 queueEvent(new ValueChangeEvent(this, previous, newValue));
977             }
978         }
979 
980     }

コンポーネントのimmediate属性に関してはUIInput、はい、これは検証をリクエスト値の適用フェーズに移すだけです。UIInput#processDecodes()とのソース コードも参照してください。UIInput#processValidators()にチェックがありUIInput#isImmediate()ます。

于 2013-03-28T21:01:35.360 に答える