【问题标题】:Why JNDI InitialContext can work fine in jsp but not in a class?为什么 JNDI InitialContext 可以在 jsp 中正常工作,但不能在类中工作?
【发布时间】: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>

success connection picture

但是当我使用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() {};
  • 它在容器中工作,因为容器设置了初始工厂。

标签: java jsp tomcat jndi


【解决方案1】:
  • 你能很好地构建应用程序吗?
  • 确保已正确部署类文件。

JSP 将自动重新编译...而 java 文件,我们必须每次都构建和部署,除非您使用的是 JRebel...。

如果您已经这样做了,我希望看到您的完整日志...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-28
    相关资源
    最近更新 更多