簡介
編輯界面提交後,一些沒有被編輯的屬性,會設爲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對象中的數據會疊加,所以要清空一次.