Java:comp/env/讲解与JNDI

转载自   "Java:comp/env/"讲解与JNDI

我们在使用JNDI调用某个对象时,会有下述两种方式

context.lookup(“java:comp/env/XXX”) 
context.lookup(“XXX”)

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(Enterprise JavaBean)项目,并部署到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内将根本不会存在这个标签,那么怎样才能映射全局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容器,都用不同的配置方式。 
研究tomcat6之后发现,tomcat可以配置全局JNDI和私有JNDI(注意这里说的Tomcat6):

!!!首先想要说明的是Tomcat的配置不需要修改web.xml里面的任何内容!!! 
!!!Tomcat的全局JNDI资源不能直接访问,必须有java:comp/env/前缀!!!

全局的JNDI配置在server.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"/> 

然后某一个项目想要引用这个全局的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里面的节点下添加如下配置:

<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中进行声明!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 Azure Functions 实现无服务器体系结构

从工具到机器再到计算机&#xff0c;我们一直在寻找能够自动执行重复工作并让我们所处理的上下文规范化的方法&#xff0c;以便我们可以将重心放在做出高价值的专业化贡献上&#xff0c;从而完成任务并解决问题。 与此同时&#xff0c;很显然&#xff0c;随着 IT 产业的不断发展…

2020蓝桥杯省赛---java---C---3( 跑步训练)

