貌似有段时间没来这里忽悠了,今天抽空接着忽悠下这三个服务器配置JNDI时的一些异同点并提点自己的建议。

  • Jboss 4

Jboss中配置JNDI最常见的就是在配置数据源的时候,在server/default/deploy目录下方一个xxx-ds.xml文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?> <datasources>   <local-tx-datasource>       <jndi-name>jdbc/DataSource</jndi-name>       <connection-url>jdbc:jtds:sqlserver://localhost:1433/fnx</connection-url>       <driver-class>net.sourceforge.jtds.jdbc.Driver</driver-class>       <user-name>sa</user-name>       <password>1234</password>      <metadata>      <type-mapping>MS SQLSERVER2000</type-mapping>      </metadata>      </local-tx-datasource> </datasources>

这样我们启动服务器后,在web应用中就可以通过如下代码就可以直接访问到数据源:

Context ctx = new InitialContext(); Object o=ctx.lookup("java:jdbc/DataSource");

然而这里的java:jdbc/DataSource是一个全局资源名称,Jboss自动将资源加入全局资源,我们经常在应用中看到的java:comp/env/jdbc/DataSource 又是怎么回事?这其实是应用

的私有环境引用名,如果要使用这个引用名称,需要做两件事情(必须做),1、在应用的WEB-INF目录下创建jboss-web.xml,并设置全局到局部引用名得映射

<jboss-web> <resource-ref> <res-ref-name>jdbc/DataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <jndi-name>java:/jdbc/DataSource</jndi-name> </resource-ref> <context-root>/</context-root> </jboss-web>

2、在web.xml中设置

<web-app> <display-name>Archetype Created Web Application</display-name> <resource-ref> <description>dataSource</description> <res-ref-name>jdbc/DataSource</res-ref-name> <res-type>javax.sql.DataSource </res-type> <res-auth>Container</res-auth> </resource-ref> </web-app>

这样就可以在web应用中使用 java:comp/env/jdbc/DataSource 私有名了。

  • Tomcat 6

tomcat中配置JNDI有三个地方:

1、在服务器的Server元素下配置全局的JNDI<GlobalNamingResources>

2、在host元素的<DefaultContext>中配置,配置后对该host下所有的context应用都有效

3、在context元素下配置,这里配置的只对该应用有效。

需要注意的是,第一种方式配置的全局JNDI,需要在context中使用<ResourceLink>元素转换成局部名才可以使用,功能跟jboss-web.xml中的转换类似。另外,tomcat 中配置的资源不需要在web.xml中进行声明,也可以通过java:comp/env形式进行访问,这一点跟Jboss/jetty有区别。

上面三个地方可以配置的资源元素是Resource/Environment,ResourceParams是配合Resource使用,而ResourceLink是为了连接转换全局资源。

举个简单例子,在context元素下的配置:(其他的各位自己去看元素如何使用)

<Resource name="mybase" auth="Container" type="org.apache.catalina.UserDatabase" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" pathname="conf/tomcat-users.xml" />

这样就可以直接在web中使用 java:comp/env/mybase 来查询到资源了。不过还是建议在web.xml中声明一下。

  • Jetty 7

Jetty的JNDI配置也分3个范围

1、基于JVM全局的,也就是同一个JVM下不同的Server都可以访问

2、基于Server的,只能在该server下可以访问

3、基于应用context上下文的,只能在该context下能够访问

配置方式见我上面一篇《JNDI和在JETTY中的运用》

不过这里要注意的是,采用java:comp/env方式访问时,一定要在web.xml中声明资源(除了配置的EnvEntry元素除外,他自动会加入到私有资源),否则你是拿不到资源的。

  • 总结

可以看到,每个服务器都有他自己的JNDI配置方式和全局访问方式,如果我们直接采用全局访问方式,第一对于一些只对某些应用有关的资源配置可能访问不到,例如JETTY,第二每个

应用服务器的全局访问方式可能不太一致。因此一般建议在应用程序中采用私有方式(java:comp/env)访问资源,并且无论如何都在web.xml中进行申明。这是一个良好的习惯。

另外:说到私有环境ENC(java:comp/env),他是如何变成私有的?其实私有是对每个应用上下文来说的,一般每个应用上下文都会用自己的classloader来加载应用,因此利用classloader便可以完成。具体方式是: 用每个应用自己的上下文 cloassloader 来初始化一个 JNDI context . 并以 classoader 为 key 保存起来,以后应用检索时需要使用的应用自己上下文的 classloader来查找这个JNDI 资源即可 ,由于其他应用使用不同的classloader实例,也就不能相互共享了,这就是每个应用私有了。另外如果资源命名时采用: java:resourceName, 或者 prefix:resourceName 的方式,虽然我们可以通过 java:resourceName, 或者 prefix:resourceName 的方式直接访问,但也注定了这不是私有资源,所有应用都可以访问,需要放到 ENC 下才是私有资源。绑定在 ENC 下访问: java:comp/env/prefix:resourceName

转载于:https://www.cnblogs.com/lovingprince/archive/2011/06/30/2166237.html

