`

对java:comp/env的研究 .(转发)

 
阅读更多
这两天研究了一下 context.lookup("java:comp/env/XXX")和直接context.lookup("XXX")的区别

网上关于这两个的文章也很多,但是都说得很难理解,比如什么ENC环境啊什么的,各种概念。

其实说得简单点:context.lookup("java:comp/env/XXX")只能用在J2EE环境,即是如果你自己写一个main函数,想通过context.lookup("java:comp/env/XXX")这样的方式来访问JNDI服务,这是不可能的。
因为:java:comp/env/是一个J2EE环境的定义,说白了就是代表当前J2EE应用的环境,比如你自己项目的Web环境或者是EJB环境,那是不是只要是个Web项目,就能用context.lookup("java:comp/env/XXX")这种方式访问JNDI服务了呢?也不是!!!
使用这样的方式必须做一次 当前应用环境 到 资源名 的映射。
在web.xml文件中有这样的标签:
<resource-env-ref></resource-env-ref> 
<resource-ref></resource-ref> 
<ejb-local-ref></ejb-local-ref>  
<ejb-ref></ejb-ref> 


这些标签就是用来建立当前应用环境到服务器资源的映射的。
有了这样的映射之后,就能采用context.lookup("java:comp/env/XXX")的方式来访问JNDI资源了。


注意:context.lookup("XXX")在任何时候都是有效的,只要XXX确实是一个存在的JNDI名。


举个例子:
用weblogic10的控制台定了了一个oracle数据源,这个数据源的JNDI名称是:adsl,那么只要正确连接上了weblogic(当然需传递URL,用户名和密码还有weblogic的JNDI工厂对象,这不属于该文的讨论范围)在任何地方都能用context.lookup("xxx")得到这个数据源了,但是想通过context.lookup("java:comp/env/jdbc/adsl")访问到这个数据源,就不行了。如果想这样写的话需要做两件事情:
1、确保你的调用程序是一个web项目或者EJB项目,并部署到weblogic上。(例子使用web项目)
2、在web项目的web.xml里面加上如下配置:
<resource-ref> 
  <res-ref-name>jdbc/adsl</res-ref-name> 
  <res-auth>Container</res-auth> 
  <mapped-name>adsl</mapped-name> <!-- 这个必须和你的全局JNDI数据源名称一样 -->  
</resource-ref> 


那么你就能在你的web程序里通过context.lookup("java:comp/env/jdbc/adsl")访问到这个数据源了。

关于EJB的访问也类似这样,可以直接访问全局EJB的JNDI名,和可以映射之后从java:comp/env/下进行访问。


以上的讲解有错。。。。。
上面的情况只适用于weblogic和J2EE 2.5的规范下。
一:如果不是J2EE 2.5的规范:那么在你的web项目的web.xml内将根本不会存在<mapped-name>这个标签,那么怎样才能映射全局JNDI资源到你的项目呢?
以weblogic为例,你需要在和web.xml同级的目录下建立:weblogic.xml文件,在该文件里面写上:
<weblogic-web-app> 
<resource-description> 
<res-ref-name>jdbc/adsl</res-ref-name> 
<jndi-name>adsl</jndi-name><!-- 这个就是全局JNDI资源名 --> 
</resource-description> 
</weblogic-web-app> 

然后你仍然需要在web.xml里面配置上:
<resource-ref> 
  <res-ref-name>jdbc/adsl</res-ref-name> 
  <res-auth>Container</res-auth> 
  </resource-ref> 


这样你才可以在你的程序里面通过context.lookup("java:comp/env/jdbc/adsl")访问到这个数据源。
这个是weblogic.xml的官方帮助文档:http://edocs.weblogicfans.net/wls/docs92/webapp/weblogic_xml.html

二:如果不是使用weblogic,可参见这篇文章:http://blog.csdn.net/lovingprince/article/details/6577920
其实各种不同的J2EE容器,都用不同的配置方式,以我目前的测试来看,weblogic似乎不能配置“私有的JNDI资源”,就是不能配置自己项目单独的JNDI资源(这只是我的观点,我目前没发现怎么在weblogic里面配置私有JNDI资源)
但是研究tomcat6之后发现,tomcat可以配置 全局JNDI 和私有JNDI(注意这里说的Tomcat6):
!!!首先想要说明的是Tomcat的配置不需要修改web.xml里面的任何内容!!!!!
!!!Tomcat的全局JNDI资源不能直接访问,必须有java:comp/env/前缀!!!!!!
    全局的JNDI配置在server.xml里面的<GlobalNamingResources>标签里面添加如下配置:
  
 <Resource name="jdbc/test" 
  auth="Container" 
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1/test" 
              username="root" 
              password="root" 
              maxActive="20" 
              maxIdle="10" 
              maxWait="-1"/> 
   

然后某一个项目想要引用这个全局的JNDI,就需要在项目的META-INF下面建立context.xml文件,在里面写上:
<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <ResourceLink name="jdbc/test" global="jdbc/test" type="javax.sql.DataSource"/> 
</Context> 


这样就可以在程序里面通过context.lookup("java:comp/env/jdbc/test")进行访问了。

    私有的JNDI有三种方式可以配置:
      1、可以直接在server.xml里面的<Host>节点下添加如下配置:
<Context path="/test_tomcat6_jndi"> 
<Resource name="jdbc/test" 
      auth="Container" 
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1/test" 
              username="root" 
              password="root" 
              maxActive="20" 
              maxIdle="10" 
              maxWait="-1"/> 
</Context> 


这样就可以直接在程序中通过context.lookup("java:comp/env/jdbc/test")访问了,需要注意的是path="/test_tomcat6_jndi",这个名字必须和你的项目名称相同,而且不能少了那个斜杠,而且你的项目是通过拷贝文件夹到webapps下面的方式进行的部署。

     2、 也可以在conf/context.xml里面增加如下配置:
     <Resource name="jdbc/test" 
      auth="Container" 
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1/test" 
              username="root" 
              password="root" 
              maxActive="20" 
              maxIdle="10" 
              maxWait="-1"/> 

这样就可以直接在程序中通过context.lookup("java:comp/env/jdbc/test")访问了

      3、还可以在项目的WebRoot下面的META-INF文件夹下面创建context.xml文件,再在context.xml文件里面写上
<?xml version="1.0" encoding="UTF-8"?> 
<Context> 
    <Resource name="jdbc/test" 
  auth="Container" 
              type="javax.sql.DataSource" 
              driverClassName="com.mysql.jdbc.Driver" 
              url="jdbc:mysql://127.0.0.1/test" 
              username="root" 
              password="root" 
              maxActive="20" 
              maxIdle="10" 
              maxWait="-1"/> 
</Context> 
这样就可以直接在程序中通过context.lookup("java:comp/env/jdbc/test")访问了

你可以发现的是:以上的Tomcat6中的配置不管是全局还是局部,都没有修改项目的web.xml文件,但是仍然建议在web.xml中进行引用,主要是为了项目的迁移,因为有的服务器需要在web.xml中进行声明!

总之:各种服务器有时候确实有比较大的出入,特别是感觉J2EE中类似<resource-ref>这样的一些标签仍然不是很理解。 
分享到:
评论

相关推荐

    42个著名搜索引擎免费登陆入口大全.docx

    下面对其中一些重要的搜索引擎及其特点进行详细介绍: 1. 百度(Baidu):作为中国最大的搜索引擎,百度提供了一个免费的网址提交入口(http://www.baidu.com/search/url_submit.htm),使得网站管理员可以直接向...

    Errno 14 curl#37 - "Couldn't open file /mnt/repodata/repomd.xml

    在Linux系统中,`yum`是一个非常重要的包管理器,用于安装、更新和删除软件包。当遇到"Errno 14 curl#37 - "Couldn't open file /mnt/repodata/repomd.xml""这样的错误时,意味着在尝试使用`yum`执行操作时,系统...

    JNDI连接数据库配置

    接着,通过调用`initCtx.lookup("java:comp/env")`来获取Java环境命名上下文`envCtx`。之后,再通过`envCtx.lookup("jdbc/DevDB")`查找名为`jdbc/DevDB`的资源,并将其转换为`DataSource`类型。最后,通过`...

    java程序员需要的20个帮助学习网站

    17. **Java FAQ(http://www.ibiblio.org/javafaq/javafaq.html)**:基于Usenet新闻组comp.lang.java的FAQ网站,收集了Java开发者常遇到的问题及其解答,是一个宝贵的参考资源。 18. **Sun's Official Java ...

    程序员 java

    - **特点**:基于Usenet组comp.lang.java的FAQ,涵盖了Java开发的各个方面。 #### 1.18 Java Tutorial (http://java.sun.com/docs/books/tutorial/) - **概述**:由Sun Microsystems提供的官方Java教程。 - **特点*...

    我整理的java技术网站的URL地址

    - **[Comp.Lang.Java FAQ](http://www.ibiblio.org/javafaq/javafaq.html)**: Java FAQ网站,覆盖了Java编程中的常见问题和解决方案。 #### 1.3 专业博客和技术文章 - **[JavaBlogs](http://www.javablogs.com)**: ...

    Java专业人士必备的书籍和网站列表:

    15. **comp.lang.java FAQ (http://www.ibiblio.org/javafaq/javafaq.html)** - Java编程常见问题解答的在线资源。 通过充分利用这些书籍和网站资源,Java专业人士能够不断提升自己的技能,紧跟技术前沿,从而在...

    java程序员的必看的文章

    - **特点**:收集了来自comp.lang.java新闻组的问题和答案的分类目录。 - **适用场景**:查找常见Java问题的解答。 18. **SUN官方Java指南(http://java.sun.com/docs/books/tutorial/)** - **特点**:SUN公司...

    HashMap关系数据映射技术软件jadepool-1.1-GBK

    本次修订内容:1、修订了ProcessVO类中java....3、去掉DbConnection早期数据源名称需要加"java:comp/env/"前缀的做法,修订后,是否需要加此前缀,请用户根据需要决定。已在Tomcat、GlassFish中测试通过数据源连接。

    26、支付宝支付源码分享

    - **源码说明**:(nacos的ip配置自行修改,全局变量DEV_CONFIG设置:1=zsz,2=comp,3=home) - goods_srv/model/sql/mxshop_goods.sql:包含了建表语句 - other_import/api.json:YApi的导入文件 - other_import/...

    java技术网站

    comp.lang.java FAQ网站汇集了Java编程中最常见的问题和答案,是解决Java编程难题的宝贵资源。无论是初学者还是经验丰富的开发者,都能从中受益匪浅。 #### 18. Sun's Java Tutorials...

    JAVA开发者应该去的20个英文网站

    Java FAQ是由comp.lang.java社区维护的一个FAQ集合,解答了JAVA编程中最常见的问题。如果你遇到了某个具体的技术难题,这里可能已经有了解答。 19. **Java Tutorials (http://java.sun.com/docs/books/tutorial)**...

    JAVA程序员要常去的网站

    - **简介**:基于comp.lang.java新闻组的FAQ站点。 - **内容**:收录了大量常见问题及其解答。 - **价值**:是JAVA新手解决问题的良好起点。 18. **Java Tutorial(http://java.sun.com/docs/books/tutorial/)*...

    在Weblogic上配置Hibernate为JNDI

    这里,`java:comp/env/hibernate/session_factory`是JNDI查找的名称,它对应于hibernate.properties中配置的`hibernate.session_factory_name`,即使在Weblogic中实际名称需要以点号分隔。 通过以上步骤,我们成功...

    JAVA开发者最常去的20个英文网站

    comp.lang.java FAQ 是一个专注于解答 Java 相关问题的网站,基于 Usenet 新闻组中的 comp.lang.java 主题进行整理和归纳。这里的 FAQ 涵盖了从基础知识到高级主题的广泛内容,是解决编程问题和获取编程指导的好地方...

    Android代码-漫画制作工具安卓版

    Marvelous A practicing app to try out all the new cool Android tools all around the corner, while using Marvel Comics API. Requirements Put your Marvel API keys...you may not use this file except in comp

    计算机视觉与模式识别有用的代码网站

    Yang等人在这方面做了深入研究(http://www4.comp.polyu.edu.hk/deRepresentationSparseCodingForFaceRecognitionYangAndD.Zhang.html)。 这些资源为研究人员和开发者提供了丰富的计算机视觉和模式识别的实践代码...

    附录B在线文档1

    6. **Linux开发论坛**:新闻组`comp.os.linux.development.system`是讨论Linux内核开发问题的专业平台,这里的交流和讨论有助于跟踪最新的开发进展和技术动态。 7. **Linux内核邮件列表**:`linux-kernel@vger....

    国内外Java学习论坛汇总.doc

    24. **comp.lang.java FAQ (http://www.ibiblio.org/javafaq/javafaq.html)** - **特点**:基于新闻组的问题与答案集合。 - **推荐理由**:适合希望获取常见问题解答的Java学习者。 25. **Java教程 ...

Global site tag (gtag.js) - Google Analytics