程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Rational >> 使用Rational Application Developer V7.5版本來進行資源注入

使用Rational Application Developer V7.5版本來進行資源注入

編輯:Rational

克服 Java Persistence API 結構對存儲過程中 OUT 參數不能支持的難題

簡介:Java™ 平台企業版(Java Platform, Enterprise Edition,JEE) 簡化了完整企業程序 的部署。通過注釋使用資源注入,可以減少標准代碼,這有助於編寫可維護的代碼。您的公司可能擁有大 量已存在的復雜存儲過程。您可以繼續開發使用存儲過程的程序,並利用 Java 平台。IBM® Rational® Application Developer 提供了一個豐厚的開發環境,並緊密地與 IBM WebSphere® Application Server 集成到一起。有了 Rational Application Developer,您就可以 開始向敏捷開發進行轉變了。

概述

本文提供了對 Java™ Platform,Enterprise Edition 的簡略介紹,並展示了平台是怎樣幫助您降低開發難度的。為了讓一個典型的開發任務變得更加 簡單,您可以使用 IBM® Rational® Application Developer v7.5 for WebSphere®。

一個具體的實例將會演示,怎樣快速地創建一個完整的 Java 平台,Enterprise Edition 程序,並將 其部署到 WebSphere v7.0。

Java Platform,Enterprise Edition

Java Platform, Enterprise Edition,或者 JEE,是以 Java 編程語言實施和部署企業程序的一種標准工具。最新的工具 的是 Java 平台,Enterprise Edition 版本 6。有了 JEE 及其特性和功能,開發員就可以關注於構件的 業務邏輯性方面,不用再為基礎和集成任務而發愁了。有了 JEE,注釋功能就減少了出錯代碼,並使得部 署描述器的選擇更加自由。

JEE 5 中引入的持續性結構是 Java Persistence API(JPA)結構。JPA 有一個非常重要的限制:JPA 並不能完全支持對帶有 OUT 參數的存儲過程的訪問。

大多數的機構將它們的數據存儲在關系數據 庫中,出於很多原因考慮根據存儲過程來設計它們的信息系統。一般來說,工人們長年累月地調試存儲的 程序;丟棄原有方案並開發一個更好的方案,是禁止的。Java 編程語言提供了 JDBC API,它定義了怎樣 訪問一個關系數據庫。在一個企業程序中,數據源對象是通過 JNDI 查找操作來獲得的。當數據源對象可 以得到時,程序可以繼續做 JDBC 訪問。就算已經知道了做 JNDI 查找的序列,處理 JNDI 例外的操作會 添加一系列標准代碼。

資源注入,也叫做關系注入,是控制轉化的一種特定形式。通過使用注釋,您可以引用對源、EJB 以 及需要的地方的引用。該注釋減少了標准代碼,並解決了前面所提到過的不方便之處。

當以下容器-管理構件使用注入時,JEE 5 可以透明地處理注入:

Servlet(servlets、servlet 篩選器、事件監聽器)

JSP(標記處理器、標記事件監聽器)

JSF(范圍管理的 beans)

EJB(beans,攔截)

Java API for XML Web Services(JAX-WS;末端處理器 )

Java 平台(主(靜態),登錄回饋處理器)

注入只限制於 Java 平台中定義的首個類構造,包括以下的構造 :

SessionContext 對象

DataSource 對象

EntityManager 界面

TimerService 界面

其他的企業 beans

Web 服務

信息查詢與話題

源適配器的鏈接庫

環境條目限制於 String、Character、Byte、Short、Integer、Long、Boolean、Double 與 Float。

JEE 5 中的注入部分並不適用於任何普通的舊 Java 對象(POJO)。

接下來的代碼行顯示了減少了標准代碼的資源注入,它簡化了代碼開發。

清單 1. 使用 JNDI 來查看一個容器管理的數據源

