[摘要] 传统的石化行业管理主要以电子文档和纸质材料为媒介,分散且不便于集中管理。对此,本文提出开发基于tapestry 5和ejb 3的b/s架构的数据库管理系统,对多年积累的数据进行汇总分析,为高级管理人员提供决策参考。
[关键词] tapestry;ejb 3;框架
web应用程序可以分为表示层、业务层、持久层和领域模型层。按照这种分层结构,本文分别介绍tapestry和ejb 3两种开源框架。tapestry使得程序具有一致性的结构,通过开发tapestry组件,增强了代码的复用性和程序的健壮性。结合项目实例介绍了如何整合这两种框架构建web的应用。应用这种整合框架,可以使系统层次清晰,并实现层之间的解耦,各层可以独立开发,极大地提高了开发效率。
1 基于tapestry+ejb3的软件架构
1.1 tapestry框架简介
tapestry是一个使用java语言创建web应用的面向组件的开源框架。其中tapestry 5是框架的第5个版本。tapestry应用建立在根据组件构建的页面的基础上。这个框架能够提供输入验证、本地化/国际化、状态/持续性管理、url构建/参数映射等功能。独一无二的类重载机制使得开发者对源代码的修改无需重新部署和启动便可立即显现,极大地提高了开发的效率。组件的思想贯穿tapestry 5始终。以beaneditform组件为例,用户只需要写极少的代码就可以实现一个javabean中所有属性到一组组件的映射。同时,在web 2.0时代,tapestry提供了老练的ajax支持。由于javascript在浏览器运行时的不稳定性,框架对其进行了很好的隐藏。此外,完善的验证机制,内置的国际化策略都使得web开发轻而易举。系统开发工程中大量使用该框架的优秀特性,极大地提高了开发的效率。
1.2 ejb 3框架简介
ejb(enterprise javabeans)是j2ee平台的中心,它用于开发和部署商业应用程序的分布式组件模型,ejb作为一种实现业务逻辑的组件技术,具有可扩展性、事务处理和安全保密性。而项目采用的是ejb 3.0,使用元注释(annotation)替换原有的xml的部署描述文件以及采用依赖注入等优势l4j,降低了程序的复杂性和组件之间的耦合性,大大提高了系统的开发效率。而将系统的业务核心集中在ejb层完成,在web层实现mvc模式调用,实现了ejb层和web层的解耦,使得编程难度降低,且形成模板化,从而使得本系统具有易于维护和扩展、低成本、高效率等特点 。开发需求多变的企业级应用系统,应用ejb技术将大大简化系统的开发和维护成本。
ejb 的运行环境:ejb 需要运行在ejb容器,每个javaee应用服务器都含有ejb 容器和web 容器,所以既可以运行ejb,也可以运行web 应用。目前支持ejb 3.0的应用服务器有jboss(4.2.x 以上版本)、glassfish、weblogic(10 以上版本)、sun application server(9.0 以上版本)、oracle application server(10g 以上版本)和我们国内的apusic 应用服务器。本文将介绍jboss和weblogic,前者是使用者最多的开源应用服务器,后者是市场占有率最高的商业应用服务器。注意:tomcat 目前只是web 容器,它不能运行ejb应用。
1.3基于ejb 3的b/s架构
1.3.1 enterprise javabeans(ejb)
enterprise javabeans 是一个用于分布式业务应用的标准服务端组件模型。采用enterprise javabeans 架构编写的应用是可伸的、事务性的、多用户安全的。可以一次编写这些应用,然后部署在任何支持enterprise javabeans 规范的服务器平台,如jboss、weblogic等。
enterprise javabean(ejb)定义了3种企业bean,分别是会话bean(session bean),实体bean(entity bean)和消息驱动bean(messagedriven bean)。
1.3.2jndi
jndi是自jdk 1.3 版本开始就绑定的标准java api。它为各种现有的命名和目录服务提供了通用接口:dns、ldap、活动目录(active directory)、rmi注册器、cos注册器、nis 及文件系统。在结构上,jndi 由两部分组成:客户api 和服务提供商接口(service provider interface,spi),应用程序通过客户api 访问命名和目录服务;服务提供商接口用于供厂商创建命名和目录服务的jndi 实现。jndi的结构如图1所示。
ejb 开发者只需要知道使用客户api 如何访问命名和目录服务即可,而不需要知道jndi spi 的使用,因为不需要使用jndi spi 开发jndi 实现产品,这就好比通过jdbc 访问数据库,我们只需要知道使用jdbc api 如何访问数据库,而不需要知道数据库的jdbc 驱动如何实现。使用客户api 访问ejb 3.0,只需编写少量jndi代码。
1.3.3应用范围
ejb 3.0只专注于业务核心的开发,它并不关心客户端的类型及其使用的技术。既可以在web 中调用ejb,也可以在j2se 或j2me中调用ejb。对于在web中调用ejb,可以把代码直接写在jsp中,但这种做法已经被抛弃,原因是java代码与html代码相混合,不但可读性差,而且维护起来也很麻烦。目前,在web 开发上,我们可以引入第三方web框架,如struts,jsf,spring mvc,tapestry等。其实使用ejb开发项目,对于选择web框架会显得不是那么重要,因为日后即使更换成另一种框架,对于业务核心是不会构成任何影响的。即使如此,我们选择web 框架仍需谨慎,因为谁也不想换来换去。目前,可推荐的web框架是struts 和jsf,前者是这几年的主流框架,使用的开发人员比较多,后者属于javaee规范,有望成为web框架的主角。其中一个样例如图2所示。
(1)浏览器请求test.jsp 文件。
(2)应用服务器的jsp 引擎编绎test.jsp。
(3)test.jsp 通过jndi 查找获得helloworld ejb 的存根对象,然后调用sayhello()方法,ejb 容器截获到方法调用。
(4)ejb 容器调用helloworld 实例的sayhello()方法。
2项目实例
2.1 ejb 3端:meta-inf/persistence.xml 配置文件
关联所有的持久层类,企业级数据库可以利用hql语法无缝将数据转换成对象。
<?xml version="1.0" encoding="utf-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence">
<persistence-unit name="core">
<jta-data-source>java:/oildata</jta-data-source>
<class>com.jncom.core.ejb3.control.entity.userhbm</class>
<class>com.jncom.core.ejb3.control.entity.rolehbm</class>
<class>com.jncom.core.ejb3.control.entity.operationhbm</class> <exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.sqlserverdialect" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
</persistence>
2.2 ejb3端:core/com/jncom/core/ejb3/base/ 持久层核心代码
class baseentity
类型:接口
目的:通过实现 java.io.serializable 接口以启用其序列化功能。主要加载dao层中的类。
class basesvc
类型:抽象类
目的:实例化dao中的各种方法。
interface griddatasource
类型:接口
目的:配合表格组件使用,完成分页等具体功能,并保证数据库取值的范围。
2.3 ejb 3端:jboss的数据库连接配置
不同的数据库对应不同的配置文件,以下是sql server的配置文件。
jboss-4.2.2.ga\server\default\deploy\ mssql-ds.xml
<datasources>
<local-tx-datasource>
<jndi-name>oildata</jndi-name>
<connection-url>jdbc:sqlserver://127.0.0.1:1433;databasename=oildata</connection-url>
<driver-class>com.microsoft.sqlserver.jdbc.sqlserverdriver</driver-class>
<user-name>oildata</user-name>
<password>oildata</password>
<metadata>
<type-mapping>ms sqlserver2005</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
2.4 tapetry 5端:com/jncom/core/tapestry/ejbinject/ejbinjectimpl.java 关联ejb 3
通过从配置文件中取得相应函数,指向关联的ejb 3应用。
public ejbinjectimpl() {
try {
if (initcontext == null) {
properties props = new properties();
props.setproperty("java.naming.factory.initial",
"org.jnp.interfaces.namingcontextfactory");
props.setproperty("java.naming.provider.url", systemconfig
.getappserverip()+ ":1099");
props.setproperty("java.naming.factory.url.pkgs", "org.jboss.naming");
initcontext = new initialcontext(props);
}
} catch (exception e) {
e.printstacktrace();
}
}
配置文件为:systemconfig_zh_cn.properties
serverip=192.168.0.180
serverport=1001appserverip=192.168.0.180
2.5 如何调用ejb 3中的dao
@injectejb("userservicebean/remote")
private userservicebeanremote userservice;
上述应用写入到java的表现层类中即可直接应用ejb 3中的相应的dao方法。
3结束语
本文介绍了j2ee开发中的轻量级框架组合tapestry+ejb 3,并通过实例说明组合框架的应用。应用tapestry+ejb 3框架构建web应用程序具有很好的扩展性、可维护性,并能充分发挥两者的优势,因此该组合框架具有很好的应用前景。
主要参考文献
[1]李慧宗,孟祥瑞.基于j2ee的中小企业电子商务系统的设计与实现[j].中国管理信息化,2010(1):109-111.
[2]刘能现,俞建家.基于tapestry+spring+ibatis框架的web应用开发[j].计算机技术与发展,2008(12):174-177.