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应用开发也必将成为主流技术。
目前,该系统已应用于深圳市某基金公司,并取得了良好的效果。