引言 传统的Web应用开发工具(asp、jsp)将页面显示、商业逻辑和数据处理大部分都集中在页面代码中,Web应用扩展维护比较困难,也不利于开发人员分工协作,在大型WEB应用开发中愈发显得力不从心。 MVC(Model-View-Controller)设计模式将页面显示、商业逻辑和数据处理相分离,最大限度的降低系统各部分之间的耦合性,从而增强系统的可扩展维护性,提高代码重用率,使系统的层次结构更加清楚,易于分工协作。而Struts是一个为开发基于MVC模式的应用架构的开源框架。
1、Struts框架的体系结构
1.1、MVC设计模式
MVC设计模式是一种“分治”的思想,它使应用程序的输入、处理和输出分开,把应用程序分成三个核心模块:模型(Model)、视图(View)和控制器(Controller)。Model用来储存应用程序的数据以及访问、维护这些数据的业务逻辑,View建立终端用户的表示层,Controller是模型与视图的接口,其作用是获取并处理HTTP请求,并调用相关的业务模型中的方法对请求进行处理,然后将对象模型层次处理后的结果返回到View。可见MVC设计模式的主要优点是实现了业务逻辑和显示逻辑的分离,提高了系统的可维护性、可扩展性、可移植性和组件的复用性。
1.2、Struts框架
Struts是基于MVC的Web应用框架,由一组相互协作的类、Serlvet以及JSP TagLib组成。在Struts框架中,模型由实现业务逻辑的javaBean或EJB组件构成,控制器由ActionServlet和Action来实现,视图由一组JSP文件构成。Struts框架的体系结构如图1所示。下面分别从模型、视图、控制来看看struts的体系结构。
视图:主要是通过JSP技术生成页面完成视图,利用Struts提供的自定义标记库编写用户界面把应用逻辑和显示逻辑分离。Struts框架通过这些自定义标记建立了View和Model之间的联系,可以实现和Model部分中的ActionForm的映像,完成对用户数据的封装。
图1:Struts体系结构控制器:作用是从客户端接受请求,并选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中,控制器由ActionServlet和ActionMapping对象构成,核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求并分发到相应的动作类(Action类的子类)。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action对象之间的映射。
模型:在Struts中,Model可以分为系统的内部状态和改变系统状态的行为(业务逻辑)两部分。系统的内部状态常由一组JavaBean表示,业务逻辑由Action和ActionForm的类对象处理。Action对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交给合适的View以产生响应业务对象更新应用程序的状态。ActionForm可以派生子类对象,通过结合自定义标记库以实现对客户端的表单数据的良好封装和支持。Action对象可以直接对ActionForm进行读写,而不再需要和request,response对象进行数据交互。通过ActionForm对象实现了对View和Model之间交互的支持。
Struts-config.xml:用于建立Controller和Model之间的关系,将各部分紧密联系在一起。它描述了Controller所使用的把请求对应到具体处理的法则,同时它还描述了客户提供的数据与ActionForm组件的对应映射关系。
1.3、Sturts的工作流程
对于采用Struts框架的Web应用,在Web应用启动时就会加载并初始化ActionServlet,从struts-config.xml文件中读取配置信息,把他们存放到各种配置对象中。其具体工作流程如下:
⑴客户端(Client)通过本地浏览器(Browser)向服务器发出一个请求(HTTP Request)。
⑵控制器(Controller)接收请求,即ActionServlet实现控制工作。它在struts-config.xml文件中寻找请求的URL,找到对应的Action。
⑶Action类执行建立在模型组件基础上的业务逻辑,模型组件是和应用程序关联的。
⑷一旦Action类处理完业务逻辑,它把控制权返回给ActionServlet,Action类提供一个键值作为返回的一部分,它指明了处理的结果AcLionServlet使用这个键值来决定在什么视图中显示Action的类处理结果。
⑸当ActionServlet把Action类的处理结果传送到指定的视图中,请求的过程也就完成了。
2、Web开发中的应用
以一个Web考试系统中的考生注册子系统为例,说明Struts在Web程序开发中的应用。考生在注册页面上输入考生名、密码等相关信息,若注册成功,控制将转向一个显示注册成功的页面,否则控制将转向一个显示失败的页面。
⑴项目建立
struts可运行在多种Web服务器上,这里使用同样出自Jakarta项目的Web服务器Tomcat。首先展开struts的压缩文件到Tomcat的主目录webapps下,接着在目录webapps下新建目录testWeb,将webapps\Struts-example下的WEB-INF目录拷贝到test目录下,然后将test\WEB-INF下的src和classes目录以及struts-coufig.xml文件中内容清空。开发时,将JSP文件放在testWeb目录下,Java源文件放在testWeb\WEB-INF\src下,编译后的类文件放在testWeb\WEB-INF\classes下。
⑵实现视图功能的用户界面的设计
JSP具有定制标记和包含Web组件的能力,可以实现定制的组件、容器和布局治理器,从而实现可扩展的、可重用的和可维护的Web应用界面。Struts中,JSP页面中利用Struts框架提供的taglib标记库的标记(如Struts bean,Html,logic,template标记),能够大大提高开发效率。在该系统中,其注册页面reguserinfo.jsp概要如下:
<%@page contentType=”text/html;charset=UTF-8” language=”java”%>
<%@ taglib uri="/WEB-INF/struts-bean.tld" PRefix=
"bean"%> //引用Struts bean标记
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix
="html"%> //引用Struts html标记
<html:html locale="true">
<head><title>RegisterUser</title></ head>
<body bgcolor="#FFFF"><html:errors/>
<html:form action="reguser.do" focus="userID" >
<table border="0" width="100%">
<tr> <th align="right" >UserName:</th>
<td align="left"><html: text property="userID"
size="20" maxlength="20"/> </td></tr>
<tr> <th align="right" >PassWord:</th>
<td align="left"><html: password maxlength="20" size="20" property="password" /></td></tr>
<tr> ……</tr>
<tr> <td align="right" > <html: submit property=
"submit" value="submit" /></td>
<td algin="left"><html: reset /> </td></tr>
</table></html:form></body></html:html>
⑶实现模型功能的组件设计
构建模型部分的组件是工作重点,它包含了整个应用程序的业务逻辑。此系统设计的组件为:
①系统状态组件(FormBean),即实体模型类,它继续自ActionForm类,用来存放表单数据,与注册页面的表单对应的数据bean为:
import org.apache.struts.action.*;//引用Struts类包
public class UserForm extends ActionForm{
private String userID= null;
private String password= null;
……
public String getUserID(){return userID;}
public void setUserID(String userID)
{this.userld= userID;}
public String getPassword(){return password;}
public void setPassword(String password)
{this. password=password;}
……}
②指令类组件(ActionBean),它扩展了Action类,主要是用来控制应用程序的流程,当注册考生按“submit”按钮后,来自用户的请求被Servlet(Controller)送到指令类组件RegUserAction,指令类调用相应的业务逻辑进行处理,然后把请求转发给相关的JSP,其程序概要为:
……;
import org.apache.struts.action.*;
public class RegUserAction extends Action
{
public ActionForward perform(ActionMapping
mapping, ActionForm form, HttpServletRequest
req, HttpServletResponse response) {
boolean flag;
String username=req.getParameter(“UserID”);
String password=req.getParameter(“password”);
…… //获取其他注册信息,并根据注册信息,做相应的数据库操作,返回是否注册成功标志flag
if (flag){
try{
UserDirectory.getInstance().setUser(UserID,
password);
return mapping.findForward(“sUCcess”);
}catch(UserDirectoryException e) {
return mapping.findForward(“failure”);}
}
return mapping.findForward(“failure”); //注册成功后转发给相应的jsp文件
}
其中UserDirectory是一个helper类,记录UserID和password 到一个标准的属性文件之中。
⑷ 实现控制器功能的指令
Struts框架的核心是控制器类ActionServlet,不需要重新设计而直接使用。ActionServlet的核心是struts-config.xml配置文件,它包含了应用程序的整个逻辑流程。在考生注册信息过程中,用reguserinfo.jsp实现注册页面;用UserForm(扩展了ActionForm)封装了表单数据;用RegUserAction(扩展了Action)实现了考生注册信息(业务逻辑)并控制了应用程序流程;而在struts-config.xml配置文件里实现了注册页面(reguserinfo.jsp)、数据bean(UserForm)、逻辑bean (RegUserAction)之间的联系,其配置信息为:
……;
<struts-config>
<form-beans>
<form-bean name="userForm" type=" UserForm"/>
</form-beans> ……
<action-mappings>
<action path="/reguser" type="RegUserAction"
input="/reguserinfo.jsp" name="userForm"
scope="request">
<forward name="success" path="/regsucess.jsp"/>
<forward name="failure" path="/regfailure.jsp"/>
</action>
</action-mappings></struts-config>
当在注册页面上单击“submit”按钮时,考生请求被提交给ActionServlet, ActionServlet根据struts-config.xml中的配置信息,把/reguser.do的URL映射到RegUserAction,把考生注册信息封装到UserForm,由RegUserAction完成注册操作,然后转发给"/regsuccess.jsp”。由此可见,控制器通过配置文件struts-config.xml把视图和模型联系在一起,struts-config.xml集中了应用程序的整个逻辑流程,此文件无论对于前期的开发还是后期的维护和升级都是非常重要的。
⑸ 系统运行
启动Tomcat服务器,在浏览器中访问http:// localhost:8080/testWeb/reguser.jsp,就可以运行该系统了。
3、结束语
Struts是一种基于MVC设计模式的Java Web框架,它使系统开发过程各个模块更加细化。利用taglib获得可重用的代码;利用ActionServlet配合struts-config.xml实现对整个系统导航,增强了开发人员对系统的整体把握;用户界面、业务逻辑和业务控制的分离,使系统的层次结构更加清楚,易于分工协作,同时增强系统的可扩展性、维护性。