使用 SQLJ 開(kāi)發(fā)應(yīng)用程序
用 DB2 UDB V8.1 和 Application Developer V5.1.2 創(chuàng)建使用 SQLJ 的 Java 和 J2EE 應(yīng)用程序




文檔選項(xiàng)



將此頁(yè)作為電子郵件發(fā)送


未顯示需要 JavaScript 的文檔選項(xiàng)


樣例代碼
級(jí)別: 初級(jí)
Owen Cline (owenc@us.ibm.com), 認(rèn)證的 IT 咨詢(xún)專(zhuān)家 - WebSphere 軟件服務(wù), IBM
2005 年 2 月 01 日
這篇 "how-to" 文章將解釋如何在 Java™ 應(yīng)用程序和 J2EE™ 應(yīng)用程序中使用 SQLJ。文中將介紹 SQLJ 語(yǔ)法,使用 SQLJ 訪(fǎng)問(wèn)數(shù)據(jù)源,建立 WebSphere® Application Developer 項(xiàng)目以支持 SQLJ,以及創(chuàng)建和調(diào)用 DB2® 存儲(chǔ)過(guò)程。
SQLJ 概述
SQL 語(yǔ)句包括查詢(xún)(SELECT)、插入(INSERT)、更改(UPDATE)、刪除(DELETE)語(yǔ)句以及其他對(duì)存儲(chǔ)在關(guān)系數(shù)據(jù)庫(kù)表中的數(shù)據(jù)進(jìn)行操作的語(yǔ)句。SQLJ 是在 Java 中嵌入這些 SQL 語(yǔ)句的一種約定,它是以某種允許編程工具對(duì) Java 中 SQL 進(jìn)行編譯時(shí)分析的方式實(shí)現(xiàn)嵌入的,在編譯時(shí)會(huì)對(duì) SQL 語(yǔ)句進(jìn)行語(yǔ)法檢查以保證語(yǔ)法的正確性,進(jìn)行類(lèi)型檢查以確定 Java 和 SQL 之間交換的數(shù)據(jù)具有兼容的類(lèi)型和適當(dāng)?shù)念?lèi)型轉(zhuǎn)換,以及進(jìn)行模式檢查以確保 SQL 結(jié)構(gòu)在它們執(zhí)行時(shí)所在的數(shù)據(jù)庫(kù)模式中是格式良好的、合法的。嵌入式 SQL 語(yǔ)句被稱(chēng)為是 "靜態(tài)的(static)",因?yàn)檫@些語(yǔ)句在 Java 程序中一目了然,因而嵌入式 SQL 語(yǔ)句隨著包含它們的 Java 程序的編譯而編譯(通常的術(shù)語(yǔ)是"預(yù)編譯")。我們提議將 SQLJ 作為用于緊密集成 Java/SQL 程序的一種方便有效的標(biāo)準(zhǔn)。
SQLJ 簡(jiǎn)史
正如 Connie Tsui 在她的文章(后面有引用)中解釋的那樣,一個(gè)非正式的、開(kāi)放的數(shù)據(jù)庫(kù)供應(yīng)商組織在 1997 年 4 月開(kāi)始定期的會(huì)面,以便交換關(guān)于如何在 Java 編程語(yǔ)言中使用靜態(tài) SQL 語(yǔ)句和結(jié)構(gòu)的思想。主要參與者包括 IBM®、Oracle、Compaq、Informix®、Sybase、Cloudscape™ 和 Sun Microsystems。該組織將他們?yōu)橹Φ囊?guī)范命名為 JSQL。在發(fā)現(xiàn) JSQL 已經(jīng)是商標(biāo)術(shù)語(yǔ)后,JSQL 被更名為 SQLJ。在 1997 年 12 月,Oracle 向其他成員提供了 Java 中嵌入式 SQL 的一個(gè)參考實(shí)現(xiàn)。該參考實(shí)現(xiàn)可以在任何支持 JDK 1.1 的平臺(tái)上運(yùn)行,并且是與供應(yīng)商無(wú)關(guān)的。在 1998 年 12 月,用于在 Java 中嵌入 SQL 的規(guī)范被完全開(kāi)發(fā)出來(lái),并且被接受為 ANSI 標(biāo)準(zhǔn) Database Language —— SQL, Part 10 Object Language Bindings (SQL/OLB) ANSI x3.135.10-1998。該規(guī)范已經(jīng)被當(dāng)作 SQLJ 規(guī)范的 Part 0 供大家引用。如今它被稱(chēng)作 SQL/OLB (Object Language Bindings)。
SQLJ 與 JDBC 的比較