题目描述 代码实现 方式一 方式二 package com.atguigu.lanqiao;public class Main {public static void main(String[] args) {int target10000;int count0;boolean flagtrue;//判断此次是否需要跑步while (true){//如果小于600体力并且需要跑步&#xff0c;证明这一分钟跑…

python 找色点击_Python实现按键精灵(二)-找图找色

一、实现功能判断在指定坐标范围内&#xff0c;是否存在相似度大于n的图片&#xff0c;并返回坐标。二、基本思路A你需要寻找的图片B截取当前页面中指定范围的图片利用opencv 判断A在B中的位置&#xff0c;在该位置截取与A图同大小的图片C对比图片C与图片A的相似度三、实现的代…

Numeral.js数字格式化

翻译自 Numeral.js 用它 在浏览器中 <script src"numeral.min.js"></script> 或者引用从cdnjs.com <script src"http://cdnjs.cloudflare.com/ajax/libs/numeral.js/2.0.6/numeral.min.js"></script> 在Node.js中 npm inst…

sqlserver中常用的几个存储过程

sqlserver中的存储过程&#xff0c;何为存储过程呢&#xff1f; 存储过程&#xff08;Stored Procedure&#xff09;是在大型数据库系统中&#xff0c;一组为了完成特定功能的SQL 语句集&#xff0c;存储在数据库中&#xff0c;经过第一次编译后再次调用不需要再次编译&#x…

java枚举类定义性别_Java 枚举类和自定义枚举类和enum声明及实现接口的操作

1.枚举类注&#xff1a;JDK1.5之前需要自定义枚举类JDK 1.5 新增的 enum 关键字用于定义枚举类若枚举只有一个成员, 则可以作为一种单例模式的实现方式1.枚举类的属性1、枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰2、枚举类的使用 private final 修饰的…

2020蓝桥杯省赛---java---B---4( 合并检测)

题目描述 思路分析 假设A国有n个人&#xff0c;感染者有n/100 每k个人一组&#xff0c;共n/k组&#xff0c;共用n/k瓶试剂 按照最坏的情况&#xff0c;每多出一个感染者就多用k瓶试剂&#xff0c; 因此共用n/k(n/100)*k瓶试剂 n是定值&#xff0c;所以求(1/kk/100)最小 由于ab…

visual studio 2017发布dotnet core到docker

docker的好处不用多说&#xff0c;有不了解的可移步《docker入门》&#xff0c;作为一个.net方面的老鸟也想早点搭上docker末班车&#xff0c;减少布署中的各种坑。以下我是在Visual Studio 2017正式版发布后&#xff08;其实VS2015也是可以的&#xff09;&#xff0c;完全跑起…

URLSearchParams 接口

转载自 URLSearchParams 接口 URLSearchParams 接口定义了很多个用来处理 URL 参数串的方法。 基本使用方法如下 var paramsString "qURLUtils.searchParams&topicapi" // location.search.slice(1) var searchParams new URLSearchParams(paramsString);s…

JDK环境变量配置

1.变量名&#xff1a; JAVA_HOME 变量值&#xff1a;&#xff08;变量值填写你的jdk的安装目录&#xff0c;例如本人是 E:\Java\jdk1.8.0&#xff09;2.变量名&#xff1a; Path 变量值&#xff1a; ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;3.变量名&#xff1a; CLASSPATH 变量…

2020蓝桥杯省赛---java---B---5( REPEAT 程序)

题目描述 【问题描述】附件 prog.txt 中是一个用某种语言写的程序。其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达&#xff0c;从次行开始连续的缩进比该行多的&#xff08;前面的空白更长的&#xff09;为循环包含的内容。例如如下片段&#xff1a;REPEA…

java oschina_简单说说 OSChina 的技术架构

OsChina.NET 这个域名是在去年 08年8月16日申请的&#xff0c;然后花了不足一个月的时候开发了第一个版本的OsChina&#xff0c;包含有项目展示、新闻、后台管理、会员注册等功能&#xff0c;以后的每次的改进就没那么集中&#xff0c;有空的话就完善完善一直到今天&#xff0c…

强势解析 eBay BASE 模式、去哪儿及蘑菇街分布式架构

互联网行业是大势所趋&#xff0c;从招聘工资水平即可看出&#xff0c;那么如何提升自我技能&#xff0c;满足互联网行业技能要求&#xff1f;需要以目标为导向&#xff0c;进行技能提升。 本文主要针对分布式系统设计、架构(数据一致性)做了分析&#xff0c;祝各位早日走上属于…

MySQL sum()函数

转载自 MySQL sum()函数 MySQL SUM()函数介绍 SUM()函数用于计算一组值或表达式的总和&#xff0c;SUM()函数的语法如下&#xff1a; SUM(DISTINCT expression)SUM()函数是如何工作的&#xff1f; 如果在没有返回匹配行SELECT语句中使用SUM函数&#xff0c;则SUM函数返回…

利用老毛头启动盘重装win7

注意&#xff1a;请不要跟着本教程一步一步的做&#xff0c;要先看一遍 1&#xff0e;安装win7安装 安装win7系统所需材料&#xff1a; 老毛桃PE系统 下载地址&#xff1a;http://www.laomaotao.tv/如使用其它PE系统也是一样&#xff0c;这里我用老毛桃为例 Win系统镜像…

2020蓝桥杯省赛---java---B---6(分类计数)

题目描述 思路分析 把字符串转换成字符数组 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.next();char[] temp str.toCharArray();int…

MySQL min()函数

转载自 MySQL min()函数 MySQL MIN函数 MIN()函数返回一组值中的最小值。MIN()函数在某些情况下非常有用&#xff0c;例如找到最小的数字&#xff0c;选择最便宜的产品&#xff0c;获得最低的信用额度等。 以下说明MIN()函数的语法&#xff1a; MIN(DISTINCT expression);…

使用 C# 运行符号测试

若有需前后对比的数据&#xff0c;且要确定某种效果是否有统计依据&#xff0c;最常使用的是符号检验。通过举例可以很好地解释这个原理。 假设你在一家制药公司工作&#xff0c;想要确定一种新型减肥药是否有效。你找来八名志愿者服用这种减肥药长达几周的时间。观察八名实验对…

程序人生

在大家眼里程序员是什么样子的呢&#xff1f;是每天不分日夜的在打代码&#xff1f;还是忙来忙去的帮着被人修电脑&#xff0c;调路由器&#xff1f;还是&#xff1f;或者&#xff1a;哈哈哈&#xff0c;作为一个程序员&#xff0c;我是这样的&#xff1a;下班之后先做饭&#…

2020蓝桥杯省赛---java---B---7(分类计数)

题目描述 代码实现 package com.atguigu.lanqiao;import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);long a sc.nextLong();while (a>1){System.out.print(a" ");a/2;}} }