关键词 Struts;控制器;模型;视图
随着J2EE平台的逐渐成熟和完善,越来越多的程序员选择了Struts框架进行Web应用开发。因为Struts框架包含了软件框架和相关的软件包,能提高Web开发的效率。但对于实际的Web应用开发,Struts毕竟还是显得比较粗糙,使用过程中还需要熟练的程序员付出大量的工作才能完成设计和开发工作。
本文将要论述一种基于Struts的Web应用开发环境WebPJ的设计和应用。WebPJ是一个无缝嵌入Eclipse平台的插件。WebPJ的GUI部分提供可视化的界面对Web项目进行设计、开发、配置和管理。即使程序员对Struts框架不很熟悉,通过简单培训也能进行开发和配置,从而缩短了学习周期。而WebPJ的SDK部分则提供了MVC的模式来控制和运转业务。程序员进行的开发是填充式的,故能降低程序员的工作量。
WebPJ经过一系列的Web工程实践,表明既降低了工作量又提高了项目的成功率。
1 Struts与Java Web应用概述
1.1 MVC设计模式
MVC是Model-View-Controller的简称,即模型-视图-控制器。MVC是Xerox PARC在20世纪80年代为编程语言Smalltalk-80发明的一种软件设计模式,至今已被广泛使用,最近被Sun公司推荐为J2EE平台的设计模式[1]。MVC强制性地把应用程序的输入、处理和输出分开。MVC中的三个核心模块:模型、视图和控制器,各自承担不同的任务,具有以下的优点:
A) 多个视图能共享一个模型,提高了代码的可复用性。
B) 模型是自包含的,与控制器和视图保持相对独立,所以可以方便地更改应用程序的数据层和业务规则。
C) 控制器可以用来连接不同的模型和视图去完成用户的需求,提高了应用程序的灵活性和可配置性。
1.2 JSP Model2
尽管MVC设计模式很早就出现了,但向Web应用的开发中引入MVC却相对困难,这是因为在JSP网页中执行业务逻辑的代码和HTML混杂在一起,难以分离出相对独立的模型。为了解决以上问题,Sun公司推出了两种规范,称为JSP Model1和JSP Model2。Model1虽然在一定程度上实现了MVC但效果不理想,直至Model2的出现才得以改观。图1是JSP Model2的结构图[2]。

图1 JSP Model2
Model2综合了JSP和Servlet两种技术各自的优点,用JSP生成表示层的内容,让Servlet完成深层次的业务规则处理。Servlet充当控制器的角色,负责处理用户的请求,创建JSP页需要使用的JavaBean对象,根据用户请求选择合适的JSP页返回给实际用户。JSP页内没有逻辑,只负责检索原先由Servlet创建的JavaBean对象,从中提取动态信息插入到静态模版中。Model2清晰地分离了表达和内容,明确了角色定义以及开发者的分工。
1.3 Struts
Struts实质上就是在JSP Model2的基础上实现的一个MVC框架。Struts为视图定义了一组JSP文件。在这些JSP文件中没有业务逻辑,也没有模型信息,只有标签。模型则用来表示应用程序的状态和业务逻辑。对于大型应用来讲,业务通常由JavaBean或EJB组件来实现。控制器是Struts框架的核心组件,ActionServlet在MVC模型中承担了中心控制台的角色,负责接收HTTP的请求信息,根据配置好的struts-config.xml信息,转发给适当的Action对象进行相关业务的处理[3]。下面的章节要讨论的WebPJ就是一种基于Struts并且以插件方式内嵌在Eclipse中的开发环境。
2 WebPJ
2.1 体系结构
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境[4]。Eclipse 附带了一个标准的插件集,包括 Java 开发工具JDT(Java Development Tools),此外还包括插件开发环境PDE(Plug-in Development Environment)。PDE组件允许构建与 Eclipse 环境无缝集成的工具。WebPJ就是为了方便开发人员开发基于Struts框架的Java Web应用程序而构建的一个Eclipse插件,它能和开发人员熟悉的Eclipse GUI无缝相接,提供给开发人员可视化的开发界面。WebPJ分为WebPJ-GUI和WebPJ-SDK两个主要模块。WebPJ-GUI主要是实现了可视化的界面,并负责项目的各类信息的配置以及生成代码框架和JSP;而另一个模块WebPJ-SDK主要是进一步对Struts框架进行细化封装,并控制整个框架的运转。从图2可以看出WebPJ-SDK也是一个典型的MVC结构。

