一、差異:
1、非sessionForm:
點擊添加,發送POST請求,根據流程會調用formBackingObject(),創建一個新的表單對象(假設新建表單的列表記錄為2條),
之後呼叫bindAndValidate()方法將request參數綁定到表單對象中:
<1> 第一次添加時,頁面列表中的記錄和新建的表單列表中的記錄一致,所以綁定參數時不會出錯。
在後面的流程會呼叫isFormChangeRequest(重寫:添加動作返回true),
之後調用onFormChange(重寫:添加時,獲取表單后往list加入一條記錄),那麼showForm就會顯示3條。
<2> 第二次添加時,頁面列表已有3條記錄,但是該次的POST請求還會調用formBackingObject(),
重新創建一個表單(裏面只有2條記錄),那麼要將request參數綁定到表單對象的時候,
在第3條記錄時就會出現越界的錯誤。
2、sessionForm:
(1) 第一次添加時,會創建一個新的表單,同樣頁面列表記錄和新建的表單一致,所以綁定不會出錯,之後往表單添加一條記錄(共3條)。
(2) 第二次添加時,不會重新創建表單,而是從session中取得原表單(此時裏面已有3條記錄),所以和頁面的數據也一致,綁定不會出錯。
二、總結:
導致該差異的根本原因是
<1> sessionForm在每個請求到達時不會重複調用formBackingObject()創建新的表單,而是從session取得原表單(所以綁定時一致)。
<2> 非sessionForm則每次請求都會調用formBackingObject()創建新表單(綁定時會不一致)。
三、補充:
情況:在sessionForm的情況下(假設新建表單有2條記錄)
如果在瀏覽器的2個tab中均發送請求,(因為是同一表單,所以顯示均為2條記錄)
在第一個tab中點擊刪除,在第二個tab中點擊添加,則會報錯。
原因:第一個tab中刪除時,會取得原表單(2條記錄),和頁面記錄一致,綁定不會出錯,之後對列表刪除一條記錄,則此時表單只有1條記錄。
第二個tab中添加時,同樣取得原表單(1條記錄),但此時頁面有2條記錄,所以綁定時第2條記錄會出現越界錯誤。