Вопрос по java, connect, postgresql – Соединение PostgreSQL в сервлете Java для получения информации из БД. Ошибка получения

1

У меня трудности с получением этой работы. Я могу подключиться к базе данных без проблем, однако я не могу заставить ее показать мне HTML-страницу. Это не работает.

<code>import java.io.*;
import java.sql.*;
import java.text.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class ShowBedrock extends HttpServlet 
{
    public String getServletInfo()
    {
       return "Servlet connects to PostgreSQL database and displays result of a SELECT";
    }

    private Connection dbcon;  // Connection for scope of ShowBedrock

    // "init" sets up a database connection
    public void init(ServletConfig config) throws ServletException
    {
        String loginUser = "postgres";
        String loginPasswd = "supersecret";
        String loginUrl = "jdbc:postgresql://localhost/bedrock";

        // Load the PostgreSQL driver
        try 
        {
              Class.forName("org.postgresql.Driver");
              dbcon = DriverManager.getConnection(loginUrl, loginUser, loginPasswd);
        }
        catch (ClassNotFoundException ex)
        {
               System.err.println("ClassNotFoundException: " + ex.getMessage());
               throw new ServletException("Class not found Error");
        }
        catch (SQLException ex)
        {
               System.err.println("SQLException: " + ex.getMessage());
        }
    }

    // Use http GET

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
    {
        response.setContentType("text/html");    // Response mime type

        // Output stream to STDOUT
        PrintWriter out = response.getWriter();

        out.println("<HTML><Head><Title>Bedrock</Title></Head>");
        out.println("<Body><H1>Bedrock</H1>");

        try
        {
                // Declare our statement
                Statement statement = dbcon.createStatement();

                String query = "SELECT name, dept, ";
                query +=       "       jobtitle ";
                query +=       "FROM   employee ";

                // Perform the query
                ResultSet rs = statement.executeQuery(query);

                out.println("<table border>");

                // Iterate through each row of rs
                while (rs.next())
                {
                   String m_name = rs.getString("name");
                   String m_dept = rs.getString("dept");
                   String m_jobtitle = rs.getString("jobtitle");
                   out.println("<tr>" + 
                               "<td>" + m_name + "</td>" +
                               "<td>" + m_dept + "</td>" +
                               "<td>" + m_jobtitle + "</td>" +
                               "</tr>");
                }

                out.println("</table></body></html>");
                statement.close();
        }
        catch(Exception ex)
        {
                out.println("<HTML>" +
                            "<Head><Title>" +
                            "Bedrock: Error" +
                            "</Title></Head>\n<Body>" +
                            "<P>SQL error in doGet: " +
                            ex.getMessage() + "</P></Body></HTML>");
                return;
        }
        out.close();
    }
}
</code>

Я получаю следующую ошибку, которую знает любое тело ?:

<code>javax.servlet.ServletException: Class not found Error
    ShowBedrock.init(ShowBedrock.java:42)
    org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
    org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
    org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
    org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
    java.lang.Thread.run(Unknown Source)


note The full stack trace of the root cause is available in the Apache Tomcat/6.0.35 logs.
</code>
Хотя это и не является ответом, у меня есть предложение: не используйте драйвер JDBC PostgreSQL напрямую. Используйте пул соединений, такой как C3P0, proxool и т. Д. На серверах приложений EE он встроен и предоставляется сервером приложений; Я не знаю, так ли это в Tomcat. У вас будет гораздо меньше проблем с потерей ресурсов и издержками соединения, если вы используете пул соединений. Craig Ringer
Не используйтеex.getMessage() ноex.printStackTrace(), Или лучше используйте Log4J или подобную библиотеку для регистрации ваших ошибок. a_horse_with_no_name

Ваш Ответ

3   ответа
0

вы не добавили драйвер Postgresql JDBC в classpath, как показано в следующей ошибке:

javax.servlet.ServletException: Class not found Error

Который происходит из:

throw new ServletException("Class not found Error");

Вы можетескачать Postgresql JDBC драйвер и положить вPROJECT/WEB-INF/lib папка.

Suggestion

Одно предложение, ваша обработка исключений неверна, вы должны изменить

throw new ServletException("Class not found Error");

в

throw new ServletException("Class not found Error", e);
Но это есть в WEB-INF / lib krest
1

что ваш сервлет будет в пакете. Ваш, кажется, находится в пакете по умолчанию; пожалуйста, добавьте один и перекомпилируйте. Могу поспорить, что дела пойдут лучше для вас.

Tomcat 6 и 7 ожидают найти JAR-файлы JDBC в каталоге server / lib. Добавьте ваш JAR-файл JDBC PostgreSQL в расположение сервера / lib.

Рад помочь. Удачи.
Я забыл это сделать, и этот комментарий спас мне жизнь! Спасибо.
Привет, спасибо за ваш ответ. Я попробовал, не сделал трюк, и все мои сервлеты работают в пакете по умолчанию без каких-либо проблем. krest
1

Причина, по которой вы получаете это тело ошибки, состоит в том, что ваш обработчикClassNotFoundException являетсяthrowing away оригинальная трассировка стека исключений. Вы пишете исходное сообщение об исключенииSystem.err но (очевидно) это не войдет в обычные системные журналы. (Возможно, вы найдете сообщение найти в файле «catalina.out» ... в зависимости от того, как настроен / запущен Tomcat.)

Правильный способ сделать это - соединить исключение; например

    throw new ServletException("Class not found Error", e);

или войдите явно в тот момент, когда вы поймаете это. И если вы регистрируете это явно, убедитесь, что вы регистрируете исключение, а не только сообщение об исключении.

Мы не можем сообщить вам истинную причину проблемы, если не увидим исходную трассировку стека исключений ... но две наиболее вероятные причины:

The classloader can't find a class that is needed; e.g. because the JAR file is not in the right place. Class initialization failed for some class during the initialization of the class that you are attempting to load.

Похожие вопросы