基于XML的改进型Struts Web应用架构研究

时间:2022-08-25 03:42:52

基于XML的改进型Struts Web应用架构研究

摘要:Struts是实现MVC模式的具体应用框架之一,其核心为一个灵活的,基于Java、Servlets、JavaBeans、XML等标准技术的控制层。该文提出了一种基于XML的改进的Struts框架,以弥补其局限性。

关键词:XML;Struts架构;XSLT;Web

中图分类号:TP311文献标识码:A文章编号:1009-3044(2009)33-9264-03

Research and Application in improved Struts Framework with XML

LU Yang1, YIN Kai2

(1.Changzhou Institute of Engineering Technology, Changzhou 213164, China; 2.Changzhou Institute of Technology, Changzhou 213002, China)

Abstract: Struts is one of application frameworks based on the MVC design paradigm. The core of the Struts framework is a flexible control layer based on standard technologies like Java, Servlets, JavaBeans, and XML. This paper put forward an improved Struts framework,based on XML, to make up it’s limitations.

Key words: XML; struts framework; XSLT; web

目前,基于Java的Web应用很多是由一组JSP页面构成的,这种以JSP为中心的开发模型又称之为JSP模式1。这种开发模式可以很好的满足快速和小规模的应用开发的需要,但是不能满足大型应用的要求,从工程化的角度考虑,它也有一些不足之处:

1) 应用的实现一般是基于过程的,一组JSP页面实现一个业务流程,如果要进行改 动,必须在多个地方进行修改。这样非常不利于应用扩展和更新。

2) 由于应用不是建立在模块上的,业务逻辑和表示逻辑混合在JSP页面中,页面被嵌入大量的Script或Java代码,非常不利于系统的重用和改动。

为了解决这些问题,在开发大型的Web应用时可以采用JSP模式2,一个基于MVC模式的框架。MVC是Model-View-Controller的缩写,Model代表的是应用的业务逻辑(通过JavaBean、EJB组件实现),View是应用的表示层(由JSP页面实现),Controller提供应用的处理程控(一般由一个Servlet实现)。这种设计模型可以把应用逻辑、处理过程和显示逻辑分开由不同的组件实现。这此组件可以进行交互和重用,从而弥补了JSP模式1的不足。

1 Struts体系结构

Struts由一组相互协作的类(组件)、Servlet以及JSP卷标库组成。基于Struts架构的Web应用程序基本上符合JSP模式2的设计标准,可以说是MVC设计模式的一种实现。

Struts有其自己的控制器(Controller),同时整合了其它的一些技术去实现模型层(Model)和视图V(View)。在模型层,Struts可以很容易的与数据访问技术相结合,包括EJB、JDBC等。在视图层,Struts能够与JSP、XSL等等这些表示层组件相结合。既然Struts叫做Web Framework,那么它肯定主要基于Web层进行应用系统开发。

图1显示了Struts的体系结构,在响应客户请求时,各个部分的工作原理。

1.1 视图(view)组件

Struts应用中的View部分是通过JSP技术实现的。Java开发者很容易在JSP当中通过使用Java小程序,直接嵌入条件业务逻辑和循环。通过把复杂的处理分离到Model和Controller组件中,从而使JSP本身更小,大大简化并加速了开发、测试及维护的工作。Struts除了提供MVC构架以外还提供了一整套自定义的JSP标记,通过这些自定义标记可以非常好的和系统的Model部分交互,通过使用这些自定义标记创建的JSP窗体,可以实现和Model部分中的ActionForm的映像,完成对用户数据的封装。

1.2 模型( Model ) 组件

MVC系统中的Model部分从概念上可以分为两类:系统的内部状态和改变系统状态的动作。Struts通常使用一组JavaBean表示系统的内部状态,根据系统的复杂度也可以使用像Entity EJB和Session EJB等组件来实现系统状态。Struts为Model部分提供了Action和ActionForm对象:所有的Action处理器对象都是从Struts的Action类派生的子类。Action处理器对象封装了具体的处理逻辑,调用业务逻辑模块,并且把响应提交到合适的view组件以产生响应。Struts提供的ActionForm组件对象,它可以通过定义属性描述客户端窗体数据。可以从它派生子类对象,利用它和Struts提供的自定义标记库结合可以实现对客户端的窗体数据的良好封装和支持,Action处理器对象可以直接对它进行读写,而不再需要和request、response对象进行数据交互。通过ActionForm组件对象实现了对View和Model之间交互的支持。Struts在实现时把做什么(Action)和如何做(业务逻辑)分离,这样,可以实现业务逻辑的重用 。

1.3 控制器(Controller)组件

控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中,Controller功能由ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置文件生成的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映像。Struts框架的处理流程清楚的体现了MVC系统的特点,Struts Controller ActionServlet处理客户请求,利用配置的ActionMapping 对象把请求映像到Action处理器对象进行处理。Action处理对象访问ActionForm中的数据,处理和响应客户请求,它还调用后台的Bean组件,这些组件封装了具体的业务逻辑。

Action处理器对象根据处理结果通知Controller进行下一步的处理。由于Struts已经提供了一个非常好的MVC框架,利用Struts开发MVC系统时可以大大加快开发的速度。

具体在使用Struts框架时,对应各个部分的开发工作主要包括:

1) Model部分:采用JavaBean和EJB组件,设计和实现系统的业务逻辑。根据不同的请求从Action派生具体Action处理对象。完成“做什么”的任务来调用由Bean构成的业务组件。创建由ActionForm的派生类实现对客户端窗体数据的封装。

2) Controler部分:Struts提供了核心控制部分的实现。只要配置ActionMapping对象。

3) View部分:为了使用Model中的ActionForm对象,必须用Struts提供的自定义标记创建HTML窗体。利用Struts提供的自定义标记库编写用户接口,把应用逻辑和显示逻辑分离。Struts框架通过这些自定义标记建立了View和Model之间的联系。Struts的自定义标记还提供了很多定制页面的功能。

同时需要编辑两个配置文件:web.xml和struts-config.xml。通过它们配置struts系统中的各个模块之间的交互。

2 Struts框架的改进

虽然Struts框架具有先进性、可扩展性、标准性、开放性以及安全性和高效性。但是也存在着一定的局限性:

1) 程序员可以把应用逻辑放入JSP。这显然与Struts的设计基础MVC模式的思想相违背,Model与View混在一起使程序结构变得复杂和难于管理。

2) JSP不能很好地支持XML,也就不能保证生成的结果文档(XML或HTML文档)将会是100%“格式良好”(Well-Formed)。而在当前支持Internet的访问设备不断涌,JSP作为View不能适应多种类型的客户端。

3) 程序员需要学习如何使用Struts的标志库。这需要花费比较长的时间。

4) 对JSP页面的任何修改都会导致JSP的重新编译,这样是非常耗费时间的。

2.1 XSLT技术

由于Struts是一个开放的架构,因此可以考虑对Struts进行改造,克服其局限性,希望能达到下列要求:

1) 避免使用JSP和标签库,强制使用格式良好的XML和HTML,使其适用各种类型的客户端。

2) 减少业务逻辑与表现逻辑合并的可能性。

3) 降低对视图不同部分分离的难度,比如布局和风格的分离。

基于上述考虑,可以考虑使用XSLT技术,用传统的Struts技术和XSLT技术一起构造一个轻型框架。XSLT(eXtensible Stylesheet Language Transformation)是一种用来转换XML文件结构的语言。它可以把XML数据转换成纯文本、PDF、HTML/XHTML、WML、VoiceXML等任意XML格式。

XML是一个完整的树结构文件,可以实现数据和表达形式分离以及在不同的应用之间传输数据。XPath是XSLT的重要组成部分,是一种专门用来在XML文件中查找信息的语言,它提供了操纵XML文件中的字符串、数字以及布尔伯的基本工具。

XSL转换通常涉及三个文档:源文件、目标文件和含有模板规则的文件,即XSL样式表,XSL处理器负责实现转换过程。首先,XML源文档被解析成DOM树存放在内存中,接着对文档进行分析,DOM树中的每一个节点都会与一个模式相比较,当二者匹配时,就会按照模板中定义的规则进行转换,否则继续往下匹配。如此循环,直至整个文档处理完毕。图2是XSL的转换原理图。

XSLT/XPath的基本理念是分离数据的内容和它的表现形式,以便把同方便地以不同的形式或格式输出,满足不同显示设备的需要。也就是说,一份数据在不改动输入的XML文档的情祝下,对于每一种不同的输出格式,只需定义相应的XSL样式表。对于Struts应用来说,这意味着:

1) 在单一的XML文档中存储(描述)所有的数据;

2) 对于不同的终端设备,可以定制不同的XSL样式表。在XSL样式表的帮助下,针对不同的访问设备,把XML文件转换成任意XML数据格式输出,能够很方便地支持IE、手机、PDA等多种Internet访问设备。

2.2 Struts框架的改进方案

