引言
软件开发工作中遇到的很多问题都可能在以往开发同类软件的过程中同样出现过并且已经被解决,解决问题时所用到的好的方法、技术经过积累并不断的归纳、总结形成一种固定的解决方案、一种模式,以便在日后的系统开发过程中专门用来解决同类问题。设计模式就是对以往开发经验的总结,它的提出使开发人员可以简单、方便的复用成功的设计方案,而不必每次都做重复的工作。
财务系统具有所涉及的业务逻辑复杂、需求灵活,甚至个别业务可能会在系统使用过程中发生变化的特点,因此如何组织应用程序以使其易于维护和升级便成为摆在开发人员面前的首要问题。早些时候的应用程序开发是用过程化语言来完成的,它们将数据库查询语句这样的数据层代码和HTML这样的表示层代码混合在一起,这样一来无论是对业务逻辑的变更还是对界面显示的修改都会涉及到应用程序的整体,使程序维护起来相当困难。
Web层的解决方案——MVC模式
MVC模式的提出彻底解决了上述问题。MVC是Model(模型)——View(视图)——Controller(控制器)的缩写,它适用于大型可扩展的Web应用的开发,它强制性地将应用程序的输入、处理和输出分开,将其划分为模型、视图和控制器三个核心部分,使它们各司其职,各自完成不同的任务,其中任何一部分的修改都不会影响其它两部分。
在MVC模式中,模型封装了应用问题的核心数据、逻辑关系和业务规则,提供了业务逻辑的处理过程。模型一方面被控制器调用,完成问题处理的操作过程,另一方面为视图获取显示数据提供了访问数据的操作。因为模型是与数据格式无关的,因此一个模型可以为多个视图提供数据,这样一个模型一次编写可以被多个视图重用,从而避免了代码的重复编写。
视图是MVC模式下用户看到的并与之交互的界面。视图从模型处获得数据,视图的更新由控制器控制。视图不包含任何业务逻辑的处理,它只是作为一种输出数据的方式。
MVC模式中,控制器主要起导航的作用,它根据用户的输入调用相应的模型和视图去完成用户的请求。控制器本身不输出任何东西,它接受用户请求并决定调用哪个模型构件去处理,以及由哪个视图来显示模型处理之后返回的数据。
MVC的处理过程是这样的:对于每一个用户输入的请求,首先被控制器接收,并决定由哪个模型来进行处理,然后模型通过业务处理逻辑处理用户的请求并返回数据,最后控制器用相应的视图格式化模型返回的数据,并通过显示页面呈现给用户。图1所示为模型、视图、控制器这三个模块各自的功能以及它们之间的相互关系:
图1
Struts是实现MVC模式的框架
设计模式是软件开发经验的总结,它是一个概念,是一个逻辑实体,而框架可以看成是基于某一特定平台的一种或几种设计模式的物理实现。设计模式比框架更抽象,设计模式只有其实例才能表示为代码,而框架本身可以用代码表示,框架是一套设计详细的类,类与类之间功能各异,又彼此联系,相辅相成,形成了对某一类问题的可重用的、易扩展的解决方案。
Struts是实现MVC模式的通用框架,它由四个主要部分组成,模型、视图、控制器和XML文件。模型通常由Java Bean或EJB组件实现,负责处理业务逻辑;视图包括一组JSP文件,这些文件主要由JSP标签或客户化标签构成,它简化了JSP页面的编码工作;在Struts框架中控制器主要包括Action Servlet类和Action类,Action Servlet是Struts的核心部件,它接受用户的Http请求,根据配置信息将请求转发给适当的Action对象,Action类负责调用模型的方法,并帮助控制应用程序的流程;Struts包括Web.xml和Struts—config.xml两个配置文件,其中Web.xml是Web应用的发布描述文件,Struts—config.xml是与Struts相关的特殊信息配置的描述文件。
Struts框架下的财务系统的设计与实现
整个项目由财务系统、物流系统和客户管理系统三个部分构成,由于财务的结算业务与采购、出入库和销售等物流环节都存在着一定的联系,因此,财务系统功能的实现以及维护的方便与否对于整个项目的成败起着致关重要的作用。
财务系统主要包括与结算相关的业务处理,如供货商结算、客户结算、返款处理、各种帐簿的查询、科目表的维护等等。下面以客户结算为例说明Struts框架下系统的设计与实现。
用户选择客户结算子菜单后进入客户结算页面,在该页面上需填入客户名称、销售单编码、费用的支付方式以及详细的收款信息。其中客户名称和销售单编码支持模糊查询功能;支付方式包括现金、银行、预收款三种方式,可点选输入;详细的收款信息包括业务员姓名或编码、总的结算金额、登录帐簿。以上信息均填写完毕后,可点击提交,若填写的信息符合结算条件,则经业务处理逻辑处理后,系统向用户显示结算单页面,若提交不成功,则显示错误信息。Web组件之间信息的转发关系如图2所示
图2
CtmBForm作为ActionForm Bean可以在视图和控制器之间传递HTML表单,其属性与表单中的字段是一一对应的,CtmBForm的Validate()方法可以完成与表单的数据格式和语法相关的有效性检查,如销售单编码、结算金额不能为空等。
Struts框架的核心控制器组件ActionServlet的doGet()或doPost()方法在收到用户请求后都会调用其process()方法处理请求。首先选择能够处理当前请求的子应用模块,并在request范围内写入配置信息和消息资源;之后完成一些预处理请求操作,在预处理请求操作的尾部创建并保存CtmBAction实例,并调用CtmBAction实例的execute()方法,该方法再调用相应模型进行实际的业务逻辑处理,完成用户的请求;最后根据execute()方法返回的结果执行请求转发或重定向。
在系统中模型由EJB组件实现,系统多层结构的设计如图3所示:
图3
CtmBEJB作为一种JNDI资源运行在EJB容器中,在多层结构中CtmBEJBDelegateImpl业务代理实现类无法创建CtmBEJB组件,而是通过查找名为“ejb/CtmBEJB”的JNDI资源获得该资源的引用。
IctmB接口的作用是削弱客户程序与模型的关系,客户程序通过该接口来访问EJB组件的业务方法。
CtmBAction对EJB组件进行调用的时序图如图4所示:
图4
在多层结构中,业务对象BO主要封装了一些实体,如客户CustomerBO、销售单SalesSlipBO、结算单BalancingSlipBO、应收款帐AccountsReceivableBO、预收款帐PreReceivingBO、现金帐CashAccountBO和银行帐BankAccountBO等等。图5所示为上述七个业务对象之间的关联关系,以及部分业务对象的属性和方法:
图5
数据访问对象(Data Access Object,简称DAO)是实现持久化框架的一种设计模式,它的引入可以削弱业务处理逻辑和数据库访问之间的联系,它一方面可以将对业务对象BO的处理转化为对数据库的操作,另一方面也可以把查询数据库的结果映射为业务对象BO。DAO提供了对关系数据库操作的接口,如创建数据库,定义表、索引,对表进行增、删、改、查询等操作。系统选用了OJB软件,它是一种采用DAO设计模式实现的持久化框架。
结束语
Struts为Web应用程序的开发提供了框架结构,JSP页面中不包含任何业务逻辑,控制器组件ActionServlet可使用Struts框架所提供的,开发人员只需将大部分精力集中到实际业务逻辑的处理,这样有利于快速有效的开发出Web应用程序。Struts框架下用户显示、控制逻辑和业务处理逻辑相分离,若业务需求发生变化则主要修改用于处理业务逻辑的EJB或JavaBean组件,因此便于系统的维护和升级。总之,Struts框架适用于可扩展的大型Web应用的开发。