关于Jboss/Tomcat/Jetty的JNDI定义123
????? 貌似有段時間沒來這里忽悠了,今天抽空接著忽悠下這三個服務器配置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 又是怎么回事?這其實是應用
的私有環(huán)境引用名,如果要使用這個引用名稱,需要做兩件事情(必須做),1、在應用的WEB-INF目錄下創(chuàng)建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有區(qū)別。
? 上面三個地方可以配置的資源元素是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中進行申明。這是一個良好的習慣。
?
?
? 另外:說到私有環(huán)境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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AC解 - Phone List(HDO
- 下一篇: sicily 1034. Forest