SQLJ —— Java 數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)門(mén)咒語(yǔ)
SQLJ 標(biāo)準(zhǔn)現(xiàn)在為 Java 應(yīng)用程序提供了基于 SQL 的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)。SQLJ —— Java 數(shù)據(jù)庫(kù)應(yīng)用程序的開(kāi)門(mén)咒語(yǔ)
下面是 SQLJ 相對(duì)于直接在 JDBC 中編寫(xiě)代碼的優(yōu)勢(shì):
SQLJ 程序需要的代碼行數(shù)比 JDBC 程序更少。SQL 程序更簡(jiǎn)短,因而更易于調(diào)試。SQLJ 可以通過(guò)在編譯時(shí)使用數(shù)據(jù)庫(kù)連接,對(duì)代碼執(zhí)行語(yǔ)法和語(yǔ)義上的檢查。SQLJ 提供了對(duì)查詢(xún)結(jié)果及其他返回參數(shù)的強(qiáng)類(lèi)型檢查,而 JDBC 值則是直接從 SQL 返回,在編譯時(shí)未進(jìn)行任何檢查。
SQLJ 為處理 SQL 語(yǔ)句提供了一種簡(jiǎn)化的方式。現(xiàn)在無(wú)需編寫(xiě)不同的方法調(diào)用來(lái)綁定每個(gè)輸入?yún)?shù)和獲取每個(gè)選擇列表項(xiàng),而只需編寫(xiě)一條使用 Java 宿主變量的 SQL 語(yǔ)句。SQLJ 會(huì)替您完成綁定。
然而,JDBC 提供了對(duì) SQL 語(yǔ)句的執(zhí)行的細(xì)粒度控制,并提供了真正的動(dòng)態(tài) SQL 能力。如果應(yīng)用程序需要?jiǎng)討B(tài)能力(在運(yùn)行時(shí)發(fā)現(xiàn)數(shù)據(jù)庫(kù)或?qū)嵗獢?shù)據(jù)),那么應(yīng)該使用 JDBC。




回頁(yè)首
為 SQLJ 建立 WebSphere Studio Application Developer 項(xiàng)目
如果您計(jì)劃將 SQLJ 代碼包括到所有 WebSphere Studio Application Developer (Application Developer) 項(xiàng)目中,那么需要使您的項(xiàng)目支持 SQLJ。為此,可以右擊項(xiàng)目并選擇 Add SQLJ Support。這將彈出 SQLJ 向?qū)В缦滤尽?
圖 1. 使 Application Developer 項(xiàng)目支持 SQLJ





回頁(yè)首
SQLJ 和 Java 應(yīng)用程序
從 Application Developer 主菜單中,選擇 File -> New -> Other ,然后選擇 Java 和 Java Project。單擊 Next。
圖 2. 創(chuàng)建 Java 項(xiàng)目

輸入項(xiàng)目名,單擊 Next。
圖 3. 輸入 Java 項(xiàng)目名

選擇 Finish 創(chuàng)建該項(xiàng)目。
圖 4. 輸入 Java 項(xiàng)目設(shè)置

為了讓 Java 應(yīng)用程序能夠成功運(yùn)行,還需添加 DB2 JDBC 驅(qū)動(dòng)程序 db2java.zip。右擊 Java 項(xiàng)目,選擇 Properties。
圖 5. 編輯 Java 項(xiàng)目屬性

接下來(lái),選擇 Java Build path,然后選擇 Libraries 標(biāo)簽頁(yè)。然后選擇 Add External JARs。
圖 6. 添加外部 JAR —— db2java.zip

完成這些設(shè)置后,庫(kù)路徑應(yīng)該如下所示:
圖 7. 添加外部 JAR —— db2java.zip

接下來(lái)的步驟是創(chuàng)建有關(guān) Java 類(lèi),用于容納主方法。為此,需要右擊 Java 項(xiàng)目,然后選擇 New -> Class。填入包名和類(lèi)名。另外,確保勾選了關(guān)于創(chuàng)建主方法的復(fù)選框。單擊 Finish。
圖 8. 創(chuàng)建 Java 主類(lèi)

最后,需要?jiǎng)?chuàng)建 SQLJ 文件。從 Application Developer 主菜單中,選擇 File -> New -> Other,然后選擇 Data -> SQLJ 和 SQLJ File。最后單擊 Next。Application Developer 將保證 SQLJ 文件被轉(zhuǎn)換成一個(gè) Java 文件。
圖 9. 選擇 SQLJ 文件向?qū)?/p>

填入包名和文件名。然后單擊 Finish。
圖 10. 創(chuàng)建 SQLJ 文件

至此,還需要將代碼添加到 Java 主方法中,另外必須創(chuàng)建一個(gè) SQLJ 方法。首先讓我們明確要完成什么。我們將創(chuàng)建一個(gè) SQLJ 方法,該方法從 DB2 SAMPLE 數(shù)據(jù)庫(kù)中根據(jù)給定的雇員號(hào)讀取一個(gè)雇員記錄。這個(gè) SQLJ 方法以雇員號(hào)(一個(gè) Java String)作為輸入,并將其作為參數(shù)傳遞給一條 SQLJ Select 語(yǔ)句。Java 主方法將調(diào)用這個(gè) SQLJ 方法。
清單 1. 包含主方法的 Java 類(lèi)
<![CDATA[
/*
* Created on Nov 27, 2004
*
*/
package com.ibm.sqlj.main;
import com.ibm.sqlj.Select;
/**
* @author Owen Cline
*
*/
public class SQLJJave {
public static void main(String[] args) {
Select select = new Select();
select.selectEmployee("000110");
}
}
]]>
清單 2. 包含 SQLJ 方法的 SQLJ 類(lèi)
<![CDATA[
/*
* Created on Nov 27, 2004
*
*/
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
/**
* @author Owen Cline
*
*/
public class Select {
// First, load the JDBC driver
static
{ try
{ Class.forName ("COM.ibm.db2.jdbc.app.DB2Driver").newInstance ();
} catch (Exception e)
{ System.out.println ("\n Error loading DB2 Driver...\n");
System.out.println (e);
System.exit(1);
}
}
public void selectEmployee(String empNo) {
Connection con = null; DefaultContext ctx = null; try {
String firstName = null;
String lastName = null;
// use the DB2 SAMPLE database
String url = "jdbc:db2:SAMPLE";
// Get the connection
con = DriverManager.getConnection(url); // Set the default context
ctx = new DefaultContext(con); DefaultContext.setDefaultContext(ctx);
// Lookup the employee given the employee number
#sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("Employee " + firstName + " " + lastName);
ctx.close();
con.close();
}
catch( Exception e )
{
System.out.println (e);
}
}
}
]]>
現(xiàn)在便可以運(yùn)行這個(gè) Java 應(yīng)用程序了。選中您的 Java 項(xiàng)目,然后從 Application Developer 主菜單中選擇 Run -> Run As -> Java Application。您應(yīng)該可以看到在控制臺(tái) "Employee VINCENZO LUCCHESSI" 中打印出如下消息。




回頁(yè)首
SQLJ 和 J2EE 應(yīng)用程序
您可能想到,還可以在 J2EE 應(yīng)用程序、servlet、會(huì)話(huà) bean、BMP 實(shí)體 bean 和 MDB bean 中使用 SQLJ。現(xiàn)在我們要做的就是將我們創(chuàng)建的在 Java 應(yīng)用程序中運(yùn)行的上述代碼移植,使之在一個(gè)會(huì)話(huà) bean 中運(yùn)行。
首先,需要?jiǎng)?chuàng)建一個(gè) EJB 項(xiàng)目。從 Application Developer 主菜單中,選擇 File- > New -> Project。 然后選擇 EJB and EJB Project。單擊 Next。
圖 11. 創(chuàng)建 EJB Project

確保選擇了 Create 2.0 EJB Project ,然后單擊 Next。
圖 12. 選擇一個(gè) EJB 版本

現(xiàn)在,輸入 SQLJSession 作為 EJB 項(xiàng)目名。EAR 項(xiàng)目應(yīng)該是 DefaultEAR。單擊 Next。
圖 13. 輸入 EJB 項(xiàng)目名

在 Module Dependencies 對(duì)話(huà)框中,選擇 Finish 創(chuàng)建 EJB 項(xiàng)目和 EAR 項(xiàng)目。
圖 14. 輸入 EJB 模塊依賴(lài)

在這里,我們還想創(chuàng)建一個(gè)會(huì)話(huà) Bean。 選擇 Application Developer 主菜單中的 File -> New -> Enterprise Bean。然后單擊 Next。
圖 15. 創(chuàng)建一個(gè)會(huì)話(huà) Bean —— 步驟 1

確保選擇了 Session bean 單選按鈕,并輸入了一個(gè) Bean 名稱(chēng)。然后單擊 Next。
圖 16. 創(chuàng)建一個(gè)會(huì)話(huà) Bean —— 步驟 2

確保選中 Local client view 復(fù)選框,以得到本地接口(如果 EJB 容器部署在本地,那么這樣做會(huì)更快一些),然后單擊 Finish 創(chuàng)建會(huì)話(huà) Bean。
圖 17. 創(chuàng)建一個(gè)會(huì)話(huà) Bean - 步驟 3

現(xiàn)在我們來(lái)創(chuàng)建一個(gè) SQLJ 文件,該文件將包含我們的業(yè)務(wù)邏輯。右擊 EJB 項(xiàng)目 SQLJSession 并選擇 New -> Other,然后選擇 Data -> SQLJ 和 SQLJ File。最后單擊 Next。
圖 18. 創(chuàng)建 SQLJ 文件 —— 步驟 1

輸入包名和文件名,然后選擇 Finish 創(chuàng)建 SQLJ 文件。還應(yīng)注意的是,由于是在一個(gè)項(xiàng)目中創(chuàng)建這個(gè) SQLJ 文件,而這個(gè)項(xiàng)目還沒(méi)有添加 SQLJ 支持,因此這一次需添加該支持。
接著,使用上述步驟創(chuàng)建第二個(gè) SQLJ 文件,文件名為 SessionBeanSelectUsingDefaultDatasource,以便以后演示如何使用 defaultDataSource。現(xiàn)在,我們可以在創(chuàng)建的 SQLJ 文件中添加自己的業(yè)務(wù)邏輯,如下所示:
圖 19. 創(chuàng)建 SQLJ File —— 步驟 2

