Sun Java System Application Server 9.1 管理指南

第 6 章 JNDI 資源

Java Naming and Directory Interface (JNDI) 是一種應用程式程式設計介面 (API),可用來存取各種不同的命名和目錄服務。Java EE 元件透過呼叫 JNDI 查詢方法來尋找物件。

JNDI 是 Java 命名和目錄介面 API 的首字母縮略。透過對此 API 進行呼叫,應用程式可以尋找資源和其他程式物件。資源是提供與系統 (如資料庫伺服器和郵件傳送系統) 的連線的程式物件。(JDBC 資源有時被稱為資料源。)每個資源物件都是由專屬的易懂名稱識別,稱為 JNDI 名稱。Application Server 包含的命名和目錄服務將資源物件及其 JNDI 名稱連結在一起。若要建立新資源,需要將新的名稱-物件連結輸入到 JNDI 中。

本小節包含以下主題:

J2EE 命名服務

JNDI 名稱是易懂的的物件名稱。這些名稱透過 J2EE 伺服器提供的命名和目錄服務連結到其物件。由於 J2EE 元件透過 JNDI API 存取此服務,因此物件通常使用其 JNDI 名稱。例如,PointBase 資料庫的 JNDI 名稱為 jdbc/Pointbase。當 Application Server 啟動時,會從配置檔案中讀取資訊,並自動將 JNDI 資料庫名稱增加到名稱空間。

需要 Java EE 應用程式用戶端、企業 Bean 與 Web 元件來存取 JNDI 命名環境。

應用程式元件的命名環境是一種機制,使用它可以在部署或組譯期間自訂應用程式元件的企業邏輯。使用應用程式元件的環境即可對應用程式元件進行自訂,而無需存取或變更應用程式元件的源代碼。

Java EE 容器實作應用程式元件的環境,並將該環境做為 JNDI 命名環境提供給應用程式元件實例。應用程式元件的環境的使用方式如下:

每個應用程式元件定義了其本身的環境項目集。一個應用程式元件在同一容器內的所有實例共用相同的環境項目。不允許應用程式元件實例在執行階段修改環境。

命名參考與連結資訊

資源參照是部署描述元中的元素,可以為資源識別元件的編碼名稱。更具體地說,編碼名稱參考資源的連線工廠。在下一小節給出的範例中,資源參照名稱為 jdbc/SavingsAccountDB

資源的 JNDI 名稱與資源參照的名稱不同。使用此命名方法,您需要在進行部署之前先對映這兩個名稱,但此方法也用於分離元件與資源。由於具有此分離功能,因此如果元件在以後需要存取其他資源,則無需變更名稱。這一靈活性使您可以更輕鬆地從預先存在的元件編譯 J2EE 應用程式。

下表列出了 Application Server 所使用的 J2EE 資源的 JNDI 查找及相關參照。

表 6–1 JNDI 查找及相關參照

JNDI 查找名稱 

相關參照 

java:comp/env

應用程式環境項目 

java:comp/env/jdbc

JDBC DataSource 資源管理程式連線 Factory 

java:comp/env/ejb

EJB 參照 

java:comp/UserTransaction

UserTransaction 參照 

java:comp/env/mail

JavaMail 階段作業連線 Factory 

java:comp/env/url

URL 連線 Factory 

java:comp/env/jms

JMS 連線 Factory 與目標 

java:comp/ORB

應用程式元件共用的 ORB 實例 

使用自訂資源

自訂資源存取本機 JNDI 儲存庫,外部資源存取外部 JNDI 儲存庫。這兩種類型的資源都需要使用者指定的工廠類別元素、JNDI 名稱屬性等。在本小節中,我們將討論如何為 J2EE 資源配置 JNDI 連線工廠資源,以及如何存取這些資源。

在 Application Server 中,您可以建立、刪除和列示資源以及 list-jndi-entities

使用外部 JNDI 儲存庫和資源

通常,Application Server 上執行的應用程式需要存取儲存在外部 JNDI 儲存庫中的資源。例如,一般的 Java 物件可能會以 Java 模式儲存在 LDAP 伺服器中。外部 JNDI 資源元素允許使用者配置此類外部資源儲存庫。外部 JNDI 工廠必須實作 javax.naming.spi.InitialContextFactory 介面。

使用外部 JNDI 資源的範例為:

<resources>
 <!-- external-jndi-resource element specifies how to access J2EE resources
 -- stored in an external JNDI repository. The following example
 -- illustrates how to access a java object stored in LDAP.
 -- factory-class element specifies the JNDI InitialContext factory that
 -- needs to be used to access the resource factory. property element
 -- corresponds to the environment applicable to the external JNDI context
 -- and jndi-lookup-name refers to the JNDI name to lookup to fetch the
 -- designated (in this case the java) object.
 -->
  <external-jndi-resource jndi-name="test/myBean"
      jndi-lookup-name="cn=myBean"
      res-type="test.myBean"
      factory-class="com.sun.jndi.ldap.LdapCtxFactory">
    <property name="PROVIDER-URL" value="ldap://ldapserver:389/o=myObjects" />
    <property name="SECURITY_AUTHENTICATION" value="simple" />
    <property name="SECURITY_PRINCIPAL", value="cn=joeSmith, o=Engineering" />
    <property name="SECURITY_CREDENTIALS" value="changeit" />
  </external-jndi-resource>
</resources>