ZHANG Hao, LIU Hong-Jun, KANG Bo
( Institute of Information Technology, Jiujiang University , Jiujiang , China )
Abstract: Focusing on enhancing efficiency of development of Web application system , this article take the teaching simulating system of submitting country's tax as the example, proposed method based on many kinds of outstandingly opens source frameworks to develop J2EE application system fast . Separately introducing frameworks by Web designing layers like Hibernate, Spring, JSF and Ajax4JSF, as well as process of applying its synthesis and the teaching simulating system of submitting country's tax. From several aspects of data accessing, page jumping, container management and code generating introducing the core thought of fast development.
Keywords: j2EE; Hibernate; Spring; Fast Develop
1 引言
软件系统发展到今天,涉及的知识和技术太多。在某些方面使用成熟的框架,避免重复一些基础工作。而且框架一般是成熟、稳健的,可以处理系统很多细节问题,比如,事物处理,安全性,数据流控制等问题。开源框架给我们带来成功经验的同时,也降低了开发成本。
本文针对J2EE领域,对应于信息系统分层结构的多个优秀开发框架的原理,和实际应用作详细阐述,并提出Web应用系统快速开发方法。
2 分层的软件和框架介绍
随着Internet 和Web 技术的迅速发展、深入研究,基于Web 的分层模型设计在软件设计中进入了快速发展、应用阶段。分层模型是软件设计时用得最多的技术之一,分层模型的目标和优点是松散耦合。分层模型中最困难也最重要的是决定如何分层,每层的职责是什么。以下从数据库、ORM、IOC容器、组件框架和Ajax分别介绍各层对应的优秀框架和软件。
2.1 数据库
PostgreSOL是由大学科研原型系统项目转变为时下流行的开放源代码数据库,它的前身是Postgres数据库。PostgreSQL具有用户自定义类型与操作符、表继承、部分索引与表达式索引、丰富的服务器端编码接口等特性。就技术层面而言,PostgreSQL与商业数据库相比并不逊色。
2.2 ORM
Hibernate是一种实现对象/关系之间映射的开源框架 ,对JDBC进行了轻量级的对象封装,使得程序员可以使用面向对象编程思维来操作关系数据库[1]。它是按照LGPL许可证发布的开放源代码应用程序,用于Java的超高性能的对象/关系持久性和查询服务。Hibernate已成为java领域内首选的ORM工具,它的体系结构如图1所示:
图1 Hibernate体系结构总览
2.3 IOC容器
Spring提供了一套全面并且十分成熟的轻型应用程序基本框架,并且对复杂的应用开发提供了有力的支持。Spring最大的优势在于它是从实际项目开发经验中抽取的,其提供了丰富的类库,可大大节省编码量,它是一种高效的、可高度重用的应用框架。Spring框架中目前最吸引人也是该应用框架最具特色的地方就是名为控制反转(IOC=Inverse Of Control)或者依赖注入(DI=Dependence Injection)的设计思想 [2]。对于依赖容器的参数化事务管理而言,Spring则可以用来帮助实现对事务的管理而无须使用EJB。
Spring本身也是一个容器,只是相对EJB容器所要付出的代价而言,Spring属于轻量级容器,它能够替代EJB,通过使用AOP来提供声明式事务管理,即可通过Spring实现基于容器的事务管理。Spring与EJB最大的区别在于:第一,Spring可以为任意的Java Class实现事务管理而无须转换成标准的EJB;第二,Spring事务管理并不依赖特定的事务资源从而使得系统的应用与部署更佳灵活。
2.4 基于组件的表示层
JSF是一个包括SUN在内的专家组定义的基于组件的WEB应用程序框架,但其又具备类似Struts形式的页面跳转控制和MVC模式特征[3]。JSF的组件概念没有象Struts那样必须继承ActionForm的限制;JSF在事件粒度上要细腻,不象Struts那样,一个页面一个事件,JSF可以细化到表单中的每个字段上。
JSF 的主要优势之一就是它既是 Java Web 用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架,结构如图2所示。用户界面代码(视图)与应用程序数据和逻辑(模型)的清晰分离使 JSF 应用程序更易于管理。为了准备提供页面对应用程序数据访问的 JSF 上下文和防止对页面未授权或不正确的访问,所有与应用程序的用户交互均由一个前端“Faces Servlet”(控制器)来处理。
图2 JSF的MVC实现
MyFaces 是一个JSF实现,它通过 Apache 作为一个开放源代码项目提供。Myfaces 还是对 JSF 基本 UI 组件的增强,它拥有更广泛的 UI 功能,如集成的 Tiles 支持、支持 Javascript 的菜单和树控件。
2.5 Ajax
Ajax4jsf 是一个在JSF页面中添加Ajax(Active Javascript and Xml)功能而不用写JS代码的开源框架[4]。该框架使用一个组件库来添加Ajax技术到已存在的页面中,而不用写任何js代码或者用新的Ajax widgets来替换已经存在的JSF组件。Ajax4jsf使用页面范围的Ajax支持来替代传统的组件范围的支持.这意味着你可以在页面中定义事件来激活Ajax请求,和当Ajax请求根据客户端的事件改变了服务器的数据时应该同步的页面区域。
2.6 Xdoclet
以上介绍的各个框架都或多或少需要配置文件,而这些文件大多是xml文件。为了提高开发效率,需要找到自动生成xml配置文件的方法。
XDoclet是一个扩展的Javadoc Doclet引擎。它是一种通用的java工具,可以让你创建自己的javadoc @tags进而利用XDoclet中的Templet enging基于这些@tags生成源代码或其他文件。XDoclet已经支持一些常见的任务了,例如生成web应用的web.xml和JSF的faces-config.xml等。 结构如图3所示。
图3 Xdoclet黑盒子
3 基于多框架的J2EE快速开发方法
3.1 模拟电子报税教学系统简介
模拟电子报税教学系统的主要功能是以信息化的手段模拟国家纳税申报过程的整个流程,本系统为高校财务会计专业的学生学习国家税务知识提供一个生动形象的平台,让他们以直接动手的方式学习我国纳税申报的整个过程,适应企业现代化报税需求。
为了方便地实现模块化开发、提高代码的重用性和维护性,并充分考虑到系统的跨平台和开发成本等因素,模拟电子报税教学系统采用J2EE平台和基于开源框架的分层结构。图4展示了模拟电子报税教学系统的设计模型。
图4 模拟电子报税教学系统的设计模型
模拟电子报税教学系统的开发架构最终确定为Postgresql+Hibernate+Spring+Myfaces+Ajax4jsf,并综合使用Xdoclet+Junit+Tomcat简化开发过程。
3.2 模拟电子报税教学系统的快速开发
表示层的Myfaces框架和综合管理业务逻辑层、数据访问层的Spring框架在系统中起着举足轻重的作用。这些框架关注软件开发的多个侧重点(Aspect),如数据访问、页面跳转、对象生命期和事务管理等。将各种各样关注信息和各种配置文件元信息与后台源代码放置在一起,有助于开发人员理清思路。以下选择表示层和业务逻辑层阐述本系统的具体实现。
3.2.1 表示层
使用Myfaces框架实现表示层的具体步骤为:
1) 设计用于存取公共信息的全局基类;
2) 设计各个表示环节的后台托管Bean;
3) 设计与托管Bean相对应的JSF页面;
4) 根据业务流程设计页面跳转流程;
5) 配置face-config.xml和web.xml。
以教师通过后台管理功能检查学生的申报表为例,访问homeworkList.jsp时,JSF的FacesServlet截获学生查看作业列表的请求,通过解析homeworkList.jsp中表格的数据来源是#{SelectHomeworkBean.homeWork},再通过查找face-config.xml进一步得到数据来源是edu.jju.aet.SelectHomeworkBean类。FacesServlet调用SelectHomeworkBean.getHomeWork得到数据,并将其显示在此页面中。
其中用到的实际编写代码和xdoclet元数据主要有:
1) BaseBean被设计用于保存用户浏览平台的当前若干状态信息,如当前用户、当前课程和在线时间等:
public class BaseBean {
private Visit visit;
···//getter-setters
}
2) 所有的托管Bean将继承自BaseBean:
/** @jsf.bean name=" SelectHomeworkBean " scope="request"
* @jsf.navigation from="/homeworkList.jsp" result="viewdetail" to="/ detail .jsp" …*/
public class SelectHomeworkBean extends BaseBean{
/** @jsf.managed-property name="visit" value="#{visit}" */
…}
3) 这样,所有的Bean都可以访问到session范围的状态信息visit:
public class Visit {
private Userinfo user;
private Homework currentHomework;
…//other members and getter-setters
}
最后,由Xdoclet生成的JSF配置文件内容如下:
<managed-bean>
<managed-bean-name>SelectHomeworkBean</managed-bean-name>
<managed-bean-class>edu.jju. aet.SelectHomeworkBean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>visit</property-name>
<property-class> edu.jju.aet.web.Visit</property-class>
<value>#{sessionScope.visit}</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/homeworkList.jsp</from-view-id>
<navigation-case>
<from-outcome>viewdetail</from-outcome>
<to-view-id>/detail.jsp</to-view-id>
</navigation-case>
</navigation-rule>
Web 应用的特点是用户可能从任何地方进入,按照一种完全随机的次序访问各个页面,甚至可能跳过多个页面,也可能在很长的时间内毫无动静。无论是JSF 还是其他Web编程框架都无法改变这一点,然而JSF 能够隐藏Web访问固有的混乱,帮助开发者建立清晰明确的秩序和规则。
3.2.2 业务逻辑层
业务逻辑层处理系统中的所有业务逻辑。业务逻辑层的组件是系统最具价值的软件工具。在这里包含了报税过程的访问控制和修改数据的规则。由于在层次体系结构中责任的分离,因此这一层的重点在于设计对象的可重用性,减少表示层与数据层的耦合。
在业务逻辑层定义的组件可分为以下三类:
1) Resource Control(系统资源控制)
管理所有的资源,包括课件资源、作业资源和在线测试等的CRUD操作、访问控制等。
2) Status Recorder (记录学习状态)
包括实体(教师、学生)的当前学习、管理状态和访问记录等。
3) Business Handler (处理业务逻辑)
包括申报纳税、税款计算和税款缴纳等业务逻辑的处理过程。
将业务逻辑组件交给spring托管,是快速开发方法的核心之一:
1) 业务逻辑组件和xdoclet元数据
/**@spring.bean id="HomeworkServiceTarget"*/
public class HomeworkService implements IHomeworkService {
private edu.jju.persist.IUserinfoDAO userinfoDao;
/**@spring.property name="userinfoDao" ref="UserinfoDAO" */
public edu.jju.persist.IUserinfoDAO getUserinfoDao() {
return userinfoDao;
}
…
}
2) 全局状态信息visit
<bean id="visit" class=" edu.jju.jsf.bean.Visit" scope="session"/>
3) DAO托管和基于容器的事务管理
<bean id="UserinfoDAO"
class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="singleton">
<value>false</value>
</property>
<property name="interceptorNames">
<list>
<value>allInTransaction</value>
<value>UserinfoDAOTarget</value>
</list>
</property>
</bean>
<bean id="allInTransaction"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="txManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="txManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
以上介绍了通过各框架之间的协作快速构建Web应用系统的过程,由此可见,采用多种框架协作开发很大程度上提高了开发效率。同样方法,通过xdoclet快速生成hibernate映射文件,也可以快速构建数据实体层。
4 结论
在模拟电子报税教学系统开发中,采用开源框架来实现各层操作,其优势是显而易见的。首先,Hibernate提供了从对象到数据库表的映射和数据查询、恢复等机制,实现数据层对象的持久性;其次,Spring提供了IOC的Bean管理模式,并提供了灵活的通过接口操作对象的机制,其可扩展性相对于MVC框架来说要好得多;同时,Myfaces是丰富的组件框架,提供可自定义组件机制;最后Xdoclet提供了编写繁琐的xml配置文件的替代方式。综上所述,使用基于框架的快速开发方法,使Java企业级应用开发更加容易、灵活、强大。
参考文献
[1] Hibernate. 2006. http://hibernate.org
[2] Martin Fowler.Inversion of Control Containers and the Dependency Injection Pattern[J/OL],2004
[3] Kito D. Mann. JavaServer Faces in Action[M].Manning,2005
[4] Dave Crane,Eric Pascarello. AJAX In Action[M].Manning,2006