1. JNDI
JNDI是一套用于java 目錄服務(wù)的API。Java應(yīng)用可以通過JNDI按照命名來查找數(shù)據(jù)和對(duì)象。使用JNDI可以將app應(yīng)用連接到外部服務(wù),比如數(shù)據(jù)庫(kù)..
2. Context
Tomcat 在StandardContext 維護(hù)了一個(gè)NamingResourcesImpl, 這個(gè)類在web應(yīng)用初始化階段保存了當(dāng)前應(yīng)用定義的資源。資源可以在server.xml中的<Context>元素下定義(但是不推薦);或者在自己的web應(yīng)用的META-INF/context.xml中定義(推薦,因?yàn)檫@樣每次更改context信息,就不用重新啟動(dòng)tomcat)。
當(dāng)web應(yīng)用啟動(dòng)時(shí),Tomcat會(huì)為每個(gè)應(yīng)用創(chuàng)建子Context。除了UserTransaction 位于 “java:comp"下, 其他的信息都位于 “java:comp.env" 下。在JNDI查找資源時(shí),會(huì)找到當(dāng)前應(yīng)用對(duì)應(yīng)的Context,然后根據(jù)命名找到我們想要的信息。
下圖是web項(xiàng)目的目錄:

3.配置DataSource數(shù)據(jù)源
首先在META-INF/context.xml 中配置數(shù)據(jù)源信息(也可以在tomcat conf/context.xml?下配置,這樣同一tomcat下的其他web應(yīng)用也可以使用此數(shù)據(jù)源)。

至此,我們就可以通過context找到相應(yīng)的數(shù)據(jù)源信息。網(wǎng)上很多教程會(huì)在web.xml中添加“resource-ref”的配置,但是從概念上講,web.xml中定義的是資源的引用,而context.xml定義的是配置的資源。既然已經(jīng)能直接從context中找到相應(yīng)的數(shù)據(jù)源信息,那么web.xml 中的引用豈不是重復(fù)的。
4. 實(shí)現(xiàn)數(shù)據(jù)庫(kù)連接
在我們進(jìn)行JNDI資源查找時(shí),首先需要手動(dòng)構(gòu)造一個(gè)IntialContext。然后通過得到的context去上面說的"java:comp/env"下去查找。如下圖:(注意:查找的name要與Resource中定義的name一致)
