王先国 何忠礼 王玉娟
中山大学新华学院 广东 东莞 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的模型驱动的样板,降低了开发过程中出现的错误率,极大地提高了程序开发效率。