web server apache tomcat11-08-JNDI Resources

前言

整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本爲 v11 最新的版本。

開源項目

從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。

系列文章

web server apache tomcat11-01-官方文檔入門介紹

web server apache tomcat11-02-setup 啓動

web server apache tomcat11-03-deploy 如何部署

web server apache tomcat11-04-manager 如何管理?

web server apache tomcat11-06-Host Manager App -- Text Interface

web server apache tomcat11-07-Realm Configuration

web server apache tomcat11-08-JNDI Resources

web server apache tomcat11-09-JNDI Datasource

web server apache tomcat11-10-Class Loader

...

介紹

Tomcat爲每個在其下運行的Web應用程序提供了一個JNDI InitialContext實現實例,以與Jakarta EE應用程序服務器提供的實例兼容。Jakarta EE標準在/WEB-INF/web.xml文件中提供了一組標準元素,用於引用/定義資源。

有關JNDI的編程API和Jakarta EE服務器支持的功能的更多信息,請參見以下規範,Tomcat模擬了它提供的服務:

  • Java命名和目錄接口(從JDK 1.4開始包含)

  • Jakarta EE平臺規範(特別是,請參見命名章節)
    web.xml配置
    以下元素可用於Web應用程序部署描述符(/WEB-INF/web.xml)中,以定義資源:

  • <env-entry> - 環境條目,一個單值參數,可用於配置應用程序的操作方式。

  • <resource-ref> - 資源引用,通常是指用於資源的對象工廠,例如JDBC DataSource、Jakarta Mail Session或配置到Tomcat中的自定義對象工廠。

  • <resource-env-ref> - 資源環境引用,Servlet 2.4中新增的一種資源引用變體,用於簡化對不需要身份驗證信息的資源的配置。
    只要Tomcat能夠識別一個適當的資源工廠來創建資源,並且不需要進一步的配置信息,Tomcat就會使用/WEB-INF/web.xml中的信息來創建資源。

Tomcat提供了一些針對JNDI資源的特定於Tomcat的選項,這些選項無法在web.xml中指定。這些選項包括closeMethod,它可以在Web應用程序停止時更快地清理JNDI資源,以及singleton,它控制是否爲每個JNDI查找創建資源的新實例。要使用這些配置選項,資源必須在Web應用程序的<Context>元素或$CATALINA_BASE/conf/server.xml中的<GlobalNamingResources>元素中指定。

context.xml配置
如果Tomcat無法識別適當的資源工廠和/或需要額外的配置信息,則必須在Tomcat能夠創建資源之前指定額外的Tomcat特定配置。Tomcat特定的資源配置輸入在<Context>元素中,該元素可以在$CATALINA_BASE/conf/server.xml或最好是每個Web應用程序的上下文XML文件(META-INF/context.xml)中指定。

使用以下元素在<Context>元素中執行Tomcat特定的資源配置:

  • <Environment> - 配置標量環境條目的名稱和值,這些環境條目將通過JNDI InitialContext公開給Web應用程序(相當於在Web應用程序部署描述符中包含<env-entry>元素)。
  • <Resource> - 配置資源的名稱和數據類型,該資源可供應用程序使用(相當於在Web應用程序部署描述符中包含<resource-ref>元素)。
  • <ResourceLink> - 向全局JNDI上下文中定義的資源添加鏈接。使用資源鏈接使Web應用程序可以訪問在<Server>元素的<GlobalNamingResources>子元素中定義的資源。
  • <Transaction> - 添加用於實例化可在java:comp/UserTransaction處可用的UserTransaction對象實例的資源工廠。
    可以將任意數量的這些元素嵌套在一個<Context>元素內,並且只與該特定Web應用程序相關聯。

如果在<Context>元素中定義了資源,那麼不需要在/WEB-INF/web.xml中定義該資源。但是,建議在/WEB-INF/web.xml中保留條目,以記錄Web應用程序的資源需求。

如果對於在Web應用程序部署描述符(/WEB-INF/web.xml)中包含的<env-entry>元素和在Web應用程序的<Context>元素的一部分中的<Environment>元素都定義了相同的資源名稱,則僅當相應的<Environment>元素允許時(通過將override屬性設置爲“true”),部署描述符中的值將優先。

全局配置
Tomcat維護服務器的全局資源的單獨命名空間。這些在$CATALINA_BASE/conf/server.xml<GlobalNamingResources>元素中配置。您可以通過使用<ResourceLink>將這些資源暴露給Web應用程序,以將其包含在每個Web應用程序的上下文中。

如果使用<ResourceLink>定義了資源,那麼不需要在/WEB-INF/web.xml中定義該資源。但是,建議在/WEB-INF/web.xml中保留條目,以記錄Web應用程序的資源需求。

使用資源
在Web應用程序最初部署時,InitialContext被配置,並且被提供給Web應用程序組件(用於只讀訪問)。所有配置的條目和資源都放置在JNDI命名空間的java:comp/env部分中,因此對於資源的典型訪問 - 在本例中是對JDBC DataSource的訪問 - 看起來像這樣:

// 獲取我們的環境命名上下文
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");

// 查找我們的數據源
DataSource ds = (DataSource)
  envCtx.lookup("jdbc/EmployeeDB");

// 從池中分配並使用連接
Connection conn = ds.getConnection();
... 使用此連接訪問數據庫 ...
conn.close();

Tomcat標準資源工廠
Tomcat包含一系列標準資源工廠,可以爲您的Web應用程序提供服務,並通過元素提供配置靈活性,而無需修改Web應用程序或部署描述符。以下各小節詳細介紹了標準資源工廠的配置和用法。

有關如何創建、安裝、配置和使用自定義資源工廠類的信息,請參閱添加自定義資源工廠。

注意 - 在標準資源工廠中,只有“JDBC數據源”和“用戶事務”工廠被要求在其他平臺上可用,並且只有在平臺實現了Jakarta EE規範時才需要。所有其他標準資源工廠以及您自己編寫的自定義資源工廠都特定於Tomcat,並且不能假定它們在其他容器上可用。

通用JavaBean資源
0. 介紹
此資源工廠可用於創建符合標準JavaBeans命名約定的任何Java類的對象(即具有零參數構造函數,並且具有符合setFoo()命名模式的屬性設置器)。如果工廠的singleton屬性設置爲false,則該資源工廠僅在每次查找此條目時創建適當的bean類的新實例。

使用此設施的步驟如下所述。

  1. 創建您的JavaBean類
    創建每次資源工廠被查找時將實例化的JavaBean類。例如,假設您創建了一個名爲com.mycompany.MyBean的類,其代碼如下所示:
package com.mycompany;

public class MyBean {

  private String foo = "Default Foo";

  public String getFoo() {
    return (this.foo);
  }

  public void setFoo(String foo) {
    this.foo = foo;
  }

  private int bar = 0;

  public int getBar() {
    return (this.bar);
  }

  public void setBar(int bar) {
    this.bar = bar;
  }
}
  1. 聲明您的資源需求
    然後,修改您的Web應用程序部署描述符(/WEB-INF/web.xml)以聲明您將請求此bean的新實例的JNDI名稱。最簡單的方法是使用元素,例如:
<resource-env-ref>
  <description>
    MyBean實例的對象工廠。
  </description>
  <resource-env-ref-name>
    bean/MyBeanFactory
  </resource-env-ref-name>
  <resource-env-ref-type>
    com.mycompany.MyBean
  </resource-env-ref-type>
</resource-env-ref>

警告 - 請確保您遵循Web應用程序部署描述符的DTD所要求的元素順序!有關詳細信息,請參閱Servlet規範。

  1. 編寫您的應用程序對此資源的使用
    對此資源環境引用的典型用法可能如下所示:
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");

writer.println("foo = " + bean.getFoo() + ", bar = " +
               bean.getBar());
  1. 配置Tomcat的資源工廠
    要配置Tomcat的資源工廠,請向此Web應用程序的元素添加如下所示的元素。
<Context ...>
  ...
  <Resource name="bean/MyBeanFactory" auth="Container"
            type="com.mycompany.MyBean"
            factory="org.apache.naming.factory.BeanFactory"
            bar="23"/>
  ...
</Context>

請注意,資源名稱(在這裏是bean/MyBeanFactory)必須與Web應用程序部署描述符中指定的值匹配。我們還初始化了bar屬性的值,這將導致在返回新bean之前調用setBar(23)。因爲我們沒有初始化foo屬性(雖然我們可以),所以bean將包含由其構造函數設置的任何默認值。

如果bean屬性的類型爲String,則BeanFactory將使用提供的屬性值調用屬性設置器。如果bean屬性類型爲原始類型或原始包裝類型,則BeanFactory將將該值轉換爲適當的原始類型或原始包裝類型,然後在調用setter時使用該值。某些bean具有無法從String自動轉換的類型的屬性。如果bean提供了一個具有相同名稱但接受String的備用setter,則BeanFactory將嘗試使用該setter。如果BeanFactory無法使用值或執行適當的轉換,則設置屬性將失敗,並顯示命名異常。

較早的Tomcat版本中可用的forceString屬性已被刪除,作爲加強安全措施。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章