【Strurts2】【編輯提交後的數據丟失】【prepare攔截器】

簡介

編輯界面提交後,一些沒有被編輯的屬性,會設爲null而提交,導致該屬性的數據丟失.(對象id,依然要用hidden標籤來寫出)

prepare攔截器

  • 作用:在執行某方法前,會先執行該攔截器的方法;
  • 思路:修改操作執行順序:
    • 在執行修改Action方法前
    • 注入參數,獲得id
    • 通過prepare攔截器的方法,得到該id對應的對象
    • 再次注入參數,將該對象修改過的屬性覆蓋,(沒修改過的就不變)
    • 執行修改方法
  • 使用:
    1.BaseAction實現於接口Preparable,並覆蓋方法
 public class BaseAction extends ActionSupport implements Preparable{
    public void prepare() throws Exception {
    //該方法會在訪問說有的Action前使用,
    }

}

2.Employee中,對修改方法調用去前,聲明從數據庫獲取對象

public class EmployeeAction extends BaseAction {
    public String save() {
        //修改對象的業務邏輯
    }
    //調用save前執行該方法
    public void prepareSave()  {
        if(employee.getId()!=null) {
        employee=employeeService.get(employee.getId());
        //要將對象中的實例屬性設爲空,防止第二次接收參數,修改操作時候出錯
        employee.setDept(null);
    }
    //將屬性對象清空
    employee.getRoles().clear();
}

3.struts.xml中修改攔截器stack
defaultStack:執行prepare,再注入參數
paramsPrepareParamsStack:先注入參數,再執行prepare,再注入參數.

<default-interceptor-ref name="paramsPrepareParamsStack"/>

注意點

  • 將爲實例對象的屬性,設爲null
    原因:若不清空,從數據庫中提取後,該屬性爲持久化狀態,再由param攔截器注入參數,會改變該持久化對象的id值.Hibernate中,持久化狀態可以邊髒,但不能修改其id值.
  • 將爲List對象的屬性,清空
    原因:paramPerpareParm攔截器會兩次注入值,導致List對象中的數據會疊加,所以要清空一次.
發佈了73 篇原創文章 · 獲贊 12 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章