时间:2024-08-31
刘 露
(中国石油化工股份有限公司 湖南岳阳石油分公司, 湖南 岳阳 414000)
随着信息管理系统的不断发展, 各个企事业单位都引入了信息管理软件来管理自己日益增长的各种信息, 但多数系统在开发中存在系统结构复杂、代码重用率低、网页设计和软件开发相互制约导致开发效率低下等不尽人意的地方. 为此人们在实际中开发了MVC与对象——关系映射(ORM)等很多成功的模式.Struts 是Apache 组织的一个开放源代码项目, 它提供了一个构建基于MVC 体系结构的Web 应用程序的框架[1]. 但是Struts架构只解决了视图层、业务层和控制层的分离, 并没有对复杂的持续层提供灵活的架构支持. Hibernate框架是一个面向Java开发平台的对象/关系数据库的映射工具, 并且是开源的O/R Mapping框架. 它不仅提供了从Java类到数据库表之间的双向的映射, 也提供了数据查询、数据修改和恢复等机制,并且还提供了对系统性能优化的各种技术. 从而可以大幅度减少开发时直接编写和使用SQL语句和JDBC API处理数据访问的时间. 因此通过将这两个架构整合起来,可以得到一个迅速地开发灵活、低耦合及易于维护的信息系统的完整解决方案.
Struts构架模式其实是MVC构架模式在J2EE Web组件技术上的具体应用, 在该构架模式中, 主要是利用MVC构架模式中的模型(M)、视图(V)、控制器(C)3种不同形式的组件来构建具体的Web应用系统的[2]. 其中的模型组件(Model)由 JavaBean组件承担, 并完成业务功能和数据处理等方面的功能, 而视图(View)组件由JSP页面承担, 并实现人机交互的前台界面, 最后的控制器(Control)组件部分则由J2EE Web组件技术中的标准 Servlet组件承担, 主要实现调度 JSP页面和 JavaBean组件等方面的功能[3]. 图 1为Struts构架的工作原理图. 图中用户在浏览器端的请求页面中发出请求, 该请求向应用服务器端的某个控制器Servlet组件发出; 该Servlet组件将根据请求的类型相应调用具体完成业务功能的JavaBean组件中的业务功能方法, 由该业务功能方法实现最终的业务功能操作(如访问数据库表中的数据或者进行业务功能处理等); 然后业务功能组件再将处理后的结果数据返回到该控制器Servlet组件中,控制器Servlet组件将处理后的结果转发到显示结果的另一个 JSP页面以实现结果的显示输出.
图1 Struts架构
在目前的企业应用系统开发中所使用的数据库系统仍然为关系型数据库系统, 其中存储的是关系型的数据, 并且还能够保存这些关系数据的静态结构. 在采用 Java作为信息系统的开发语言时, 传统 Web应用开发方法是直接用 JDBC与数据库交互. 但是这个工作量很大, 而且一旦业务逻辑稍微有一些变更,就要大量地更改这些JDBC中的SQL语句, 因此不管是开发还是维护系统都很不方便. 考虑到Java的面向对象性和关系型数据库的关系型结构相差甚远, 因此很有必要引入一种在对象与关系型数据库之间的直接映射机制, 这种映射应该是最大量地使用配置文档, 以便今后业务逻辑更改后是尽可能地修改映射文件而不是Java源代码, 因此出现了O/R映射模式. 有很多开源项目都使用 Java实现了这个O/R映射, 而Hibernate是其中最为优秀的实现架构之一,Hibernate框架如图2所示.
图2 Hibernate架构
Hibernate框架是对 JDBC的轻量级的对象封装, 它是一个独立的对象持久层框架, 不依赖于某种J2EE应用服务器容器的具体实现和支持. Hibernate框架可以用在JDBC可以使用的任何场合, 因此从某种意义上来说, Hibernate框架不仅能够取代JDBC, 而且还进一步完善和扩展了JDBC的功能. 图3(a)所示流程图表示在Java应用中通过JDBC API来访问物理数据库系统的过程, 而图3(b)则表示在Java应用中通过Hibernate 框架API来访问物理数据库系统的流程. 从图3(b)中明显可以看出, Hibernate框架是对JDBC的API的对象包装, 从而能够使得Java应用以面向对象的方式来操作和访问数据库系统. 从图3中能够发现Hibernate框架是一个和JDBC密切关联的框架, 因此Hibernate框架的兼容性和JDBC驱动程序、数据库都有一定的关系, 但是和使用它的Java程序、J2EE应用服务器没有任何关系, 也不存在兼容性问题. 这使开发人员可以开发出与物理数据库系统无关的应用系统.
图3 JDBC和Hibernate框架的数据访问技术的对比
系统从逻辑上可分为4大模块: 登录模块、客户管理模块、订单管理模块、管理员模块. 登录模块主要是通过输入正确的操作员名称、密码和操作员级别进入主窗体, 其基本流程为: 用户输入自己的用户名,密码及级别, 系统再对其输入进行判断, 如果全都正确就进入系统. 在用户输入密码的过程中, 为了安全,在此设置了只能输入三次, 这就可以防止它人恶意进入系统. 同时根据用户所选择的级别的不同提供相应的访问权限. 客户管理模块完成对新增客户基本信息(单位名称、法人代表、法人电话、代理人、代理人联系方式等)的输入和已有客户信息的修改、查询, 是系统最基本的功能. 该模块主要分为客户增加、客户修改、客户查询三个子模块. 订单管理模块是整个管理系统的核心, 该模块实现对公司业务订单(如: 小订单、合同等)的管理, 为各项业务建立信息输入, 修改和查询. 具体又分为订单登记、订单修改、订单查询和打印订单这四个子模块. 管理员模块主要负责添加或删除用户, 为用户提供修改密码操作, 为用户浏览公司详细信息提供便利以及管理员根据公司实际情况修改公司信息并对论坛进行管理等任务.
由于订单管理系统涉及到大量的数据处理与复杂的业务流程, 使用Struts 与Hibernate 框架能很好的节约开发时间和开发成本[4]. 系统总体上可分为以下5个层次:
(1)客户层: 运行在用户机器的浏览器中, 处理与用户的交互;
(2)Web 层(视图层): 运行在Web容器中, 产生系统的表现逻辑, 处理用户的请求并作出响应; 整个Web 层建立在Struts 框架基础上, 其中View 由JSP页面组成; Controller由ActionServlet结合Strutsconfig.xml和Action组成, 而Model则交由业务逻辑层来实现.
(3)业务逻辑层: 完成系统所需的业务, 为Web层提供所需的业务方法, JavaBean等Business Objects(BO)构成.
(4)数据持久层: 由 Hibernate 组成, Hibernate 从数据源中获取数据, 然后生成持久对象(Persistent Object, PO), 再把PO 传给业务逻辑层.
(5)数据源层: 即数据库层, 存放客户信息系统的数据.
本系统的表示层是由Struts 实现, 由基于XML 的配置文件Struts-config.xml 将模型、视图、控制器联系起来. 它将从页面接收到的请求按FormBean的格式将其封装成一个Form对象, 根据业务流的逻辑决定交给的合适的方法实现业务流的转向, 处理完的数据返回给控制器, 控制器将数据封装成Form对象,根据业务流决定是交给下一个业务逻辑进行处理还是返回到页面. 控制器是按struts-config.xml 文件中的配置来决定业务流的转向的, struts-config.xml 的部分代码如下:
在系统开发过程中, 使用功能强大、扩展性强的Jbuilder2007作为开发环境, 在数据库方面选择了易用性较好的MySQL SERVER5.0, 考虑到系统中各模块的实现大同小异, 本文以“管理员模块”中的“用户信息维护”为例说明系统数据持久化的实现. 为了简化说明, 在Customer类中只定义了三个属性, 即CustomerId、CustomerName和CustomerAddress, 它的属性和数据库中CUSTOMER表的字段是一一对应的,并且类型一致.
3.4.1 Hibernate配置
Hibernate有两种配置方式, 分别是使用hibernate.properties文件和hibernate.Cfg.xml文件, 两种配置是一样的. 在本系统中, 使用后者对Hibernate进行配置. 在配置文件中, 可以配置数据库的方言、连接驱动类、用户名及密码和URI等. 此外, 使用hibernate.Cfg.xml文件进行配置时还可以指定mapping resource.配置文件hibernate.cfg.xml部分代码如下所示:
在以上属性配置文件中, 定义了访问数据库的URL资源定位地址和数据库名称, 以及符合SQL规范的dialect方言, 在mapping映射文件配置部分, 定义了CUSTOMER表对应的映射文件Customer. hbm. xml,其他用到的映射资源可以随着系统开发进行灵活的加载与更新.
3.4.2 映射文件
每个持久化类都要有与之对应的映射文件, 映射文件名为“类名.hbm.xml”. 这个映射文件定义O/R映射的规则. 例如持久化类Customer具有属性ID和name, 其对应的映射文件Customer.hbm.xml包含了对象/关系映射所需的元数据. 元数据中包含了持久化类的声明, 以及类中各个属性到数据库表各个字段的映射关系. 映射文件Customer. hbm. Xml主要代码如下所示:
Hibernate通过这个XML文件来指定持久化类和关系数据表的映射. 其中主键用
3.4.3 定义持久化类
持久化类是指其实例需要被Hibernate持久化到数据库中的类. 持久对象是一个普通的JavaBean, 包含一些属性, 以及与之对应的get和set方法, 每个持久化类对应于数据库中的一张表. 定单管理模块中的持久化类Customer, 其属性是通过映射文档映射到数据库中的CUSTOMER表. 这样对外隐藏了内部实现的细节, 规范了事务处理部分中每个属性所对应的数据库字段的数据操作. 为简化开发本文采用结合hbm2java工具和build.xml文件自动生成Customer.java文件, 其生成的部分代码如下:
3.4.4 实现持久化操作
Hibernate为Java 程序员提供了面向对象的API和接口来操纵数据库, 从而避免了在业务逻辑中嵌入大量的JDBC访问和事物控制代码. SessionFactory接口对应我们的数据库存储源, 程序从此接口中得到Session接口实例. Session接口是应用中进行持久化时经常使用的接口, 它提供了所有的持久化相关操作,同时我们可以通过Session接口获得Tranaction接口来实现数据库事务的控制. Hibernate还提供了我们其它一些实用接口和类, 如Query接口等. 首先, 映射文件要将持久化类映射到相应的数据库表, 这里需要用Configuration类配置, 并建立起映射关系, 然后在这个配置基础上建立一个会话工厂SessionFactory.
Configuration cfg=new Configuration().configure();
SessionFactory sf=cfg.buildSessionFactory();
创建会话工厂后, 就可以从中获取会话Session. 每次Session操作, 代表应用程序和持久层之间的一次对话, 也就是一次数据处理. 获取Session后, 可以对对象进行保存、查询、删除和修改等操作. 使用Hibernate提供的面向对象的查询语言HQL(Hibernate Query Language), 使得对对象的操作变得十分简单:
以查询条件为客户姓名和地址, 采用HQL检索方式为例说明查询方法, 其相应的代码如下:
Struts减弱了业务逻辑接口和数据接口之间的耦合, 而Hibernate框架提供了数据持久层的支持, 可以使开发人员专心地实现业务逻辑而不用分心于繁琐的数据库方面的逻辑, 减小出错的机会. 本文通过将Struts和Hibernate这两个框架的结合, 充分发挥了两者的优点, 有效地缩短了系统开发周期, 使得项目开发简洁、结构清晰, 并且通过实例说明了利用Hibernate实现数据持久化的可行性.
[1]孙卫琴. 精通STRUTS:基于MVC的JavaWeb设计与开发[M]. 北京: 电子工业出版社, 2004
[2]宋秀琴, 侯殿昆, 方中纯. 基于Struts 和Hibernate 的Web 应用的构建[J]. 微计算机信息, 2005,11-3: 125~127
[3]叶宇枫, 胡贞华. 基于J2EE架构的办公自动化系统的设计研究[J]. 计算机科学. 2006, 33(8): 287~289
[4]李伟镰, 卢建朱.基于Struts和Hibernate的电子申购系统 [J]. 计算机工程, 2005, 31(19): 290~222
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!