struts2 中 paramsPrepareParamsStack 攔截器


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配置文件中的內容

clip_image001[9]


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM