JNDI數據源局部配置(解決Cannot create JDBC driver of class '' for connect URL 'null')


最開始,我是借鑒 孤傲蒼狼的JNDI教程去做的,他講得很詳細,但是壞處也就是因為他講的太詳細。查了很多書,都是建議說不要用全局去配置JNDI,一是要修改tomcat的server.xml,容易破壞tomcat ,其次是那樣吃力不討好。我是建議用局部變量就好的。

1.步驟一:學習配置JNDI之前,介紹你一定要先掌握tomcat的配置虛擬目錄(可以去看Tomcat中主目錄配置與虛擬目錄配置問題這樣的文章,也可以去我的tomcat配置虛擬目錄 -思維焦點網易博客找類似的鏈接)。學習了tomcat的配置虛擬目錄后你就知道了為什么要在  tomcat安裝目錄\conf\Catalina\localhost   下創建.xml文件。

2.步驟二: 開始通過局部配置JNDI(這個教程也只講局部配置)。  

下面會附上代碼,標注顏色的,你要根據自己的實際情況改一下。

3.步驟三:最后通過tomcat的startup.bat啟動和用電腦的瀏覽器是可以看到成功連接數據源和驅動的,但是用eclipse啟動tomcat就不能了,總是提示Cannot create JDBC driver of class '' for connect URL 'null'問題 ,后來找到了tomcat+mysql問題,找不到jdbc驅動? ,說是jdbc for mysql除了mysql-connector-java-3.1.8-bin.jar之外還要個aspectjrt.jar,一起放在WEB-INF\lib  里面,結果沒問題,可以運行了。網上很多資料和書都沒有提到這個,我也不知道什么原因需要copy aspectjrt.jar 這個東西,也可能時tomcat版本或是jdbc版本問題。如果還是不行的話,可以再嘗試這種方法:Tomcat下使用Druid配置JNDI數據源

--------------------------------------------------------------我是可愛的分割線-----------------------------------------------------

繼續詳解步驟二,附上代碼: 

1.首先,新建一個Test_JNDI的工程,然后在mysql和sqlserver數據庫中創建名為test的數據庫(只測試這兩種數據庫)。然后,在工程里創建test_jndi.jsp,然后在這個jsp中貼上代碼

 1  
 2 
 3 <%@ page language="java" contentType="text/html; charset=UTF-8"
 4     pageEncoding="UTF-8"%>
 5  <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
 6 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 7 <html>
 8    <head>
 9      <title>JNDI數據源測試</title>
10    </head> 
11    <body>        
12          <%
13              Connection connMySQL = null;
14              try {
15                  //1、初始化名稱查找上下文
16                  Context ctx = new InitialContext();
17                  //InitialContext ctx = new InitialContext();亦可 
18                  //2、通過JNDI名稱找到DataSource,對名稱進行定位java:comp/env是必須加的,后面跟的是DataSource名
19                  /*
20                  DataSource名在web.xml文件中的<res-ref-name>mysqlDataSource</res-ref-name>進行了配置
21                    <!--MySQL數據庫JNDI數據源引用 -->
22                    <resource-ref>
23                        <description>MySQL DB Connection</description>
24                        <res-ref-name>mysqlDataSource</res-ref-name>
25                        <res-type>javax.sql.DataSource</res-type>
26                        <res-auth>Container</res-auth>
27                    </resource-ref>
28                  */
29                  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql");
30                  //3、通過DataSource取得一個連接
31                  connMySQL = ds.getConnection();
32                  out.println("MySQL Connection pool connected !!");
33                  //4、操作數據庫
34              } catch (NamingException e) {
35                  System.out.println(e.getMessage());
36              } catch (SQLException e) {
37                  e.printStackTrace();
38              } finally {
39                  //5、關閉數據庫,關閉的時候是將連接放回到連接池之中
40                 connMySQL.close();
41              }
42          %>
43            
44          <hr/>
45          <%
46              Connection connSQLServer = null;
47              try {
48                  //1、初始化名稱查找上下文
49                  Context ctx = new InitialContext();
50                  //InitialContext ctx = new InitialContext();亦可 
51                  //2、通過JNDI名稱找到DataSource,對名稱進行定位java:comp/env是必須加的,后面的是DataSource名
52                  /*
53                  DataSource名在web.xml文件中的<res-ref-name>sqlserverDataSource</res-ref-name>進行了配置
54                  <!--SQLServer數據庫JNDI數據源引用 -->
55                    <resource-ref>
56                        <description>SQLServer DB Connection</description>
57                        <res-ref-name>sqlserverDataSource</res-ref-name>
58                        <res-type>javax.sql.DataSource</res-type>
59                        <res-auth>Container</res-auth>
60                    </resource-ref>
61                  */
62                  DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/sqlserver");
63                  //3、通過DataSource取得一個連接
64                  connSQLServer = ds.getConnection();
65                  out.println("SQLServer Connection pool connected !!");
66                  //4、操作數據庫
67              } catch (NamingException e) {
68                  System.out.println(e.getMessage());
69              } catch (SQLException e) {
70                  e.printStackTrace();
71              } finally {
72                  //5、關閉數據庫,關閉的時候是將連接放回到連接池之中
73                  connSQLServer.close();
74              }
75          %>
76         
77      </body>
78  </html>

 