清單 3. SessionBeanSelect.sqlj
<![CDATA[
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
import javax.sql.DataSource;
/**
* @author Owen Cline
*
*/
public class SessionBeanSelect {
// Setup datasource to use. Notice that I am not using a global JNDI name // but instead using a Resource Reference which points to the global JNDI name. // This is a best practice.
#sql public static context Ctx with (dataSource="java:comp/env/sqljDS");
public void selectEmployee(String empNo) {
String firstName = null;
String lastName = null;
try {
// Create context
Ctx conCtx = new Ctx();
// Lookup the employee given the employee number
#sql [conCtx] { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("SessionBeanSelect-Employee " + firstName + " " + lastName);
conCtx.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
]]>
清單 4. SessionBeanSelectUsingDefaultDatasource.sqlj
<![CDATA[
package com.ibm.sqlj;
import java.sql.*;
import sqlj.runtime.ref.*;
import javax.sql.DataSource;
/**
* @author Owen Cline
*
*/
public class SessionBeanSelectUsingDefaultDatasource {
public void selectEmployee(String empNo) {
String firstName = null;
String lastName = null;
try {
// Lookup the employee given the employee number
#sql { SELECT FIRSTNME, LASTNAME INTO :firstName, :lastName
FROM EMPLOYEE
WHERE EMPNO = :empNo } ;
System.out.println ("SessionBeanSelectUsingDefaultDatasource-Employee " + firstName + " " + lastName);
} catch (Exception e) {
System.out.println(e);
}
}
}
]]>
現(xiàn)在,我們要添加 bean 模塊,以便調(diào)用 SQLJ 文件中的業(yè)務(wù)邏輯。編輯 SQLJSessionBeanBean.java 文件,添加兩個(gè)方法:selectEmployee 和 selectEmployeeUsingDefaultDatasource,如以下清單所示。然后,別忘了使這兩個(gè)方法成為本地接口。最后,在進(jìn)入下一步之前,確保生成了部署和 RMIC 代碼。
清單 4. SQLJSessionBeanBean.java
<![CDATA[
package com.ibm.sqlj.ejb.session;
import com.ibm.sqlj.SessionBeanSelect;
import com.ibm.sqlj.SessionBeanSelectUsingDefaultDatasource;
/**
* Bean implementation class for Enterprise Bean: SQLJSessionBean
*/
public class SQLJSessionBeanBean implements javax.ejb.SessionBean {
private javax.ejb.SessionContext mySessionCtx;
/**
* getSessionContext
*/
public javax.ejb.SessionContext getSessionContext() {
return mySessionCtx;
}
/**
* setSessionContext
*/
public void setSessionContext(javax.ejb.SessionContext ctx) {
mySessionCtx = ctx;
}
/**
* ejbCreate
*/
public void ejbCreate() throws javax.ejb.CreateException {
}
/**
* ejbActivate
*/
public void ejbActivate() {
}
/**
* ejbPassivate
*/
public void ejbPassivate() {
}
/**
* ejbRemove
*/
public void ejbRemove() {
}
/**
* selectEmployee
*/
public void selectEmployee(String empNo) {
SessionBeanSelect sbs = new SessionBeanSelect();
sbs.selectEmployee(empNo);
}
/**
* selectEmployee
*/
public void selectEmployeeUsingDefaultDatasource(String empNo) {
SessionBeanSelectUsingDefaultDatasource sbs = new SessionBeanSelectUsingDefaultDatasource();
sbs.selectEmployee(empNo);
}
}
]]>
為最終測(cè)試我們的會(huì)話(huà) Bean,必須創(chuàng)建一個(gè) Server Configuration。切換到 Server Perspective,并在 Server Configuration 視圖中單擊右鍵。選擇 New -> Server and Server Configuration。輸入服務(wù)器名 TestServer ,然后單擊 Finish 創(chuàng)建該服務(wù)器。
圖 20. 創(chuàng)建一個(gè) Server Configuration

創(chuàng)建好服務(wù)器后,在服務(wù)器上單擊右鍵(同樣也是在 "Server Configuration" 視圖中),然后選擇 Add and Remove Projects。 在 "Add and Remove Projects" 對(duì)話(huà)框中(這里沒(méi)有顯示出來(lái)),添加 DefaultEAR 項(xiàng)目并單擊 Finish。
最后要做的是創(chuàng)建我們的會(huì)話(huà) Bean 將要使用的 DB2 數(shù)據(jù)源。在 Server Configuration 視圖中右擊 Test Server,這將彈出服務(wù)器配置編輯器。選擇 Security 標(biāo)簽頁(yè),然后選擇下面顯示的 JAAS Authentication Entries 對(duì)話(huà)框旁邊的 Add 按鈕。為該條目輸入一個(gè)名稱(chēng),然后輸入一個(gè)用于訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的合法用戶(hù)名和密碼。最后單擊 OK。
圖 21. 添加 JAAS 認(rèn)證條目

現(xiàn)在,選擇 Data source 標(biāo)簽頁(yè)。在 JDBC Provider 列表中選擇 Default DB2 JDBC Provider 條目。單擊在上面所選 JDBC 提供者中定義的數(shù)據(jù)源旁邊的 Add 按鈕。確保選中了 DB2 JDBC Provider 和 Version 5.0 data source 單選按鈕。然后單擊 Next。
圖 22. 選擇要?jiǎng)?chuàng)建的數(shù)據(jù)源的類(lèi)型

輸入 sqljDS 作為數(shù)據(jù)源名稱(chēng),輸入 jdbc/sqljDS 作為 JNDI 名稱(chēng)。對(duì)于 "Component-managed authentication alias" 和 "Container-managed authentication alias",都選擇前面創(chuàng)建的 JAAS Authentication Entry。然后單擊 Finish。
圖 23. 輸入 sqljDS 的數(shù)據(jù)源參數(shù)

重復(fù)這些步驟,創(chuàng)建另一個(gè)名為 defaultDataSource 的數(shù)據(jù)源,數(shù)據(jù)源的 JNDI 名稱(chēng)為 jdbc/defaultDataSource。最后,保存該服務(wù)器配置。
圖 24. 輸入 defaultDataSource 的數(shù)據(jù)源參數(shù)

