Witam, mam problem wydawałoby się banalny ale zjadłem już na nim własne zęby. Mam za zadanie stworzyć kontekst aplikacji, by nawiązywała ona połączenie z bazą danych. Podany poniżej kod działa:
public class ConnectionTest {
public static void main(String[] args) throws SQLException, ClassNotFoundException {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection c = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC",
"root",
"Pangeon66#");
Statement s = c.createStatement();
String q = "SELECT * FROM users;";
ResultSet rs = s.executeQuery(q);
String email = null;
String name = null;
while (rs.next()) {
email = rs.getString("email");
name = rs.getString("name");
System.out.println(email + " " + name);
}
if(s != null) s.close();
if(rs != null) rs.close();
if(c != null) c.close();
}
}
I nie ma w tym nic skomplikowanego. Gdy jednak postawiłem sobie wszystko ładnie podzielić tzn.
@WebServlet(name = "TestConnectionServlet", value = "/TestConnectionServlet")
public class TestConnectionServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String q = "SELECT * FROM users;";
try(Connection c = ConnectionProvider.connect();
Statement s = c.createStatement();
ResultSet rs = s.executeQuery(q))
{
PrintWriter p = resp.getWriter();
while (rs.next()) {
p.println(rs.getString("email"));
p.println("::");
p.println(rs.getString("name"));
System.out.println(rs.getString("email"));
System.out.println(rs.getString("name"));
}
} catch (SQLException e) {
req.getRequestDispatcher("error.jsp").forward(req, resp);
e.printStackTrace();
}
}
}
public class ConnectionProvider {
private static DataSource ds;
public static Connection connect() throws SQLException {
return getDSInstance().getConnection();
}
private static DataSource getDSInstance() {
if (ds == null) {
try {
Context ic = new InitialContext();
Context ec = (Context) ic.lookup("java:comp/env");
ds = (DataSource) ec.lookup("jdbc/test");
} catch (NamingException e) {
e.printStackTrace();
}
}
return ds;
}
}
Okazało się, że pojawiły się problemy NullPointerException, brak identyfikacji sterownika. Podany sposób łączenia się z bazą już stosowałem; bez użycia Mavena było okej. Naprawdę nie wiem co w tej konfiguracji jest nie tak, czemu to takie upierdliwe. Brakuje mi pomysłów. Proszę o pomoc, wskazówki. To co jest internecie nie pomogło mi.
WEB.XML
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<resource-ref>
<description>JMTrain Connection</description>
<res-ref-name>jdbc/test</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
CONTEXT.XML
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/test"
auth="Container"
type="javax.sql.DataSource"
initialSize="10"
maxTotal="100"
maxIdle="30"
maxWaitMillis="10000"
username="root"
password="Pangeon66#"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC" />
</Context>
```
[](http://)https://github.com/pangeon/JMTrain