Tomcat не компилирует класс для JSP
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>Hello World</h1>
<br>
<%
for(String name: DatabaseFacade.getBooks()){
out.println(name + "<br/>");
}
%>
</body>
</html>
Когда класс лежит в default package, получаю:
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: [13] in the jsp file: [/index.jsp] DatabaseFacade cannot be resolved
10: <h1>Hello World</h1>
11: <br>
12: <%
13: for(String name: DatabaseFacade.getBooks()){
14: out.println(name + "<br/>");
15: }
16: %>
Если переложить в пакет с именем (например, test), то волшебным образом начинает ругаться якобы отсутствие драйвера:
java.sql.SQLException: No suitable driver found for jdbc:postgersql://localhost:5432/postgres
Соответственно, импорт пакета в начале добавляю:
<%@ page import="test.DatabaseFacade" %>
База стоит 10-я версия, пинг в норме, вручную все запросы проходят. Tomcat 9, JRE 8. JAR с драйвером базы клал в разные папки (как часто советовали другим) - тоже самое всё...
Код класса на всякий случай:
package test;
import java.util.ArrayList;
import java.util.List;
import java.sql.*;
public class DatabaseFacade {
public static List<String> getBooks(){
List<String> result = new ArrayList<String>();
try(Connection connection =
DriverManager.getConnection("jdbc:postgersql://localhost:5432/postgres", "postgres", "2309")){
Statement statement = connection.createStatement();
ResultSet resultset = statement.executeQuery("SELECT * FROM books.books");
while(resultset.next()){
result.add(resultset.getString("name"));
}
}
catch(SQLException e){
e.printStackTrace();
}
return result;
}
}
UPD: запускаю в Eclipse на Win7; пробовал Томсат 8.5 вместо 9 - всё тоже самое; замена JRE на JDK в настройках проекта также не помогла. Что интересно, на более старом ПО (Eclipse Neon + Java 8 + WinXP/SP3 + Tomcat 7 + PostgreSQL 9.4) абсолютно аналогичные проблемы.
Ответы (1 шт):
В итоге вся эта хрень заработала только после того, как класс был переписан "древним" способом, без автозакрытия ресурсов в блоке try (и это при использовании Java-8 и Tomcat-9 Карл!!!)
public class DatabaseFacade {
public static List<String> getBooks(){
List<String> result = new ArrayList<String>();
Connection connection = null;
Statement statement = null;
ResultSet resultset = null;
try{
Class.forName("org.postgresql.Driver");
connection = DriverManager.getConnection
("jdbc:postgresql://localhost:5432/postgres", "postgres", "2309");
statement = connection.createStatement();
resultset = statement.executeQuery("SELECT * FROM books.books");
while(resultset.next()){
result.add(resultset.getString("name"));
}
}
catch(SQLException | ClassNotFoundException e){
e.printStackTrace();
}
finally{
try {
if(resultset!=null) resultset.close();
} catch (SQLException se) {
se.printStackTrace();
}
try {
if(statement!=null) statement.close();
} catch (SQLException se) {
se.printStackTrace();
}
try {
if(connection!=null) connection.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
return result;
}
}
литературно выражаясь: "Просто нет слов!"