struts2二次參數攔截器內容: 規定了請求的執行順序
在struts2中,其攔截器為框架精華部分,而二次參數攔截器paramsPrepareParamsStack 對於解決數據回顯,對象修改屬性丟失的問題悠着很良好的處理機制。
在 struts-default.xml 中的默認攔截器配置中有以下部分(可自行查找源碼,通常為:struts-2.5.2\src\core\src\main\resources):
<interceptor-stack name="paramsPrepareParamsStack"> <interceptor-ref name="exception"/> <interceptor-ref name="alias"/> <interceptor-ref name="i18n"/> <interceptor-ref name="checkbox"/> <interceptor-ref name="datetime"/> <interceptor-ref name="multiselect"/> <interceptor-ref name="params"/> <!-- 把jsp里提交的參數封裝action里面對象--- (1) --> <interceptor-ref name="servletConfig"/> <interceptor-ref name="prepare"/> <!-- 前置方法---------------------------- (2) --> <interceptor-ref name="chain"/> <interceptor-ref name="modelDriven"/> <!-- 把非空的model放置棧頂---------------- (3) --> <interceptor-ref name="fileUpload"/> <interceptor-ref name="staticParams"/> <interceptor-ref name="actionMappingParams"/> <interceptor-ref name="params"/> <!-- 把jsp提交參數封裝action里面對象------- (4) --> <interceptor-ref name="conversionError"/> <!-- 轉換異常 --> <interceptor-ref name="validation"> <!-- 驗證異常 --> <param name="excludeMethods">input,back,cancel,browse</param> </interceptor-ref> <interceptor-ref name="workflow"> <!-- 處理上面2個異常 --> <param name="excludeMethods">input,back,cancel,browse</param> <!-- 排除不需要的 --> </interceptor-ref> </interceptor-stack>
(1)、關於 <interceptor-ref name="params"/>
把頁面提交的參數封裝到Action中的對象里面,只有在Action中聲明的屬性才能接受和封裝,即只接受給定的屬性,(多個參數時過濾后也只封裝與給定條件吻合的)
同時Action必須提供get,set方法.
//例: private Long id; public Long getId() { return id;} public void setId(Long id) { this.id = id;}
進入此Action中,棧頂元素為:EmployeeAction
(默認情況下訪問那個action,那個action就在棧頂)
(2)、<interceptor-ref name="prepare"/>
EmlpoyeeAction.java
/** * 使用action中配置的攔截器相應函數 * 自動在input方法之前自動執行 * 完成參數回顯 */ public void prepareInput() throws Exception { if (id != null) { employee = employeeService.get(id); // 回顯 } } // 自動在save方法之前自動執行 // 解決參數丟失的問題 public void prepareSave() throws Exception { if (id != null) { employee = employeeService.get(id); // 保證屬性不丟失關鍵代碼 } else { employee = new Employee(); } } // 最后執行public void prepare()方法 // 自動在所有strtus方法之前自動執行:攔截器的順序問題 @Override public void prepare() throws Exception { //相關功能,或者留空 }
(3)、<interceptor-ref name="modelDriven"/> 驅動模型后,伴隨壓棧操作
EmployeeAction.java
@Override public Employee getModel() { return employee; //這里返回preoare經過驗證拿到的對象 }
進入此Action中,棧頂元素為:Employee
(因為在經過二次參數攔截器的時候,里面無論是從數據庫拿還是new一個對象,此時都有一個相對於之前內容不相同的同一類對象,所以,會執行壓棧操作,將拿到的對象放在棧頂)
重點:
<interceptor-ref name="params"/>--------------------------------------------------------------------------------(4)
裝的對象(1),和經過之前prepareXxx()方法獲取到的對象(2),
即此時棧頂的對象(2)進行屬性的對比,如果1中的屬性缺失,會將缺失屬性補足,然后進行后續操作.
最后:
執行Action中頁面調用的方法,返回結果視圖,進行頁面跳轉.
另外,配置玩二次參數攔截器之后,再檢查一遍struts.xml配置文件中的內容