图2 WebPJ-SDK结构模型
该模型根据Struts框架也分成三个部分:控制器、视图和模型。当控制器的ControlCenter接收到来自客户端的请求时,WebPJ-SDK会通过定义的页面迁移关系图module.xml来找到对应的Action,接着由这个Action定位到具体的业务模型入口UIBO,由UIBO调用一组与自己相关的业务处理,即BLBO,处理完后的数据结果集会通过数据模型DABO返回给视图部分的JSP,再由JSP组装后提交给用户端的浏览器。
2.2 控制器组件
WebPJ-SDK控制器主要完成的任务如下任务:
A) 接收用户请求。
B) 根据请求,调用合适的模型组件来执行相应的业务。
C) 根据当前状态以及业务逻辑执行结果,选择合适的视图组件返回给用户。
WebPJ-SDK控制器在客户端和业务模型之间充当了翻译的角色,还提供了一些通用的功能,如安全、登录和其他各种特定的请求服务。当系统的这些功能样式发生变化的时候,不需要修改整个应用,而只需要替换一些控制组件。同时,由于所有的请求都要经过控制器过滤,所以降低了视图组件之间,以及视图和模型之间的相互依赖关系,从而提高了单个组件的独立性。
Struts框架是由ActionServlet依据用户配置的web.xml 和struts-config.xml来对业务模型进行定位的。WebPJ-GUI提供了一个可视化的设计和配置窗口,通过在代表不同页面的模块之间画迁移关系线,来产生一个Action,点击这条迁移关系线还可以配置该Action的基本定义和属性,参考图4。WebPJ-GUI根据程序员设计的迁移关系以及设置的定义和属性,自动产生如下三个配置文件:web.xml、webpjconfig.xml和webpjextconfig.xml。
webpjconfig.xml采用了和struts-config.xml基本一致的布局。在<action-mappings>元素中,forward可以直接指定到某个JSP也可以指定到某个Action。如下代码所示,Action会指向对应的业务接口对象,并启动业务规则的处理。
public ActionForward doAction(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
UIR00000S_InitBean objUIBean =
new UIR00000S_InitBean();
return objUIBean.execute(mapping, form,
request, response);}
2.3 模型组件
Struts框架并没有为设计和创建模型组件提供现成的实现方案,但允许其使用其他框架的处理模式,如EJB、ORM等。模型是整个应用中相当重要的一环,它包含了业务实体和业务规则,还要负责和数据层的数据交换。可以将模型放到整个系统的中间位置,往上是控制层和视图层,往下就是数据层,可以看出:视图层到数据层其依赖关系是逐渐加强的。WebPJ-SDK提供了如下的一些对象来实现模型组件的分割。
2.3.1 业务接口对象UIBO(User Interface Bean Object)
一个UIBO对应一个Action,它将Action发起的请求分解为以下几个步骤:数据准备、业务处理、视图设置和迁移。
数据准备(doPrepareData):将来自页面和request的数据解析出来,形成需要的数据结构,并存入inputData对象备用。
protected int doPrepareData(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response,
Object inputData) throws Exception {}
业务处理(doBizLogic):根据Action请求处理的业务规则,决定使用哪些BLBO,输入数据从inputData中提取,返回的处理结果集则存放于outputData数据对象中。
protected int doBizLogic(
Object inputData,
Object outputData) throws Exception {}
视图设置(doSettingView):将处理得到的结果集从outputData中解析出来,设置到页面上并返回给用户。
protected int doSettingView(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response,
Object outputData) throws Exception {}
迁移(forwardProcess):WebPJ-SDK会根据webpjconfig.xml中已经定义信息,迁移到指定的下个页面。一般情况使用“Default”,但是如果遇到特别的情况,程序员可以在这里指定迁移到哪个页面,例如规定处理某项业务的时间超过1分钟时迁移到指定的超时报警页面。
protected ActionForward forwardProcess(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response,
int result) throws Exception {
return mapping.findForward("Default");}
2.3.2 业务规则对象BLBO(Biz Logic Bean Object)
BLBO是对真实世界的一个抽象,它可以代表业务对象的状态、规则或行为,是应用系统的核心所在。例如,登录一个账单管理系统就可以称为一个行为;规则可以定义为:第一登录的用户名和密码要和DB中保存的数据一致;第二根据不同的用户权限级别控制可访问的资源。登录成功或失败就可以看作为状态。
2.3.3 数据访问对象DABO(Data Access Bean Object)
进行业务处理时可能需要从DB或者文件中得到持久化的数据进行运算,最后还可能需要把运算的结果持久化保持到DB或者文件中。在处理2.3.2节例子中定义的第一个业务规则时,需要DABO对象从存放用户信息的DB数据表中检索用户名和密码,然后交由BLBO与页面上获取到的信息进行比较,如果一致就表示登录成功,否则将显示登录失败的提示信息。




