引言
开发过程中一个优秀的框架可以极大的提高开发效率。随着Web开发技术的日趋成熟,在Web开发领域出现了一些现成的优秀的框架,开发者可以直接使用它们,Struts与Hibernate就是两种比较成功的框架。Struts框架运用MVC模式开发使Web应用变得很灵活,但Struts在Model部分的实现并不理想,而O/R Mapping 产品hibernate将关系型数据库的数据对象化,可作为持久层的解决方案。Struts和Hibernate框架整合则很好地实现了控制流、业务调用、表示这三者的分离,使系统在开发效率、可维护性、可扩展性方面都有良好的改进。本文的基金信息管理系统表现层采用了Struts,数据持久层选择了Hibernate,业务逻辑层则用普通java对象,从而开发出功能强大而又灵活的基金信息管理系统。文中还着重阐述了基于Struts和Hibernate架构实现基金信息管理系统的方法和关键技术。
1、用Struts框架实现MVC
模型-视图-控制器(Model-View-Controller,简称MVC)是一种目前广泛流行的软件开发设计模式。“Model”代表应用的业务逻辑,“View”代表应用的表示,“Controller”提供应用的处理过程控制。通过这个设计模型,可以把应用逻辑、处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。
模型层负责表达和访问商业数据,执行商业逻辑和操作。在模型层变化的时候,它通知视图层,并提供后者访问自身状态的能力,同时控制层也可以访问其功能函数以完成相关的任务。视图层负责显示模型层的内容,它从模型层取得数据并指定这些数据如何被显示出来。在模型层变化的时候,它将自动更新。另外视图层也会将用户的输入传送给控制器。控制器负责定义应用程序的行为。它可以分派用户的请求并选择恰当的视图以用于显示,同时它也可以解释用户的输入并将它们映射为模型层可执行的操作。
Struts框架是实现MVC模式的一个应用框架,它由一组相互协作的组件、Servlet以及JSP TagLib组成。Struts的核心组件有ActionServlet、Action、ActionForm、ActionMapping、ActionForward及TagLib、配置文件等。其中控制器由ActionServlet来实现,模型由Action和ActionForm来实现,视图则由JSP结合JSP TagLib来实现。
2、对象关系映射工具Hibernate
Hibernate是一种实现对象和关系之间映射(Object Relation Mapping)的框架。它对JDBC进行了轻量级的对象封装,使得Java程序员可以使用面向对象编程思维来操作关系数据库。在多层结构的应用中,业务层和数据层之间存在一个持久层,它负责应用到数据库的数据存储,数据的检索和更新。持久层的实现技术包括JDBC、实体Beans、JDO以及Hibernate等,但是JDBC中数据访问对象和SQL语句直接绑定在一起降低了可维护性,且不支持继承和多态。
EJB不支持继承和多态而且还需要额外的EJB容器。相比之下Hibernate则是一个非常好的选择,目前的应用系统大多使用关系数据库,在做设计和开发时又是面向对象的方式,这时就可以选用Hibernate来实现对象、关系之间的映射和数据的持久化。而且Hibernate拥有一种功能非常强大的查询语言(HQL),这种语言与SQL非常相似,便于掌握。
在应用Hiberante框架时,首先编写O/R映射描述文件,完成对象、关系数据库之间的映射。持久对象可以根据映射文件生成,然后编写业务逻辑类。这些JavaBean实现了具体的业务逻辑,也封装了对Hibernate的访问。Hiberante利用数据库以及其他一些配置文件如hibernate.properties,XML Mapping等,为应用程序提供数据持久服务。
3、基于Struts和Hibernate框架构建的基金信息管理系统
通过前面的介绍,Struts和Hibernate都具有自己的优点和不足,如果将两者结合起来,通过Struts技术来降低M—V—C各层之间的耦合性,而利用Hibernate架构来降低业务模型部分的开发难度。结合之后的好处是采用Struts和Hibernate结合的应用框架开发出来的信息系统无论在整体的架构上还是在局部的复杂业务模型中都得到了更低的耦合性,它们的灵活性与可维护性也得到了提高,从而消除了单独使用这些架构开发系统的不足。
本系统采用的Struts+Hibernate构架如图1所示[5]。在这个方案中,视图层是采用JSP技术结合Struts强大的TagLib来实现;业务层的核心部件是控制器,它由Struts的控制组件ActionServlet、ActionMapping及Action来实现,业务层还包含业务逻辑类,它由JavaBean来实现。当然,这些JavaBean里封装了与Hibernate的交互关系,业务层通过模型层来实现与数据库资源的交流,这一部分工作由Hibernate来做。最底层是关系数据库。
图1:系统的应用框架
4、使用Struts和Hibernate架构实现基金信息管理系统
随着技术的进步和企业管理要求的提高,办公自动化系统逐步发展到了以“知识管理”为核心的办公自动化系统,本项目的提出者为深圳市某一基金公司。
本系统在基金办公的自动化、网络化的基础之上,再实现基金公司内部及时通讯,提高基金公司员工的沟通能力;并在统一的系统平台下,连接基金公司各类信息系统和各类资源,是企业内部进行信息交流和管理的平台。本系统采用Struts和Hibernate框架结合进行Web应用程序开发,从而有效的保证系统的可交换性、可维护性、可扩展性和可移植性。
本系统主要由我的工作台、我的办公室、办公直通车、信息中心、研究平台、公司论坛、系统管理几个模块组成。系统的总体架构如图2所示。
采用Struts构建系统,系统中的每个模块都有一个自己的配置文档,以控制该模块的流程,每个模块除了业务逻辑不一样之外,采用Struts和Hibernate架构来实现模块的技术与过程完全一样。下面仅就研究平台模块中的基金净值子模块为例进行说明。用户登陆该模块,可以浏览公司的基金最新净值列表,并可根据基金代码、基金名称查询某支基金的历史净值和基金净值走势图。
图2:基金信息管理系统结构图
4.1 控制层的实现
Struts控制器组件主要负责接受用户请求,更新模型,以及选择合适的视图组件返回给用户,它在模型和视图之间起这中间调度作用。Struts的核心是控制器部分的ActionServlet,而ActionServlet通过一个xml配置文件来配置业务流程,因此这个模块用了一个struts-config-fund.xml来配置业务流程,同时在web.xml中申明这个配置项。
在struts-config-fund.xml中,声明每个业务所需要的客户端请求、处理该请求的Action类,收集该次请求数据信息的FormBean类,并说明业务执行完毕后各种结果应该给用户返回的视图。struts-config-fund.xml代码节选如下:
<form-beans> <form-bean name="fundForm" type="com.oaking.phua.web.fund.FundForm"/> </form-beans> <action-mappings> <action path="/listFundNav" type="com.oaking.phua.web.fund.FundAction" name="fundForm" scope="request" parameter="listFundNav" validate="true" input="/fund/fund_nav_list.jsp"> </action> </action-mappings>
|
ActionServlet将会按照这个配置表,在收到客户端查看某支基金的基金净值的信息之后,会将用户在JSP页面上提交过来的数据填充到模型类FundForm中,而这个FundForm必须先在struts-config-fund.xml中定义。FundForm使用了Struts的Validator验证框架,它能对用户输入的表单数据进行验证。如果验证未通过,会将错误返回输入页面。当数据成功填充到FundForm后,ActionServlet会转向FundAction,在那里面进行业务逻辑操作。FundAction部分代码如下:
public class FundAction extends BaseAction { …………. public ActionForward listFundNav(ActionMapping mapping, ActionForm form) throws Exception { FundForm formBean = (FundForm)form; FundService biz= (FundService)ServiceFactory. find(com.oaking.phua.service. fund.FundService.class); TfundNav tfundNav = new TfundNav(); Util.copyBeanProperty(formBean, tfundNav); java.util.List list = biz.getFundNavs(tfundNav, 15, formBean.getPage()); WebContextHelper.setPageAttribute("fundlist", list); return mapping.getInputForward(); }
|
4.2 模型层及持久层的实现
在FundAction中只是执行了业务逻辑功能,而真正的业务处理和对象持久化工作是在模型层与持久层中实现。在FundAction中,创建了类FundService的对象biz,然后调用该类的getFundNavs方法,查询出该基金的历史净值表。类FundService中getFundNavs方法代码如下:
public List getFundNavs(TfundNav o, int pageSize, int page) throws AppException { BaseQueryHelper bq = BaseQueryHelper. getInstance (com.oaking.phua.entity.TfundNav.class); bq.eq ("fundid", o.getFundid()); bq.eq ("fundnm", o.getFundnm()); bq.orderByDesc (newString[]{ "fundid", "settledate"}); String sql = bq.getQueryString(); net.sf.hibernate.type.Type types[] = bq.getTypes(); Object params[] = bq.getArgs(); return getQueryList(sql, params, types, pageSize, page); }
|
TFundNav是Hibernate里面的持久化类,它的属性通过Hibernate的配置映射文档TfundNav.hbm.xml映射到关系数据库中。Hibernate的映射文件说明了一个持久化类与关系数据库表的映射关系,包括映射到哪个字段,以及集合属性映射到哪些相关字段。TfundNav.hbm.xml文件配置如下:
<hibernate-mapping> <class name="com.oaking.phua.entity.TfundNav" table="T_FUND_NAV" lazy="true"> <composite-id> <key-property name="fundid" column="FUNDID" type="java.lang.String" length="6" /> <key-property name="fundnm" column="FUNDNM" type="java.lang.String" length="20" /> <key-property name="nav" column="NAV" type="double" length="7" /> <key-property name="sumnav" column="SUMNAV" type="double" length="7" /> <key-property name="settledate" column="SETTLEDATE" type="java.lang.String" length="8" /> </composite-id> </class> </hibernate-mapping>
|
4.3 Hibernate的数据库连接配置
在Web-INF\Classes目录下创建名为Hibernate.cfg.xml的配置文件,并且将它的路径添加到应用的类路径中就可以完成Hibernate的配置。该配置文件由Hibernate用来连接到数据库、生成模式和获得其它特定数据库信息的属性组成。要将底层数据库内的变动映射到整个应用,只需要修改该文件内的属性值。该项目使用Oracle9i,其数据库连接配置如下:
<hibernate-configuration> <session-factory> <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver </property> <property name="hibernate.connection.url"> jdbc:oracle:thin:@192.168.70.98:1521:oracledb</property> <property name="hibernate.connection.username">###</property> <property name="hibernate.connection.password">###</property> <property name="hibernate.connection.pool.size">50</property> <property name="hibernate.dialect">net.sf.hibernate.dialect.Oracle9Dialect</property> ……….. <mapping resource="/TfundNav.hbm.xml"/> </session-factory> </hibernate-configuration>
|
5、总结
本文介绍了采用Struts和Hibernate框架的工作原理,并结合一个具体的实例论述了如何具体实现Struts框架和Hibernate应用相结合进行Web应用开发。实践证明,采用Struts和Hibernate结合的J2EE框架进行Web开发,充分发挥了两者的优点,有效地提高了项目的开发效率,使系统具有良好的交互性、可扩展性和可维护性,基于这两种框架进行Web应用开发也必将成为主流技术。
目前,该系统已应用于深圳市某基金公司,并取得了良好的效果。