王先國 何忠禮 王玉娟
中山大學新華學院 廣東 東莞 523133
目前,基于Struts2的模型驅動開發方法十分流行,但很多開發人員對其開發規范、工作原理、核心攔截器的組成和攔截機制知之甚少,這就導致開發效率低,且開發出的軟件質量差。基于此,本文詳細描述了Struts2的模型驅動工作原理,通過實例演示了基于Struts2的模型驅動的開發步驟,為開發人員提供一個模型驅動的開發示范。
Struts2是一個標準的MVC框架,它簡化了Web程序的開發過程,并且降低了程序的耦合度。Struts2體系結構如圖1所示。
StrutsPrepareAndExcute-Filter(Struts2核心控制器):它是Struts2的調度中心,由它決定是否處理客戶的Action請求。
Interceptor(攔截器):攔截器是Stuts2的基石,它是一些無狀態的類,攔截器可以自動攔截客戶發送的Action請求。客戶的所有Action請求,在到達Action之前,首先要執行一序列攔截器,在圖1中,客戶的Action請求到達Action以前,先要執行攔截器1、攔截器2、攔截器3。
Action(控制器):在圖1中,客戶的請求經過攔截器1、攔截器2、攔截器3后,才到達Action控制器。Action是程序員編寫的控制器,用來處理客戶的Action請求。
Resul(結果)t:Action控制器執行完后,返回一個字符串,這個字符串就是邏輯視圖。Result根據邏輯視圖的值,去調用相應的物理視圖。Struts2中支持多種視圖類型,比如Java ServerPages(JSP)、FreeMarker等[1]。

圖1 Struts2的體系結構
Struts2的模型驅動工作流程如圖2所示。

圖2 Struts2模型驅動工作流程圖
客戶端向Struts2控制器發送一個Action請求,比如,表單提交;Struts2控制器調用屬性攔截器(params),屬性攔截器獲取表單請求參數,并將表單參數封裝為Model(一個普通的Bean);當執行流程到達Action時,Struts2控制器調用模型攔截器(ModelDriven),模型攔截器獲取模型對象,并將模型對象壓入值棧的棧頂;Struts2控制器根據Action執行后返回的結果值(邏輯視圖),調用相應的JSP頁面;JSP頁面將結果返回(response)給客戶[2]。
這里的模型就是一個普通的Bean(People對象),在模型中必須定義setter和getter方法。下面是People類的源代碼:
packagewang;
publicclassPeople{
Stringname;//本類中的屬性名必須與表單中的屬性name的值一致
intage; //本類中的屬性名必須與表單中的屬性name的值一致
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
} }
使用模型驅動時,繼承ActionSupport類或者實現接口Action時,必須實現模型驅動接口ModelDriven。在控制器中,必須重寫execute()方法 和 getModel()方法[3]。 下面是PeopleAction的源代碼。
packagewang.action;
importwang.People;
importcom.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
publicclassPeopleActionextendsActionSupportimplementsModelDriven<People>{
Peoplepeople=newPeople ();// 必須初始化
publicStringexecute()throwsException{
returnSUCCESS; //此方法必須重寫
}
publicObjectgetModel(){//此方法必須重寫
returnpeople;
} }
建立一個向Action提交請求的表單頁面,下面是請求頁面(addPeople.jsp)的源代碼。
<%@taglibprefix="s"uri="/struts-tags"%>
<html>
<body>
<h1>基于Struts2模型驅動</h1>
<s∶formaction="peopleAction">
<s∶textfieldname="name"label="姓名"/>
<s∶textfield name="age"label="年齡 "value=""/>
<s∶submit/>
</s∶form>
</body>
</html>
建立一個向Action提交請求的表單頁面,下面是響應頁面(success.jsp)的源代碼。
<%@taglibprefix="s"uri="/struts-tags"%>
<html>
<body>
<h1>基于Struts2模型驅動</h1>
姓名∶<s∶propertyvalue="name"/><br>
年齡∶<s∶propertyvalue="age"/><br>
</body>
</html>
<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEstrutsPUBLIC
"-//Apache Software Foundation//DTD StrutsConfiguration2.0//EN"
"http∶//struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.dev-Mode"value="true"/>
<package name="default"namespace="/"extends="struts-default">
<actionname="peopleAction"class="wang.action.PeopleAction">
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
本文詳細展示了基于Struts2的模型驅動的工作原理、程序執行流程、開發規范,用一個完整的實例,清晰地再現了程序開發的每個環節、步驟和規范,為程序開發人員提供了一個基于Struts2的模型驅動的樣板,降低了開發過程中出現的錯誤率,極大地提高了程序開發效率。