[摘要] 傳統(tǒng)的石化行業(yè)管理主要以電子文檔和紙質(zhì)材料為媒介,分散且不便于集中管理。對此,本文提出開發(fā)基于Tapestry 5和EJB 3的B/S架構(gòu)的數(shù)據(jù)庫管理系統(tǒng),對多年積累的數(shù)據(jù)進(jìn)行匯總分析,為高級(jí)管理人員提供決策參考。
[關(guān)鍵詞] Tapestry;EJB 3;框架
doi : 10 . 3969 / j . issn . 1673 - 0194 . 2011 . 13. 039
[中圖分類號(hào)]F270.7;TP311 [文獻(xiàn)標(biāo)識(shí)碼]A [文章編號(hào)]1673 - 0194(2011)13- 0065- 03
Web應(yīng)用程序可以分為表示層、業(yè)務(wù)層、持久層和領(lǐng)域模型層。按照這種分層結(jié)構(gòu),本文分別介紹Tapestry和EJB 3兩種開源框架。Tapestry使得程序具有一致性的結(jié)構(gòu),通過開發(fā)Tapestry組件,增強(qiáng)了代碼的復(fù)用性和程序的健壯性。結(jié)合項(xiàng)目實(shí)例介紹了如何整合這兩種框架構(gòu)建Web的應(yīng)用。應(yīng)用這種整合框架,可以使系統(tǒng)層次清晰,并實(shí)現(xiàn)層之間的解耦,各層可以獨(dú)立開發(fā),極大地提高了開發(fā)效率。
1 基于Tapestry+EJB3的軟件架構(gòu)
1.1 Tapestry框架簡介
Tapestry是一個(gè)使用Java語言創(chuàng)建Web應(yīng)用的面向組件的開源框架。其中Tapestry 5是框架的第5個(gè)版本。Tapestry應(yīng)用建立在根據(jù)組件構(gòu)建的頁面的基礎(chǔ)上。這個(gè)框架能夠提供輸入驗(yàn)證、本地化/國際化、狀態(tài)/持續(xù)性管理、URL構(gòu)建/參數(shù)映射等功能。獨(dú)一無二的類重載機(jī)制使得開發(fā)者對源代碼的修改無需重新部署和啟動(dòng)便可立即顯現(xiàn),極大地提高了開發(fā)的效率。組件的思想貫穿Tapestry 5始終。以BeanEditForm組件為例,用戶只需要寫極少的代碼就可以實(shí)現(xiàn)一個(gè)JavaBean中所有屬性到一組組件的映射。同時(shí),在Web 2.0時(shí)代,Tapestry提供了老練的Ajax支持。由于JavaScript在瀏覽器運(yùn)行時(shí)的不穩(wěn)定性,框架對其進(jìn)行了很好的隱藏。此外,完善的驗(yàn)證機(jī)制,內(nèi)置的國際化策略都使得Web開發(fā)輕而易舉。系統(tǒng)開發(fā)工程中大量使用該框架的優(yōu)秀特性,極大地提高了開發(fā)的效率。
1.2 EJB 3框架簡介
EJB(Enterprise JavaBeans)是J2EE平臺(tái)的中心,它用于開發(fā)和部署商業(yè)應(yīng)用程序的分布式組件模型,EJB作為一種實(shí)現(xiàn)業(yè)務(wù)邏輯的組件技術(shù),具有可擴(kuò)展性、事務(wù)處理和安全保密性。而項(xiàng)目采用的是EJB 3.0,使用元注釋(Annotation)替換原有的XML的部署描述文件以及采用依賴注入等優(yōu)勢L4J,降低了程序的復(fù)雜性和組件之間的耦合性,大大提高了系統(tǒng)的開發(fā)效率。而將系統(tǒng)的業(yè)務(wù)核心集中在EJB層完成,在Web層實(shí)現(xiàn)MVC模式調(diào)用,實(shí)現(xiàn)了EJB層和Web層的解耦,使得編程難度降低,且形成模板化,從而使得本系統(tǒng)具有易于維護(hù)和擴(kuò)展、低成本、高效率等特點(diǎn) 。開發(fā)需求多變的企業(yè)級(jí)應(yīng)用系統(tǒng),應(yīng)用EJB技術(shù)將大大簡化系統(tǒng)的開發(fā)和維護(hù)成本。
EJB 的運(yùn)行環(huán)境:EJB 需要運(yùn)行在EJB容器,每個(gè)JavaEE應(yīng)用服務(wù)器都含有EJB 容器和Web 容器,所以既可以運(yùn)行EJB,也可以運(yùn)行Web 應(yīng)用。目前支持EJB 3.0的應(yīng)用服務(wù)器有JBOSS(4.2.x 以上版本)、Glassfish、Weblogic(10 以上版本)、Sun Application Server(9.0 以上版本)、Oracle Application Server(10g 以上版本)和我們國內(nèi)的Apusic 應(yīng)用服務(wù)器。本文將介紹JBOSS和Weblogic,前者是使用者最多的開源應(yīng)用服務(wù)器,后者是市場占有率最高的商業(yè)應(yīng)用服務(wù)器。注意:Tomcat 目前只是Web 容器,它不能運(yùn)行EJB應(yīng)用。
1.3基于EJB 3的B/S架構(gòu)
1.3.1 Enterprise JavaBeans(EJB)
Enterprise JavaBeans 是一個(gè)用于分布式業(yè)務(wù)應(yīng)用的標(biāo)準(zhǔn)服務(wù)端組件模型。采用Enterprise JavaBeans 架構(gòu)編寫的應(yīng)用是可伸的、事務(wù)性的、多用戶安全的。可以一次編寫這些應(yīng)用,然后部署在任何支持Enterprise JavaBeans 規(guī)范的服務(wù)器平臺(tái),如Jboss、Weblogic等。
Enterprise JavaBean(EJB)定義了3種企業(yè)Bean,分別是會(huì)話Bean(Session Bean),實(shí)體Bean(Entity Bean)和消息驅(qū)動(dòng)Bean(MessageDriven Bean)。
1.3.2JNDI
JNDI是自JDK 1.3 版本開始就綁定的標(biāo)準(zhǔn)Java API。它為各種現(xiàn)有的命名和目錄服務(wù)提供了通用接口:DNS、LDAP、活動(dòng)目錄(Active Directory)、RMI注冊器、COS注冊器、NIS 及文件系統(tǒng)。在結(jié)構(gòu)上,JNDI 由兩部分組成:客戶API 和服務(wù)提供商接口(Service Provider Interface,SPI),應(yīng)用程序通過客戶API 訪問命名和目錄服務(wù);服務(wù)提供商接口用于供廠商創(chuàng)建命名和目錄服務(wù)的JNDI 實(shí)現(xiàn)。JNDI的結(jié)構(gòu)如圖1所示。

