ToB企服应用市场:ToB评测及商务社交产业平台

标题: web server apache tomcat11-08-JNDI Resources [打印本页]

作者: 前进之路    时间: 2024-5-17 20:11
标题: 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模拟了它提供的服务:
Tomcat提供了一些针对JNDI资源的特定于Tomcat的选项,这些选项无法在web.xml中指定。这些选项包括closeMethod,它可以在Web应用程序制止时更快地清理JNDI资源,以及singleton,它控制是否为每个JNDI查找创建资源的新实例。要使用这些配置选项,资源必须在Web应用程序的元素或$CATALINA_BASE/conf/server.xml中的元素中指定。
context.xml配置
如果Tomcat无法识别适当的资源工厂和/或需要额外的配置信息,则必须在Tomcat能够创建资源之前指定额外的Tomcat特定配置。Tomcat特定的资源配置输入在元素中,该元素可以在$CATALINA_BASE/conf/server.xml或最好是每个Web应用程序的上下文XML文件(META-INF/context.xml)中指定。
使用以下元素在元素中执行Tomcat特定的资源配置:
如果在元素中定义了资源,那么不需要在/WEB-INF/web.xml中定义该资源。但是,建议在/WEB-INF/web.xml中保存条目,以纪录Web应用程序的资源需求。
如果对于在Web应用程序部署描述符(/WEB-INF/web.xml)中包含的元素和在Web应用程序的元素的一部门中的元素都定义了雷同的资源名称,则仅当相应的元素允许时(通过将override属性设置为“true”),部署描述符中的值将优先。
全局配置
Tomcat维护服务器的全局资源的单独命名空间。这些在$CATALINA_BASE/conf/server.xml的元素中配置。您可以通过使用将这些资源袒露给Web应用程序,以将其包含在每个Web应用程序的上下文中。
如果使用定义了资源,那么不需要在/WEB-INF/web.xml中定义该资源。但是,建议在/WEB-INF/web.xml中保存条目,以纪录Web应用程序的资源需求。
使用资源
在Web应用程序最初部署时,InitialContext被配置,而且被提供给Web应用程序组件(用于只读访问)。所有配置的条目和资源都放置在JNDI命名空间的java:comp/env部门中,因此对于资源的典型访问 - 在本例中是对JDBC DataSource的访问 - 看起来像如许:
  1. // 获取我们的环境命名上下文
  2. Context initCtx = new InitialContext();
  3. Context envCtx = (Context) initCtx.lookup("java:comp/env");
  4. // 查找我们的数据源
  5. DataSource ds = (DataSource)
  6.   envCtx.lookup("jdbc/EmployeeDB");
  7. // 从池中分配并使用连接
  8. Connection conn = ds.getConnection();
  9. ... 使用此连接访问数据库 ...
  10. conn.close();
复制代码
Tomcat尺度资源工厂
Tomcat包含一系列尺度资源工厂,可以为您的Web应用程序提供服务,并通过元素提供配置机动性,而无需修改Web应用程序或部署描述符。以下各末节具体介绍了尺度资源工厂的配置和用法。
有关如何创建、安装、配置和使用自定义资源工厂类的信息,请参阅添加自定义资源工厂。
注意 - 在尺度资源工厂中,只有“JDBC数据源”和“用户事务”工厂被要求在其他平台上可用,而且只有在平台实现了Jakarta EE规范时才需要。所有其他尺度资源工厂以及您自己编写的自定义资源工厂都特定于Tomcat,而且不能假定它们在其他容器上可用。
通用JavaBean资源
0. 介绍
此资源工厂可用于创建符合尺度JavaBeans命名约定的任何Java类的对象(即具有零参数构造函数,而且具有符合setFoo()命名模式的属性设置器)。如果工厂的singleton属性设置为false,则该资源工厂仅在每次查找此条目时创建适当的bean类的新实例。
使用此设施的步骤如下所述。
  1. package com.mycompany;
  2. public class MyBean {
  3.   private String foo = "Default Foo";
  4.   public String getFoo() {
  5.     return (this.foo);
  6.   }
  7.   public void setFoo(String foo) {
  8.     this.foo = foo;
  9.   }
  10.   private int bar = 0;
  11.   public int getBar() {
  12.     return (this.bar);
  13.   }
  14.   public void setBar(int bar) {
  15.     this.bar = bar;
  16.   }
  17. }
复制代码
  1. <resource-env-ref>
  2.   <description>
  3.     MyBean实例的对象工厂。
  4.   </description>
  5.   <resource-env-ref-name>
  6.     bean/MyBeanFactory
  7.   </resource-env-ref-name>
  8.   <resource-env-ref-type>
  9.     com.mycompany.MyBean
  10.   </resource-env-ref-type>
  11. </resource-env-ref>
复制代码
警告 - 请确保您遵循Web应用程序部署描述符的DTD所要求的元素顺序!有关具体信息,请参阅Servlet规范。
  1. Context initCtx = new InitialContext();
  2. Context envCtx = (Context) initCtx.lookup("java:comp/env");
  3. MyBean bean = (MyBean) envCtx.lookup("bean/MyBeanFactory");
  4. writer.println("foo = " + bean.getFoo() + ", bar = " +
  5.                bean.getBar());
复制代码
  1. <Context ...>
  2.   ...
  3.   <Resource name="bean/MyBeanFactory" auth="Container"
  4.             type="com.mycompany.MyBean"
  5.             factory="org.apache.naming.factory.BeanFactory"
  6.             bar="23"/>
  7.   ...
  8. </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属性已被删除,作为增强安全措施。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4