zoukankan      html  css  js  c++  java
  • JNDI数据源局部配置(解决Cannot create JDBC driver of class '' for connect URL 'null')

    最开始,我是借鉴 孤傲苍狼的JNDI教程去做的,他讲得很详细,但是坏处也就是因为他讲的太详细。查了很多书,都是建议说不要用全局去配置JNDI,一是要修改tomcat的server.xml,容易破坏tomcat ,其次是那样吃力不讨好。我是建议用局部变量就好的。

    1.步骤一:学习配置JNDI之前,介绍你一定要先掌握tomcat的配置虚拟目录(可以去看Tomcat中主目录配置与虚拟目录配置问题这样的文章,也可以去我的tomcat配置虚拟目录 -思维焦点网易博客找类似的链接)。学习了tomcat的配置虚拟目录后你就知道了为什么要在  tomcat安装目录confCatalinalocalhost   下创建.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-INFlib  里面,结果没问题,可以运行了。网上很多资料和书都没有提到这个,我也不知道什么原因需要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安装目录confCatalinalocalhost   下创建 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 将行号批量选中删除。

    原创不易,请注明转载

  • 相关阅读:
    计算机病毒的认识
    计算机病毒的认识
    围棋知多少
    围棋知多少
    工业相机基础知识(一)
    辨异 —— 逻辑之辨、人文社科观念
    辨异 —— 逻辑之辨、人文社科观念
    telnet 的使用(ping 与 telnet)
    HDU 2437 Jerboas (剪枝搜索)
    设计模式
  • 原文地址:https://www.cnblogs.com/xiezhidong/p/5927542.html
Copyright © 2011-2022 走看看