由于XSL具有分离数据内容和表现形式的特点以及XSLT具有强大的转换功能,可以考虑把XSL和Struts结合在一起,形成改进方案。该方案是利用XSL来替换 Struts中生成View的JSP组件,但原封不动地保留了Controller和Model两部分。

该方案中,增加了一个组件XSLServlet。它配合XSL样式表实现了原来在Struts中由JSP和taglib实现的视图部分。这个XSLServlet首先根据ActionForm和上下文环境生成一个XML文档,然后根据相应的XSL样式表进行转换。由于可以把一个请求提交给任何一个己经在Struts配置文件中注册的URL,所以这个过程的实现不需要对Struts的Controller做任何的修改。

改进后的Struts处理流程的最初部分和Struts的类似。请求被发送到Struts的控制器ActionServlet,然后又被分派给各自的业务逻辑处理单元(Action类的子类)。控制器创建ActionForm对象,请求的参数都保存到这个ActionForm对象中。Action类的了类处理完毕后返回ActionForward类,由ActionServlet转发到正确的客户端。在View部分,传递的目标不再是JSP,而是一个XSLServlet。这个Servlet利用存放客户数据和结果的ActionForm和上下文组织构造一个XML文件,并利用XSL样式表转换该文件后送到客户端。由于该框架采用了XSLT技术,因此构造XML文档、选择XSL转换方式等问题也需要从系统需求出发作出相应的选择。

目前,处理XML文档的方式主要有SAX、DOM、JDOM(Java Document ObjectModel) 几种,而JDOM是最适合Struts的一种方式。其它的API是通用的,而JDOM是基于Java的API。它是用Java开发并为Java提供服务的,沿用了Java代码的规范和类库,以简单易懂的方式向Java开发人员描述了XML文档和文档的内容。因此考虑采用JDOM构造XML文档。

利用JAXP(Java API for XML Processing)封装XML的整个转换过程。JAXP是一个用来解析XML的Java API,支持DOM、SAX、XSLT等标准对XML文档进行处理。JAXP是独立于任何特定的XML处理器实现的,可以为不同的解析器提供了标准的接口。因此,JAXP相当于应用程序和某个具体XML解析器或XSLT处理器之间的一个抽象层,使得应用程序可以不依赖于特殊的XML处理执行来解析和转换XML文档,所以开发者可以使用多种XML处理器而无需改变应用程序代码,从而具有良好的通用性。

XSLServlet是本改进方案中的关键组件,有几个辅助类,最主要的是ISDocumentBuilder 和ISTransformer。构造和转换XMl文档由XSLServlet和它的辅助类完成。XSLServlet通过以下方式工作:

1) 根据User-Agent域判断客户端设备的类型;

2) 在ISDocumentBuilder的帮助下,构造一个XML文档;

3) 把该文档传递给ISTransformer,根据不同的终端设备类型选择相应的样式表转换XML文件。

ISDocumentBuilder通过HttpServletRequest、HttpSession和ServletContext获得创建XML输出文件所需要的信息,同时要保证创建的文件符合接口XML。

实际的XSL转换过程是由ISTransformer类完成的。ISTransformer类利用JAXP抽象了底层用到的XSLT处理器,封装整个转换过程。当然,要顺利执行转换,必须提供一个适当的XSL样式表,并且由具体Action类选择并加入到HttpServletRequest中。根据客户端设备类型和XSL样式表,XML文件将被转换成所需要的显示格式。

2.3 改进后的Web应用系统框架设计

将系统设计为四层Web体系结构:客户层、Web层、业务层和资源层,如图3所示。其中Web层和业务层在应用服务器上实现,资源层放在数据库服务器上。控制器控制系统的整个流程,读取配置文件,将请求映像到相应的业务组件并执行业务逻辑。视图部分封装在XML文档中,并为不同的访问设备提供不同的样式表以支持多种访问设备。模型部分包括系统中所有的业务逻辑和数据映像,采用JavaBean和EJB组件技术实现,模型部分通过标准的JDBC访问数据库。

参考文献:

[1] 周海燕.基于Struts框架的Web开发的研究与应用[J].微计算机信息,2007,24(4-3):186-188.

[2] 孙卫琴.精通 Struts[M].北京:电子工业出版社,2004.

[3] 陈奇.XS LT、XPath和DOM的应用研究[J].计算机工程,2003,29(3):14-16.

上一篇:基于WEB电力营销系统的分析与设计 下一篇:基于可视化建模的人员仿真系统场景模型的实现