Почему JNDI InitialContext может нормально работать в jsp, но не в классе? - PullRequest
0 голосов
/ 24 июня 2019

Я работаю с подключением к базе данных, используя 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>

1 Ответ

0 голосов
/ 25 июня 2019
  • Можете ли вы правильно построить приложение?
  • Убедитесь, что вы правильно развернули файл класса.

JSP будет перекомпилирован автоматически ... тогда какJava-файлы, мы должны создавать и развертывать каждый раз, пока, если вы не используете JRebel ....

Если вы уже сделали это, я хотел бы увидеть ваши полные журналы ...

...