2.然后,在工程目錄下的WebContent下的.xml文件中,

 

  添加如下代碼:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 3     <display-name>Test_JNDI</display-name>
 4     <welcome-file-list>
 5         <welcome-file>index.html</welcome-file>
 6         <welcome-file>test_jndi.jsp</welcome-file>
 7         <welcome-file>default.htm</welcome-file>
 8         <welcome-file>default.jsp</welcome-file>
 9     </welcome-file-list>
10    <!--MySQL數據庫JNDI數據源引用 -->
11    <resource-ref>
12        <description>MySQL DB Connection</description>
13        <res-ref-name>jdbc/mysql</res-ref-name>
14        <res-type>javax.sql.DataSource</res-type>
15        <res-auth>Container</res-auth>
16    </resource-ref>
17    <!--SQLServer數據庫JNDI數據源引用 -->
18    <resource-ref>
19       <description>sqlserver DB Connection</description>
20        <res-ref-name>jdbc/sqlserver</res-ref-name>
21        <res-type>javax.sql.DataSource</res-type>
22       <res-auth>Container</res-auth>
23     </resource-ref>
24          
25 </web-app>

3.最后,也是最重要,最容易出錯的,就是在tomcat安裝目錄\conf\Catalina\localhost   下創建 Test_JNDI.xml文件(文件名最好和項目名Test_JNDI一樣,不一樣的情況我還沒實驗過)

   (1).可以先在Test_JNDI.xml文件中添加如下代碼,然后在瀏覽器輸入對於URL,驗證是否能訪問項目首頁。

<?xml version="1.0" encoding="UTF-8"?>
 <Context path="/Test_JNDI" docBase="E:/EclipseEE/workspace/Test_JNDI/WebContent" reloadable="true" debug="0" crossContext="true" /> 

 

  注意1:上面這段代碼是不帶標簽體的標簽,跟下面的代碼是不一樣的。具體是<Context  .......   /> 和 <Context  .......   >.....這里是數據源信息</Context >這兩個代碼語法是有區別的,一個是有標簽體的。

  注意2:xml文件中不能出現任何一個中文,不然啟動tomcat會報錯(tomcat報錯 Invalid byte 2 of 2-byte UTF-8 sequence

  注意3:上面這段代碼中的<?xml 前面不能有空格, 否則tomcat報錯(不允許有匹配 "[xX][mM][lL]" 的處理指令目標

 

(2).貼上完整代碼:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2  <Context path="/Test_JNDI" docBase="E:/EclipseEE/workspace/Test_JNDI/WebContent" reloadable="true" debug="0" crossContext="true" > 
 3   <Resource
 4      name="jdbc/mysql"
 5          auth="Container" 
 6          type="javax.sql.DataSource"
 7          maxActive="100" 
 8          maxIdle="30" 
 9          maxWait="10000"
10          username="root" 
11          password="0821"
12          driverClassName="com.mysql.jdbc.Driver"
13          url="jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8"/>
14 
15      <Resource 
16          name="jdbc/sqlserver"
17          auth="Container" 
18          type="javax.sql.DataSource"
19          maxActive="100" 
20          maxIdle="30" 
21          maxWait="10000"
22          username="sa" 
23          password="0821"
24          driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
25          url="jdbc:sqlserver://localhost:1433;DatabaseName=test"/>
26  </Context>

  注意:

   用戶名和密碼設置成你自己電腦的數據庫,test為數據庫。

   name="jdbc/sqlserver" ,名字在所有地方有要保持一致。

   path="/Test_JNDI" 里的名字要設置成和跟這個.xml文件一樣。

運行成功結果:

--------------------------------------------------------------我是可愛的分割線-----------------------------------------------------

本文參考:1.JNDI數據源的配置-孤傲蒼狼

              2.JNDI到底是什么?

             3. Tomcat中主目錄配置與虛擬目錄配置問題

溫馨提示:copy代碼后粘貼到eclipse如果存留行號,可以利用的eclipse的快捷鍵alt+shit+a 將行號批量選中刪除。

原創不易,請注明轉載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM