【发布时间】:2019-06-24 12:16:07
【问题描述】:
我正在使用 JNDI 处理数据库连接。我确信部署是好的。因为当我在下面的 JSP 中测试时,它工作正常。
</head>
<body>
<%
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/airlineticket");
Connection conn = ds.getConnection();
out.println(conn);
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
但是当我使用ConnectionFactory类时,出现错误:ConnectionFactory无法解析。我只是把连接代码放在ConnectionFactory类中,为什么会这样? ConnectionFactory 类:
package com.db;
import javax.naming.*;
import java.sql.*;
import org.apache.tomcat.jdbc.pool.DataSource;
public class ConnectionFactory {
private ConnectionFactory() {};
public static Connection getConnection()
{
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/airlineticket");
return ds.getConnection();
}
catch (NamingException e)
{
System.out.print("connection failed");
return null;
}
catch(SQLException e)
{
e.printStackTrace();
return null;
}
}
}
测试 JSP:
<%@ page language="java" import="java.util.*,com.db.ConnectionFactory" pageEncoding="UTF-8"%>
</head>
<body>
<%
try {
Connection conn = ConnectionFactory.getConnection();
out.println(conn);
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
%>
</body>
</html>
web.xml(/WEB-INF/web.xml):
<resource-ref>
<res-ref-name>jdbc/airlineticket</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
context.xml(/META-INF/context.xml):
<Context>
<Resource name="jdbc/airlineticket"
auth="Container"
type="javax.sql.DataSource"
username="Manager"
password="123456"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mariadb://localhost:3306/airlineticket"
maxActive="50"
masIdle="20"> </Resource>
</Context>
【问题讨论】:
-
你在 JSP 中导入你的类了吗?
-
我在 JSP 中导入 ConnectionFactory 类:
-
你的
ConnectionFactory类真的有包名com.db?您的示例中省略了包名称。 -
这是ConnectionFactory类:包com.db;导入 javax.naming.*;导入java.sql.*;导入 org.apache.tomcat.jdbc.pool.DataSource;公共类 ConnectionFactory { 私有 ConnectionFactory() {};
-
它在容器中工作,因为容器设置了初始工厂。