Struts2的整體流程(下)

摘要: Struts2的整體流程.........

    
    前面一直在說Action可以是一個普通的Java類,與Servlet API完全分離,但是爲了實現業務邏輯,Action需要使用HttpServletRequest內容。
    
    Struts 2設計的精巧之處就是使用了Action代理,Action代理可以根據系統的配置,加載一系列的攔截器,由攔截器將 HttpServletRequest參數解析出來,傳入Action.同樣,Action處理的結果也是通過攔截器傳入 HttpServletResponse,然後由HttpServletRequest傳給用戶。
    
    其實,該處理過程是典型的AOP(面向切面編程)的方式,讀者可以在後面詳細瞭解到。Struts 2處理過程模型如圖2所示。
   

 
                                                                         圖2 Struts 2處理過程模型
    
    *說明*
    
    攔截器是Struts 2框架的核心,通過攔截器,實現了AOP(面向切面編程)。使用攔截器,可以簡化Web開發中的某些應用,例如,權限攔截器可以簡化Web應用中的權限檢查。
    
    業務控制器Action
    
    業務控制器Action是由開發者自己編寫實現的,Action類可以是一個簡單的Java類,與Servlet API完全分離。Action一般都有一個execute()方法,也可以定義其他業務控制方法,詳細內容將在後面介紹。
    
    Action的execute()返回一個String 類型值,這與Struts 1返回的ActionForward相比,簡單易懂。Struts 2提供了一個ActionSupport工具類,該類實現了Action接口和validate()方法,一般開發者編寫Action可以直接繼承 ActionSupport類。編寫Action類後,開發者還必須在配置文件中配置Action.一個Action的配置應該包含下面幾個元素:
    
    1、該Action的name,即用戶請求所指向的URL.
    
    2、Action所對應的class元素,對應Action類的位置。
    
    3、指定result邏輯名稱和實際資源的定位。
    
    Action是業務控制器,筆者建議在編寫Action的時候,儘量避免將業務邏輯放到其中,儘量減少Action與業務邏輯模塊或者組件的耦合程度。
    
    業務模型組件
    
    業務模型組件可以是實現業務邏輯的模塊,可以是EJB、 POJO或者JavaBean,在實際開發中,對業務模型組件的區分和定義也是比較模糊的,實際上也超出了Struts 2框架的範圍。不同的開發者或者團隊,都有自己的方式來實現業務邏輯模塊,Struts 2框架的目的就是使用Action來調用業務邏輯模塊。例如一個銀行存款的業務邏輯模塊,如代碼3所示。
    
    代碼3 模擬一個銀行業務的實現模塊
    
    package ch3;
    
    public class Bank {
    
    //定義銀行賬戶
    
    private String accounts;
    
    //定義操作金額
    
    private double money;
    
    //屬性的getter和setter方法
    
    public String getAccounts() {
    
    return accounts;
    
    }
    
    public void setAccounts(String accounts) {
    
    this.accounts = accounts;
    
    }
    
    public double getMoney() {
    
    return money;
    
    }
    
    public void setMoney(double money) {
    
    this.money = money;
    
    }
    
    //模擬銀行存款方法
    
    public boolean saving(String accounts, double money) {
    
    //調用DAO等模塊讀寫數據庫
    
    return dosomeing();
    
    }
    
    }
    
    上面實例在實際開發中沒有任何意義,這裏只是作爲業務邏輯模塊來說明,在執行saving(String accounts,double money)方法時,可以調用相應的數據庫訪問其他組件,來實現存款操作。使用Action調用該業務邏輯組件可以在execute()方法中實現,如代碼4所示。
    
    代碼4 業務控制器Bank_Saving_Action
    
    package ch3;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class Bank_Saving_Action extends ActionSupport {
    
    //定義銀行賬戶
    
    private String accounts;
    
    //定義操作金額
    
    private double money;
    
    public String execute() throws Exception {
    
    //創建Bank實例
    
    Bank bk=new Bank();
    
    //調用存款方法
    
    if (bk.saving(accounts, money)){
    
    return SUCCESS;
    
    }else{
    
    return ERROR;
    
    }
    
    }
    
    //屬性的getter和setter方法
    
    public String getAccounts() {
    
    return accounts;
    
    }
    
    public void setAccounts(String accounts) {
    
    this.accounts = accounts;
    
    }
    
    public double getMoney() {
    
    return money;
    
    }
    
    public void setMoney(double money) {
    
    this.money = money;
    
    }
    
    Bank_Saving_Action 演示了對銀行存款業務邏輯組件的調用,這裏是通過在Action中創建業務邏輯組件實例的方式實現的。在實際開發中,可以使用靜態工廠獲得業務邏輯組件的實例或者使用IoC容器來管理。Action中不實現任何業務邏輯,只是負責組織調度業務邏輯組件。調用關係如圖3所示。
   

 
                                                                      圖3 調用業務邏輯組件
    
    *說明*
    
    業務控制器Action一般情況下不是直接創建業務邏輯組件實例,而是使用工廠模式或者是從Spring容器中獲得業務邏輯組件實例,這樣可以提高系統的性能。
    
    視圖組件
    
    Struts 1只能支持JSP作爲視圖資源,而Struts 2的進步之處就是可以使用其他視圖技術,如FreeMarker、Velocity等。通過前面的學習和示例,讀者會知道Action的返回結果只是一個簡單的字符串,也就是一個邏輯上的視圖名稱,要與實際視圖資源對應,必須通過配置文件來實現。
    
    在struts.xml配置文件中,每一個Aciton 定義都有name和class屬性,同時還要指定result元素。result元素指定了邏輯視圖名稱和實際視圖的對應關係。每個result都有一個 type屬性,前面介紹的struts.xml中並沒有顯式指定type值,即使用了默認的type類型:dispatcher,該結果類型支持JSP所謂視圖資源。
    
    對於Struts 2的視圖技術和result返回類型,後面將詳細介紹。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章