摘要: 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返回類型,後面將詳細介紹。