摘 要 随着J2EE技术平台的逐渐成熟和完善,基于J2EE的Web应用开发也日益增加。本文讨论了一种基于Struts框架的Web应用开发环境—WebPJ。它包含了两个部分:WebPJ-GUI和WebPJ-SDK。GUI部分主要以插件的方式集成到程序员熟悉的Java开发平台Eclipse中,并提供可视化界面以用于Web工程的设计、开发、配置和管理。SDK部分则封装了Struts的核心,提供了完整的控制器组件,低耦合性的模型框架结构,以及通过绑定HTML的方式自动生成代码框架和JSP。此外,SDK还提供了验证组件和异常处理组件等其他功能。WebPJ通过一系列实际Web项目的开发检验,表明它能够缩短程序员理解和学习Struts框架的周期,同时WebPJ的使用也降低了程序员的工作量,提高了项目的成功率。
关键词 Struts;控制器;模型;视图
0 引言
随着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的结构图。
图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对象进行相关业务的处理。下面的章节要讨论的WebPJ就是一种基于Struts并且以插件方式内嵌在Eclipse中的开发环境。
2 WebPJ
2.1 体系结构
Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。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与页面上获取到的信息进行比较,如果一致就表示登录成功,否则将显示登录失败的提示信息。
2.4 视图组件
视图是模型的外在表现形式,用户是通过视图来了解模型的当前状态的,也是通过视图来触发相关的业务规则的。通过图1可知在视图组件部分最主要的有两个对象,DTBO和JSP。
2.4.1 数据传输对象DTBO(Data Transfer Bean Object)
DTBO在WebPJ-SDK中的表现形式为FormBean,由WebPJ在HTML绑定的时候自动生成。HTML的绑定被修正时,产生的FormBean也会跟着变更。DTBO被用于在视图层和模型层之间传递数据。模型层通过get方法可以从FormBean中得到并解析用户在页面上输入的原始数据,同时也可以用set方法将模型层处理好的数据结果集按照视图层要求的数据格式返回。同时还可以使用FormBean提供的validate方法进行数据的校验和过滤。
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request){}
2.4.2 JSP(Java Server Pages)
JSP技术是使用Java编程语言编写类XML的标签和脚本,来产生动态网页的处理逻辑。网页还能通过标签和脚本访问存在于服务端的资源(例如JavaBesns)的应用逻辑等。在WebPJ中,JSP并不需要程序员手工编写,由WebPJ-GUI根据程序员绑定的HTML就可以自动产生。而像富士通的Interstage就需要完全手工编写JSP脚本,编写和调试的工作量很大。当然程序员还可以通过增加指定的标签来添加JSP脚本内容,具体可以参考图5。
2.5 验证组件
验证组件主要指对数据的合法性检查,而非业务规则。虽然在 FormBean中的validate()方法中可以对部分输入数据进行验证,但这样处理就必须由程序员编写代码来实现对每个字段的合法性验证,如果规则改变,代码必须重写。WebPJ提供了一个验证组件,程序员可以通过配置窗口(如图3),为某个页面的某个字段设置一个复杂的合法性规则。生成的规则会有WebPJ-GUI添加到配置文件validationrule.xml中。同时程序员还可以将验证失败时所显示的提示信息设置到另一个配置文件Application-
Resources.properties中。该文件由webpjconfig.xml的
message-resources parameter指定。
图3 验证组件配置
如2.3.2节例子,假设规定了用户密码为必需输入项,当输入为空时就违反了数据的合法性。程序员可以通过选择R00000SForm(登录画面)的charge_PWD(用户密码)项,并选中“required”属性来完成此项目的验证配置。WebPJ-SDK提供的验证框架降低了程序员花费在验证数据的时间,使程序员能集中精力处理好相关的业务规则。
2.6 异常处理组件
在JVM执行应用程序时,一旦遇到非正常现象,便会抛出一个异常对象,异常对象大致可以分为两大类,一是系统异常(例如服务器停机,DB连接丢失等),二是应用异常(例如被锁定的用户试图登录系统等)。对于访问Web的用户来说往往不愿意看到类似404错误页面,因为他们无法确定到底出了什么问题。为此WebPJ-SDK提供了一个异常捕捉及处理的框架。程序员首先可以根据项目实际应用的需要将各类异常分类,定义出异常的类型及其处理。目前WebPJ-SDK提供了DB Exception、 Fatal Exception、Access Deny Exception、 Application Exceptioin等多种类型,程序员可以在Exception配置窗口增加新的异常类型并配置相应的处理,配置过程和验证组件的配置相类似。这样就提高了程序灵活性,使Web应用异常处理机制更具人性化。
3 应用实例
3.1 工程建立
根据2.3.2节例子介绍一下WebPJ的实际应用。选择Eclipse菜单上的 “项目”,选择“WebPJ项目”,根据WebPJ项目设置向导输入工程名、工程版本号、选择站点最终运行的字符集等,然后切换至站点配置栏,设置站点路径、新增修改站点上传资源列表等。双击module.xml,根据应用设计的各页面之间的相互迁移关系,使用WebPJ-GUI设计出如图4的迁移关系
当用户输入用户名和密码,点击登录按钮时,R00000S执行的是Login这个动作,即从DB表中检索出既存的用户名和密码,和用户输入的信息比较。如果一致,将迁移向下个页面R01000D(可访问资源链接画面),并执行Init的动作。Init的动作中将根据不同的用户权限显示不同链接。双击迁移线可以进行页面属性和参数的设置,包含了页面信息、页面特性、FormBean属性、页面参数、模块间迁移设置等内容。配置完毕后,可以自动生成工程的目录结构和代码框架。
图4 迁移关系图
3.2 代码生成
WebPJ使用“## ##”标记对画面上相关的字段进行单个绑定或者循环绑定(多用于表单),如“##charge_PWD##”表示了对画面上用户密码项目的绑定。同时通过识别各类!--WEBPUMP XXX--标签来绑定模块,如图5中含有[ERRORS]字样的标签是对提示信息的绑定。绑定完成后点击保存按钮就可以将最新的内容更新到JSP和FormBean的代码中。程序员可以点击“JSP PAGE”和“FORMBEAN PAGE”来查看生成的代码。操作界面如图5所示:
图5 HTML绑定
3.3 运行
使用WebPJ内置的Ant工具,将站点编译上传到指定的路径,点击Tomcat启动按钮后,打开IE敲入指定路径即可访问Web站点。程序员可以设置断点,进行debug。这样程序员可以直接在本机进行调试和错误排查,而不需要每次都花费时间发布版本到服务器,排查错误时也不需要分析大量log,很大程度地提高了开发效率。
4 结论
基于J2EE的Web应用开发越来越广泛,但是程序员直接使用现有的Struts框架进行开发则需要花费较长学习周期,还需要程序员进行大量的手工操作来配置,编码。
本文讨论的WebPJ则具有以下优点:
A) WebPJ提供了可视化的界面用于Web项目的设计、配置和管理。
B) WebPJ可以根据设计的迁移图,配置的相关信息,导出工程实际运行需要的配置文件和代码框架。
C) WebPJ利用HTML绑定的方式自动生成JSP和FormBean。
D) WebPJ还提供了自己的模型解决方案,使得程序员只需要进行填充式的编码。
通过一系列的Web项目实践可以证明:WebPJ能够缩短程序员理解和学习Struts框架的周期,快速进入开发;同时WebPJ的使用也降低了程序员的工作量,提高了项目的成功率。
参考文献
[1] Steve Burbeck, Applications Programming in Smalltalk-80(TM):How to use Model-View-Controller(MVC) [EB/OL], , 1992
张海玉、刘晓霞, 用Struts开发基于MVC的Web应用,微机发展[J], 2005 Vol.15 No.7 P.40-43
杨开英、刘榭, Struts框架的研究与应用, [J], 2005 Vol.26 No.2 P.157-160
Erich Gamma、Kent Beck, Contributing to Eclipse: Principles, Patterns, and Plug-Ins[M], Addison-Wesley Professional, 2003
The Interstage Suite [EB/OL], http://www.fujitsu.com/global/services/software/interstage, 2005
相关文章
学术参考网 · 手机版
https://m.lw881.com/