現(xiàn)在,我們需要?jiǎng)?chuàng)建一個(gè) Resource Reference,以便會(huì)話(huà) bean 可以查找 sqljDS 數(shù)據(jù)源。因此,切換到 Application Developer 中的 J2EE Perspective。在 J2EE Hierarchy 視圖中,右擊 SQLJSession EJB 項(xiàng)目,以調(diào)用 EJB Deployment Descriptor 編輯器。選擇 References 標(biāo)簽頁(yè)。選擇 SQLJSessionBean 并選擇 Add 按鈕。選擇 Resource Reference 單選按鈕,然后單擊 Next。
圖 25. 創(chuàng)建資源引用

輸入 sqljDS 作為名稱(chēng)。選擇 javax.sql.DataSource 作為類(lèi)型。為 Authentication 選擇 Container 。 保留 Sharing Scope 為 Shareable。然后單擊 Finish。
圖 26. 輸入資源引用參數(shù)

選中剛創(chuàng)建的資源引用,然后輸入 jdbc/sqljDS 作為 JNDI 名。保存該 EJB 部署描述文件。
圖 27. 輸入資源引用的 JNDI 名

至此,您應(yīng)該可以測(cè)試會(huì)話(huà) Bean 模塊了。首先,在 Server Perspective 中,通過(guò)在 Servers 視圖中右鍵單擊 TestServer 并選擇 Start 來(lái)啟動(dòng)該服務(wù)器。接著,通過(guò)在 Servers 視圖中單擊右鍵并選擇 Run universal test client 調(diào)用 Universal Test Client。從這個(gè) universal test client 中,選擇 JNDI Explorer 并展開(kāi) "jdbc" 菜單,以顯示出兩個(gè)數(shù)據(jù)源:sqljDS 和 defaultDataSource。接下來(lái),完全展開(kāi) Local EJB beans 菜單,直到能夠選擇 SQLJSessionBeanLocalHome。在 EJB reference 菜單中完全展開(kāi)菜單項(xiàng),直到能夠選擇 SQLJSessionBeanLocal.create() 模塊,然后選擇 Invoke followed by the Work with Object 按鈕。
圖 28. 調(diào)用 SQLJSessionBeanLocal.create() 方法

現(xiàn)在,您將看到有兩個(gè)方法可供調(diào)用:selectEmployee 和 selectEmployeeUsingDefaultDatasource。選擇 selectEmployee 方法。輸入 000110 作為 empNo 值,并選擇 Invoke 按鈕。檢查控制臺(tái)窗口,以確信顯示了 "[11/28/04 16:56:05:176 PST] 6d2f338b SystemOut O SessionBeanSelect-Employee VINCENZO LUCCHESSI"。最后,您自己嘗試一下 selectEmployeeUsingDefaultDatasource 方法。
圖 29. 調(diào)用 selectEmployee() 方法





回頁(yè)首
結(jié)束語(yǔ)
總之,對(duì)于不需要?jiǎng)討B(tài) SQL 的 Java 和 J2EE 應(yīng)用程序,SQLJ 是提供持久性框架的一種非常有用的方式。雖然本文沒(méi)有提到,但使用 SQLJ 開(kāi)發(fā)存儲(chǔ)過(guò)程也是可行的。




回頁(yè)首
下載
描述 名字 大小 下載方法
code samples
SQLJArticle_sourcecode.zip
3443 KB
FTP

|

HTTP


關(guān)于下載方法的信息


Get Adobe® Reader®
參考資料
關(guān)于作者



Owen Cline 是位于加州圣地亞哥市的 IBM Software Services for Websphere 小組的一名成員。他有 20 多年軟件開(kāi)發(fā)領(lǐng)域的開(kāi)發(fā)經(jīng)驗(yàn)。他擁有 4 項(xiàng)軟件專(zhuān)利,編寫(xiě)了大量 IBM 紅皮書(shū),并曾多次出席各種技術(shù)會(huì)議。在過(guò)去的 5 年當(dāng)中,Owen 專(zhuān)門(mén)從事 J2EE 架構(gòu)、應(yīng)用開(kāi)發(fā)和部署,重點(diǎn)研究了 WebSphere 平臺(tái)。此外,這幾年來(lái),他還參與了許多高知名度的 Web 站點(diǎn)的開(kāi)發(fā)。
源文檔 <http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0412cline/index.html>