2013-03-28 48 views
4

如果我正確合併包含在BalusC最偉大的2006年後http://balusc.blogspot.ch/2006/09/debug-jsf-lifecycle.html與擎天柱的信息甚至更早發佈http://cagataycivici.wordpress.com/2005/12/28/jsf_component_s_value_local/我得到如下:何時在UIComponent上調用setValue和setSubmittedValue?

我的理解:

  1. 在APPLY_REQUEST_VALUES階段,
    • 將輸入值設置爲UI組件的submittedValue屬性(例如,inputComponent。setSubmittedValue(「test」))。
  2. 在PROCESS_VALIDATIONS相,
    • 相同的值從submittedValue中屬性(大概inputComponent。getSubmittedValue())讀出並用於轉化,如果需要的話。
    • 如果轉換成功或跳過,則結果設置爲組件的value屬性(例如,inputComponent。setValue(「test」))。
    • 此外,submittedValue中再次立即擦除(例如inputComponent。setSubmittedValue(空))
    • (轉換的)值是從UI組件的value屬性讀(大概inputComponent。的getValue())並經過驗證。
    • 確認後,讀取輔助bean /模型的存儲值(例如myBean。getInputValue()),並與新轉換和驗證的值進行比較。如果不同,則會調用valueChangeListener方法。
  3. 在UPDATE_MODEL_VALUES相,
    • 新轉換和驗證值被最終存儲在背襯bean的屬性字段(例如爲myBean。setInputValue( 「測試」))。

問題:

  • 這是正確的嗎?
  • 有沒有什麼東西缺少全面瞭解POST和輸入值保存在後臺bean之間的內容?
  • 對於輸入組件,立即=「真」,我們只是將這些事件轉移到APPLY_REQUEST_VALUES階段,還是我們改變的不僅僅是事件的時間/順序?

回答

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  } 

至於UIInput部件上的immediate屬性,是這僅僅是將這個驗證的應用請求值階段。另請參閱UIInput#processDecodes()UIInput#processValidators()的源代碼,在UIInput#isImmediate()上有一個檢查。

相關問題