1

私はこの仕事を得るのに苦労しています。データベースに問題なく接続できますが、htmlページを表示させることができません。動作しません。

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();
    }
}

私は次のエラーを受け取ります誰もが理由を知っていますか?:

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.
4

3 に答える 3

1

Tomcatは、サーブレットがパッケージに含まれることを想定しています。あなたのものはデフォルトのパッケージに入っているようです。1つ追加して再コンパイルしてください。そうすれば、物事はうまくいくと思います。

Tomcat 6および7は、サーバーの/libディレクトリーでJDBCJARを検出することを想定しています。PostgreSQLJDBCJARをサーバーの/libの場所に追加します。

于 2012-04-21T01:33:35.897 に答える
1

私は次のエラーを受け取ります誰もが理由を知っていますか?

そのエラー本体が表示される理由は、のハンドラーが元の例外スタックトレースを破棄してClassNotFoundExceptionいるためです。元の例外のメッセージをに書き込んでいますが、(明らかに)通常のシステムログには記録されません。(Tomcatの構成/起動方法によっては、「catalina.out」ファイルにメッセージが含まれている可能性があります。)System.err

これを行う正しい方法は、例外を連鎖させることです。例えば

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

または、キャッチした時点で明示的にログに記録します。また、明示的にログに記録する場合は、例外メッセージだけでなく、必ず例外をログに記録してください。


元の例外スタックトレースが表示されない限り、問題の実際の根本原因を特定することはできません...しかし、最も可能性の高い2つの原因は次のとおりです。

  • クラスローダーは、必要なクラスを見つけることができません。たとえば、JARファイルが適切な場所にないためです。
  • ロードしようとしているクラスの初期化中に、一部のクラスのクラスの初期化に失敗しました。
于 2012-04-21T02:46:24.487 に答える
0

次のエラーが示すように、PostgresqlJDBCドライバーをクラスパスに追加しなかったようです。

javax.servlet.ServletException: Class not found Error

起源は次のとおりです。

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

Postgresql JDBCドライバーをダウンロードPROJECT/WEB-INF/libして、フォルダーに入れることができます。

提案

1つの提案、例外処理が間違っている、変更する必要があります

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

throw new ServletException("Class not found Error", e);
于 2012-04-21T01:39:03.213 に答える