public testGetDSConnection () {

try {
     // Obtain the initial Java Naming and Directory Interface
     // (JNDI) context.
     InitialContext initCtx = new InitialContext ();
     // Perform JNDI lookup to obtain the resource.
     // Get the DataSource.
     DataSource ds = (DataSource)
       initCtx.lookup("java:comp/env/jdbc/Sample");
     // Get a connection and execute the query.
     Connection conn = ds.getConnection();
   ...

   } catch (NamingException ex) {
     // Handle failure.
   }

清單 2. 得到一個資源注入的數據源對象

private @Resource DataSource ds;

public testGetDSConnection () {
  // Get a connection and execute  the query.
  Connection con = ds.getConnection();
  ...
}

Rational Application Developer for WebSphere

Rational Application Developer for WebSphere 是一種用於設計、開發以及部署程序的 Java 集成式開發環境(IDE)。7.5 版本完全支持 JEE 5 規格。查看該篇 developersWorks 文章中最新的特性的概述:IBM Rational Application Developer V7.5 中的新特性

前提條件

為了按照本文中的范例進行操作,您 必須對 Rational Application Developer for WebSphere 有基本的熟悉。另外,您還必須安裝以下的構 件 :

Rational Application Developer V7.5 與來自 WebSphere 家族的以下程序服務器

IBM WebSphere Application Server v7.0

IBM WebSphere Application Server v6.1 與 EJB 3.0 特性包

IBM DB2® 及其范例數據庫和存儲的程序

下面的 Downloads 部分包含了 一個項目交換文件。在部署程序之前,您要編輯特定數據庫對話 bean 中存儲的程序變革。

通過 JDBC 來訪問一個儲存的程序

您可以在 DB2 安裝位置中 README 文件內,找到安裝一個存儲過程 、匯編與運行范例 Java 測試程序的指導:sqllib\samples\java.

圖 1. README 文件位置

JPA 限制

JPA 不能訪問擁有 OUT 參數的存儲過程。這種限制非常重要,因為大多數有用的存儲過程都有一個 OUT 參數,該參數向訪問程序提供了一些數據。

sqllib\samples\java\jdbc 目錄中的 SpClient.java 范例程序,演示了怎樣訪問各種存儲的程序, 包括一些有 OUT 參數的程序。

按照 README 文件中的指導,您可以生成如圖 2 所示的范例 SpClient 程序。

圖 2. SpClient 程序的輸出

訪問一個帶有資源注入的存儲過程

您可以使用 Rational Application Developer for WebSphere 來創建一個 JEE 程序。您使用注釋來 向數據源添加引用,有了它您就不用創建一個 EJB 部署描述器了。因為您並不需要創建一個 EJB 部署描 述器,所以您需要生成一個 WebSphere Bindings 部署描述器來完成數據源捆綁。您必須擁有該捆綁部署 描述器來在 IDE 中進行測試。您還需要創建一個簡單的 Web 模塊,來訪問對話 bean,並最終在運行 WebSphere Application Server v7 或者 v6.1 的服務器上部署和測試程序。

創建一個 JEE 程序

圖 3 顯示了怎樣啟動 EAR Application Project 向導。

點擊 File > New > Enterprise Application Project。

輸入一個項目名。

圖 3. EAR Application Project 向導

點擊 Next。

點擊 New Modules

圖 4. 新的 JEE 模塊

只選擇 EJB 模塊與 Web 模塊。

點擊 Finish 兩次。

添加一個對話 bean

選擇 EJB 模塊。

選擇 File > New > Session Bean。

圖 5. Create EJB 3.0 Session Bean 向導

給包和類命名。

點擊 Next 兩次。

清除 Add bean to Class Diagram 復選框的選擇。

點擊 Finish。

創建一個資源注入

Rational Application Developer for WebSphere 提供了一個集成化的編輯器,它可以得到代碼幫助 、確認、快速修復與重構的支持。

打開您在前面所創建的對話 bean 源代碼,並從代碼行 3 中添加以下的代碼。

清單 3. 注釋中的資源注入

@Stateless
public class MySession implements MySessionLocal {
@Resource
DataSource ds;

點擊 Ctrl+Alt+O 來自動組織導入聲明。

創建一個稍後將會被客戶端程序所訪問的公共方法。

添加如代碼行 4 所示的代碼。

清單 4. EJB 方法

public void CallStoredProc(){
     try {
     System.out.print("\nTesting Database Resource Injection");
         Connection con = ds.getConnection();
         double outMedian = 0;
     // call INOUT_PARAM stored procedure using the median returned 
     // by the call to OUT_PARAM
   System.out.println("\nCall stored procedure named INOUT_PARAM");
   System.out.println("using the median returned by the call to " +
                  "OUT_PARAM");
        callInoutParameter(con, outMedian);

         } catch (SQLException e) {
             e.printStackTrace();
         }
  }
}

從代碼行 5 添加 callInoutParameter(con, outMedian)方法,可以從 SpClient.java 程序中直接 得到它。

清單 5. SpClient 存儲的程序訪問

private void callInoutParameter(Connection con, double median) {
         try {
             // prepare the CALL statement for INOUT_PARAM
             String procName = "INOUT_PARAM";
             String sql = "CALL James." + procName + "(?)";
             CallableStatement callStmt = con.prepareCall(sql);

             // set input parameter to median value passed back by  OUT_PARAM
             callStmt.setDouble(1, median);

             // register the output parameters
             callStmt.registerOutParameter(1, Types.DOUBLE);

             if (median == 99999.99) {
             System.out.println("-- The following error is expected! - -");
             }
             callStmt.execute();

             // retrieve output parameters
             double inoutMedian = callStmt.getDouble(1);

             System.out.println(procName + " completed successfully");
             System.out.println("Median salary returned from " +  procName
                     + " = " + inoutMedian);

             // clean up resources
             callStmt.close();

         } catch (SQLException e) {
             System.out.println(e.getMessage());
         }
     }

使用 CallStoredProc 方法:右擊 CallStoredProc,然後選擇 Java EE Tools > Promote Method 。該操作向 Business Interface 添加方法簽名,使得客戶端能夠訪問方法。

圖 6. 方法使用

選擇 CallStoredProc() 方法。

圖 7. 選擇方法來使用

點擊 Ok。

保存類源。

生成 WebSphere Bindings 部署描述器

右擊 EJB 模塊。

選擇 Java EE > Generate WebSphere Bindings Deployment Descriptor。

圖 8. 生成 WebSphere Bindings 部署描述器

有了 Deployment Descriptor 編輯器中的 Bindings 部署描述器(meta-data\ibm-ejb-jar-bnd.xml ),點擊 Add。

圖 9. 配置 WebSphere Bindings 部署描述器

選擇 Session,並點擊 Ok。

選擇您在前面所創建的對話 bean。

點擊 Next。

選擇 Resource Reference,並點擊 Next。

向導會自動檢查源,並返回可以綁定的適當源。

選擇源(默認的名是包名 .Class 名或者數據源名)。

點擊 Next。

輸入綁定名(圖 10)。這是服務器上數據源定義所使用的相同 JNDI 名(圖 11)。使用 WebSphere Administrative Console 來配置數據源。數據源會連接至安裝范例數據庫與存儲過程的 DB2 服務器上。

圖 10. 綁定名

圖 11. WebSphere Administrative Console 上數據源 JNDI 名

點擊 Finish。

保存 WebSphere Binding 部署描述器。

圖 12. EJB 綁定描述器

測試 Web 客戶端

點擊 Web Module Properties > Java EE Module Dependencies,並選擇 EJB 模塊。

圖 13. Java EE 模塊依賴關系

點擊 File > New > Servlet,並在 Web Module 中創建一個 servlet,來打開 New Servlet 向導。

再次使用資源注入,來使 servlet 引用對話 bean(代碼行 6)。

清單 6. 使 servlet 引用對話 bean 的資源注入

private static final long serialVersionUID = 1L;
@EJB
MySessionLocal mySession;

在 servlet 引用對話 bean 之後,訪問如代碼行 7 所示的方法。

清單 7. 訪問方法

protected void doGet(HttpServletRequest request, HttpServletResponse  response)
         throws ServletException, IOException {
         mySession.CallStoredProc();
     }

部署並測試程序

啟動 WebSphere 服務器。

運行服務器上的工件:在 Enterprise Explorer 視圖中點擊 Run As > Run on Server。

選擇 servlet。

圖 14. 運行服務器上的工件

選擇 Started WebSphere 服務器。

點擊 Finish。

該操作會在服務器上部署程序,並在浏覽器中運行 servlet。然後 servlet 會訪問 EJB,它會訪問存 儲的程序。注意操控台輸出(代碼行 7)顯示了與訪問 圖 2 所示 JDBC 程序存儲過程相同的輸出。

清單 8. 操控台輸出

[5/18/10 15:11:55:562 EDT] 00000013 ApplicationMg A  WSVR0221I: Application  started:
ResourceInjectedEAR
[5/18/10 15:11:55:562 EDT] 00000013 CompositionUn A  WSVR0191I: Composition  unit
WebSphere:cuname=ResourceInjectedEAR in BLA WebSphere:blaname=ResourceInjectedEAR  started.
[5/18/10 15:11:55:593 EDT] 00000013 AppBinaryProc I  ADMA7021I: Distribution  of
application ResourceInjectedEAR completed successfully.
[5/18/10 15:11:55:609 EDT] 00000013 FileRepositor A
ADMR0009I: Document  cells/jamescNode05Cell/applications/ResourceInjectedEAR.ear/deltas/
ResourceInjectedEAR/delta-1274209912171 is created.
[5/18/10 15:11:55:656 EDT] 00000013 FileRepositor A
ADMR0010I: Document cells/jamescNode05Cell/applications/
ResourceInjectedEAR.ear/deployments/
ResourceInjectedEAR/deployment.xml is modified.
[5/18/10 15:11:55:718 EDT] 00000013 FileRepositor A
ADMR0010I: Document cells/jamescNode05Cell/applications/
ResourceInjectedEAR.ear/deployments/
ResourceInjectedEAR/META-INF/ibm-application-runtime.props is modified.
[5/18/10 15:12:12:265 EDT] 00000020 servlet    I
com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0242I:
[ResourceInjectedEAR] [/ResourceInjectedEARWeb] [MyServlet]: Initialization  successful.
[5/18/10 15:12:12:593 EDT] 00000020 SystemOut   O
Testing Database Resource Injection
[5/18/10 15:12:12:593 EDT] 00000020 PrivExAction W
J2CA0144W: No mappingConfigAlias found for ConnectionFactory or DataSource  jdbc/Sample.

[5/18/10 15:12:19:015 EDT] 00000020 WSRdbDataSour W  DSRA9542W: The JDBC  Driver
  that is configured with the data source for the Application Server does not  support
  the extending data source properties feature. The Application Server will not  honor
   the extended data source properties.

[5/18/10 15:12:19:046 EDT] 00000020 InternalGener I
DSRA8203I: Database product name : DB2/NT

[5/18/10 15:12:19:046 EDT] 00000020 InternalGener I
DSRA8204I: Database product version : SQL09010

[5/18/10 15:12:19:062 EDT] 00000020 InternalGener I
DSRA8205I: JDBC driver name : IBM DB2 JDBC Universal Driver Architecture

[5/18/10 15:12:19:078 EDT] 00000020 InternalGener I
DSRA8206I: JDBC driver version : 3.1.57

[5/18/10 15:12:19:078 EDT] 00000020 InternalDB2Un I
DSRA8212I: DataStoreHelper name is:
com.ibm.websphere.rsadapter.DB2UniversalDataStoreHelper@78387838.

[5/18/10 15:12:19:093 EDT] 00000020 WSRdbDataSour I
DSRA8208I: JDBC driver type : 4

Call stored procedure named INOUT_PARAM
[5/18/10 15:12:19:359 EDT] 00000020 SystemOut
O using the median returned by the call to OUT_PARAM
[5/18/10 15:12:22:734 EDT] 00000020 SystemOut
O INOUT_PARAM completed successfully
[5/18/10 15:12:22:734 EDT] 00000020

SystemOut O Median salary returned from INOUT _PARAM = 76858.2

本文配套源碼

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved