工程名:JavaWeb
第一步:配置server.xml
在Tomcat的server.xml文件中之前添加如下配置信息:
各属性的含义如下:
(1)path:web应用的context路径。catalina将每个URL的起始和context path进行比较,选择合适的web应用处理该请求。特定Host下的context path必须是惟一的。如果context path为空字符串(""),这个context是所属Host的缺省web应用,用来处理不能匹配任何context path的请求。
(2)docBase:该web应用的文档基准目录(Document Base,也称为Context Root),或者是WAR文件的路径。可以使用绝对路径,也可以使用相对于context所属的Host的appBase路径。
(3)debug:与这个Engine关联的Logger记录的调试信息的详细程度。数字越大,输出越详细。如果没有指定,缺省为0。
(4)reloadable:如果希望Catalina监视/WEB-INF/classes/和/WEB-INF/lib下面的类是否发生变化,在发生变化的时候自动重载web application,设为true。这个特征在开发阶段很有用,但也大大增加了服务器的开销。因此,在发布以后,不推荐使用。但是,你可以使用 Manager应用在必要的时候触发应用的重载。
(5)crossContext:如果想在应用内调用ServletContext.getContext()来返回在该虚拟主机上运行的其他web application的request dispatcher,设为true。在安全性很重要的环境中,设为false,使得getContext()总是返回null。缺省值为false。
(6)source:还没弄清楚是什么作用。
各属性的含义如下:
(1)name:指定Resource的JNDI名字。
(2)auth:指定管理Resource的Manager,它有两个可选值:Container和Application。Container表示由容器来创建和管理Resource,Application表示由web应用来创建和管理Resource。
(3)type:指定Resource的Java类名。
(4)maxActive: 池中连接的最大数目。要确保让 MySQL 的最大连接数大于这个值。如果其值为 0,则没有最大数量限制。
(5)maxIdle:池中最大空闲数据库连接数。如果其值为-1,则没有限制。(6)maxWait:等待一个连接变成可用的最长时间,单位是 ms。这个例子中该值为 10 s,如果超时将抛出异常。如果设置为-1,将无限等待。
(7)username 和 password:连接 MySQL 数据库的用户名和口令。
(8)driverClassName:MySQL 数据库的 JDBC 驱动程序的名字,这里的名字是'com.mysql.jdbc.Driver'。
(9)url:JDBC 连接 MySQL 数据库的 url。其中'127.0.0.1'是要连接的数据库服务器的ip,'3306'是数据库服务器端口,'test'是数据库名。参数 autoReconnect=true 确保连接池能够重新连接。如果 8 个小时没有操作,MySQL 管理器会关闭连接。
第二步:配置WEB-INF/lib/web.xml文件
如果web应用访问了有Servlet容器管理的某个JNDI资源,那么必须在web.xml文件中声明对这个JNDI资源的引用。表示资源引用的元素为,以下是声明引用jdbc/BookDB数据源的代码:
DB Connection jdbc/DBCP
javax.sql.DataSource Container
属性说明:
1)description:对所引用的资源的说明。
2)res-ref-name:指定所引用资源的JNDI名字,与元素中的name属性对应。
3)res-type:指定所引用资源的类名,与元素中的type属性对应。
4)res-auth:指定管理所引用资源的Manager,与元素中的auth属性对应。
第三步:Java调用
1 //连接池
2 try{3 Context initContext = newInitialContext();4 Context envContext = (Context)initContext.lookup("java:/comp/env");5 DataSource ds = (DataSource)envContext.lookup("jdbc/DBCP");6 Connection connect =ds.getConnection();7 System.out.println("Success connect Mysql server (DBCP)!");8 res=true;9 } catch(Exception e) {10 System.out.print("error connect Mysql server(DBCP)!");11 e.printStackTrace();12 }
其中第4行中lookup()的参数我是直接复制的,没有修改,还不懂是什么意思。
第5行中lookup()的参数是前两步中设置的JNDI名字。
在程序中遇到了错误:org.apache.tomcat.dbcp.dbcp.BasicDataSource cannot be cast to org.apache.tomcat.jdbc.pool.DataSource
经查是引入的包不对。本项目中正确的包是
1 importjavax.naming.Context;2 importjavax.naming.InitialContext;3 //import org.apache.tomcat.jdbc.pool.DataSource;
5 import javax.sql.DataSource;
比较发现“javax.sql.DataSource”就是第一步中 的type属性,也是第二步中的值。