关于Jboss/Tomcat/Jetty的JNDI定义123相关推荐

  1. Apache vs Nginx vs Tomcat vs JBoss vs Jetty

    Reference [1] https://blog.csdn.net/allenlinrui/article/details/6675998 Nginx 轻量级,采用 C 进行编写,同样的 web ...

  2. 如何在Tomcat中设置JNDI数据库连接池-Spring教程示例

    在Spring和Tomcat中设置JNDI数据库连接池非常容易. Tomcat服务器文档提供了有关如何在Tomcat 5.6或7中设置连接池的足够信息.在这里,我们将结合使用Tomcat 7和Spri ...

  3. Tomcat 5 5 JNDI Resource 配置

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Tomc ...

  4. 《深入拆解Tomcat Jetty》笔记

    极客时间<深入拆解Tomcat & Jetty>笔记 03_你应该知道的Servlet规范和Servlet容器 1.HTTP服务器怎么知道要调用哪个Java类的哪个方法呢.最直接的 ...

  5. tomcat中配置jndi数据源以便spring获取

    [0]README 0)intro to jndi, plase visit intro to jndi: 1)本文译自 Configuring Spring MVC JdbcTemplate wit ...

  6. jetty 配置jndi_使用Jetty设置JNDI(嵌入式)

    jetty 配置jndi 我在开发工作区上运行嵌入式Jetty,从而节省了一些恶性的编译和部署周期. 我与Jetty的合作不多,易用性使我着迷于它. 我需要设置JNDI才能检索与数据库相关的活动的连接 ...

  7. 使用Jetty设置JNDI(嵌入式)

    我在开发工作区上运行嵌入式Jetty,从而节省了一些编译和部署恶性循环的时间. 我与Jetty的合作不多,易用性使我着迷于它. 我需要设置JNDI才能检索与数据库相关的活动的连接池. 尽管某些地方有完 ...

  8. springboot需要tomcat服务器吗_SpringBoot学习(二):内嵌服务器引擎(Tomcat,Jetty)实现原理...

    概述 SpringBoot使用main方法启动的一个重要特性是,不需要打包成war部署到Tomcat这种Servlet容器中,而是只需打包成jar,然后通过java或mvn等命令运行这个jar包,然后 ...

  9. SpringBoot 配置嵌入式Servlet容器(tomcat,jetty,undertow)

    SpringBoot 默认打包方式为jar包,且可以自启动,就是因为它内嵌了Servlet容器. SpringBoot 默认使用嵌入式Servlet容器,SpringBoot 2.2.5 默认是 To ...

最新文章

  1. AJAX 请求真的不安全么?
  2. 服务器配置—开网站空间
  3. python详细安装步骤-最新Python安装图文教程[很详细]
  4. 计算机组成原理答案郑秋梅,计算机组成原理-郑秋梅_习题.docx
  5. 牛顿方法、指数分布族、广义线性模型—斯坦福ML公开课笔记4
  6. Java中怎样监测局域网内ip是否互通,类似ping
  7. Neo4j【付诸实践 01】SpringBoot集成报错org.neo4j.driver.exceptions.ClientException:服务器不支持此驱动程序支持的任何协议版本(解决+源代码)
  8. ppt生成器_9款魔性#傻瓜生成器#,上班可以划水一天
  9. mysql 跨实例复制数据_社区投稿 | MySQL 跨实例 copy 大表解决方案
  10. 如何在Hyper-V上安装Centos7
  11. mysql 密码重置 linux_怎么在linux系统重置mysql的root密码
  12. 获取当前ip_write_ip_tcl命令你用过吗?
  13. hdu 4300(kmp)
  14. ValueError: output parameter for reduction operation logical_and has too many dimensions ?
  15. java 生辰八字五行计算,五行八字(生辰八字五行计算器)
  16. matlab lte rsrp,为什么选择 FieldFox 手持式分析仪?- 更宽带宽,更高精度
  17. Gstreamer- 协商(Negotiation)
  18. Sumatra PDF软件基本使用和快捷键
  19. linux中流设备_Linux纯干货知识总结|面试专用
  20. C# webkit 内核浏览器 访问https网站 显示空白或者提示 Problem with the SSL CA cert (path? access rights?)

热门文章

  1. linux数据被删了怎么办
  2. 官宣:恭喜 ChaosBlade 项目进入 CNCF Sandbox
  3. java字面量和符号引用_java -- JVM的符号引用和直接引用
  4. Mysql多表查询(案例1)
  5. 不同虚拟机局域网Vlan之间访问
  6. 查询过去一个月有付款mysql_MySQL_mysql 月份查询该月有付款的数据,ktime 开始时间串 dtime 到期时间 - phpStudy...
  7. xp本地计算机策略被更改,组策略的使用方法,和XP系统的实用修改窍门
  8. linux修改vim配色,更改vim配色的具体操作 更改vim配色的图文教程
  9. 服务器组装 华硕主板,专业组装服务器 华硕主板P9D-C/4L热销
  10. java list负载_java集合的扩容和负载因子的总结