EJB 開發(fā)者只需要知道使用客戶API 如何訪問命名和目錄服務(wù)即可,而不需要知道JNDI SPI 的使用,因?yàn)椴恍枰褂茫剩危模?SPI 開發(fā)JNDI 實(shí)現(xiàn)產(chǎn)品,這就好比通過JDBC 訪問數(shù)據(jù)庫,我們只需要知道使用JDBC API 如何訪問數(shù)據(jù)庫,而不需要知道數(shù)據(jù)庫的JDBC 驅(qū)動(dòng)如何實(shí)現(xiàn)。使用客戶API 訪問EJB 3.0,只需編寫少量JNDI代碼。
1.3.3應(yīng)用范圍
EJB 3.0只專注于業(yè)務(wù)核心的開發(fā),它并不關(guān)心客戶端的類型及其使用的技術(shù)。既可以在Web 中調(diào)用EJB,也可以在J2SE 或J2ME中調(diào)用EJB。對于在Web中調(diào)用EJB,可以把代碼直接寫在JSP中,但這種做法已經(jīng)被拋棄,原因是Java代碼與HTML代碼相混合,不但可讀性差,而且維護(hù)起來也很麻煩。目前,在Web 開發(fā)上,我們可以引入第三方Web框架,如Struts,JSF,Spring MVC,Tapestry等。其實(shí)使用EJB開發(fā)項(xiàng)目,對于選擇Web框架會(huì)顯得不是那么重要,因?yàn)槿蘸蠹词垢鼡Q成另一種框架,對于業(yè)務(wù)核心是不會(huì)構(gòu)成任何影響的。即使如此,我們選擇Web 框架仍需謹(jǐn)慎,因?yàn)檎l也不想換來換去。目前,可推薦的Web框架是Struts 和JSF,前者是這幾年的主流框架,使用的開發(fā)人員比較多,后者屬于JavaEE規(guī)范,有望成為Web框架的主角。其中一個(gè)樣例如圖2所示。

(1)瀏覽器請求Test.jsp 文件。
(2)應(yīng)用服務(wù)器的JSP 引擎編繹Test.jsp。
(3)Test.jsp 通過JNDI 查找獲得HelloWorld EJB 的存根對象,然后調(diào)用SayHello()方法,EJB 容器截獲到方法調(diào)用。
(4)EJB 容器調(diào)用HelloWorld 實(shí)例的SayHello()方法。
2項(xiàng)目實(shí)例
2.1 EJB 3端:META-INF/persistence.xml 配置文件
關(guān)聯(lián)所有的持久層類,企業(yè)級(jí)數(shù)據(jù)庫可以利用HQL語法無縫將數(shù)據(jù)轉(zhuǎn)換成對象。
<?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
類型:接口
目的:通過實(shí)現(xiàn) java.io.Serializable 接口以啟用其序列化功能。主要加載DAO層中的類。
class BaseSvc
類型:抽象類
目的:實(shí)例化DAO中的各種方法。
interface GridDataSource
類型:接口
目的:配合表格組件使用,完成分頁等具體功能,并保證數(shù)據(jù)庫取值的范圍。
2.3 EJB 3端:JBOSS的數(shù)據(jù)庫連接配置
不同的數(shù)據(jù)庫對應(yīng)不同的配置文件,以下是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 關(guān)聯(lián)EJB 3
通過從配置文件中取得相應(yīng)函數(shù),指向關(guān)聯(lián)的EJB 3應(yīng)用。
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 如何調(diào)用EJB 3中的DAO
@InjectEjb("UserServiceBean/remote")
private UserServiceBeanRemote userService;
上述應(yīng)用寫入到Java的表現(xiàn)層類中即可直接應(yīng)用EJB 3中的相應(yīng)的DAO方法。
3結(jié)束語
本文介紹了J2EE開發(fā)中的輕量級(jí)框架組合Tapestry+EJB 3,并通過實(shí)例說明組合框架的應(yīng)用。應(yīng)用Tapestry+EJB 3框架構(gòu)建Web應(yīng)用程序具有很好的擴(kuò)展性、可維護(hù)性,并能充分發(fā)揮兩者的優(yōu)勢,因此該組合框架具有很好的應(yīng)用前景。
主要參考文獻(xiàn)
[1]李慧宗,孟祥瑞.基于J2EE的中小企業(yè)電子商務(wù)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].中國管理信息化,2010(1):109-111.
[2]劉能現(xiàn),俞建家.基于Tapestry+Spring+Ibatis框架的Web應(yīng)用開發(fā)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2008(12):174-177.