貌似有段時間沒來這里忽悠了,今天抽空接著忽悠下這三個服務器配置JNDI時的一些異同點并提點自己的建議。
Jboss中配置JNDI最常見的就是在配置數(shù)據(jù)源的時候,在//目錄下方一個xxx-ds.xml文件,內(nèi)容如下:
這樣我們啟動服務器后,在web應用中就可以通過如下代碼就可以直接訪問到數(shù)據(jù)源:
然而這里的java:jdbc/是一個全局資源名稱,Jboss自動將資源加入全局資源,我們經(jīng)常在應用中看到的java:comp/env/jdbc/ 又是怎么回事?這其實是應用
的私有環(huán)境引用名,如果要使用這個引用名稱,需要做兩件事情(必須做),1、在應用的WEB-INF目錄下創(chuàng)建jboss-web.xml,并設置全局到局部引用名得映射
2、在web.xml中設置
這樣就可以在web應用中使用 java:comp/env/jdbc/ 私有名了。
中配置JNDI有三個地方:
1、在服務器的元素下配置全局的JNDI
2、在host元素的中配置jboss什么時候需要配置數(shù)據(jù)源,配置后對該host下所有的應用都有效
3、在元素下配置,這里配置的只對該應用有效。
需要注意的是,第一種方式配置的全局JNDI,需要在中使用元素轉換成局部名才可以使用,功能跟jboss-web.xml中的轉換類似。另外, 中配置的資源不需要在web.xml中進行聲明,也可以通過java:comp/env形式進行訪問,這一點跟Jboss/jetty有區(qū)別。
上面三個地方可以配置的資源元素是/,是配合使用,而是為了連接轉換全局資源。
舉個簡單例子,在元素下的配置:(其他的各位自己去看元素如何使用)
這樣就可以直接在web中使用 java:comp/env/ 來查詢到資源了。不過還是建議在web.xml中聲明一下。
Jetty的JNDI配置也分3個范圍
1、基于JVM全局的,也就是同一個JVM下不同的都可以訪問
2、基于的,只能在該下可以訪問
3、基于應用上下文的,只能在該下能夠訪問
配置方式見我上面一篇《JNDI和在JETTY中的運用》
不過這里要注意的是,采用java:comp/env方式訪問時,一定要在web.xml中聲明資源(除了配置的元素除外,他自動會加入到私有資源)jboss什么時候需要配置數(shù)據(jù)源,否則你是拿不到資源的。
可以看到,每個服務器都有他自己的JNDI配置方式和全局訪問方式,如果我們直接采用全局訪問方式,第一對于一些只對某些應用有關的資源配置可能訪問不到,例如JETTY,第二每個
應用服務器的全局訪問方式可能不太一致。因此一般建議在應用程序中采用私有方式(java:comp/env)訪問資源,并且無論如何都在web.xml中進行申明。這是一個良好的習慣。
另外:說到私有環(huán)境ENC(java:comp/env),他是如何變成私有的?其實私有是對每個應用上下文來說的,一般每個應用上下文都會用自己的來加載應用,因此利用便可以完成。具體方式是:用每個應用自己的上下文 來初始化一個 JNDI . 并以 為 key 保存起來,以后應用檢索時需要使用的應用自己上下文的 來查找這個JNDI 資源即可 ,由于其他應用使用不同的實例,也就不能相互共享了,這就是每個應用私有了。另外如果資源命名時采用: java:, 或者 : 的方式,雖然我們可以通過 java:, 或者 : 的方式直接訪問,但也注定了這不是私有資源,所有應用都可以訪問,需要放到 ENC 下才是私有資源。綁定在 ENC 下訪問: java:comp/env/: