0

データベース接続を必要とするサーブレットまたはjspファイルから呼び出すことができる別のデータベース接続メソッドを.javaファイルに書き込もうとしていました。私のコードは


import java.sql.*;
import java.lang.*;

public class ConnectionClass {

private String username="root";
private String password="passwd";

/* Adjust the above two as per the username
 * password combination of your MySql databse */

public Connection connect()
{
    try
    {
        Class.forName("com.mysql.jdbc.Driver");  
        String url="jdbc:mysql://localhost/schooldatabase";
        Connection con = DriverManager.getConnection(url,username,password);
        return con;
    }

    catch(Exception e)
    {
         response.sendRedirect("studentserr.html");
         out.println(e);
    }        
 }
}

ここで問題となるのは、接続タイプを返すことで、すべてのサーブレット(データベース接続が必要)がそれを使用してさまざまなステートメントを実行できるようにすることです。しかし、私のコードでは、catchブロックで何を返す必要がありますか(データベースへの接続を確立できなかったことを意味します)?また、接続に失敗した場合は、ユーザーを次のページにリダイレクトします。


"studentserr.html"

これは、サーブレットでは使用するが.javaクラスでは使用しない場合は正常に機能します。私はこれのために何をすべきですか?

4

3 に答える 3

2

例外を適切に処理できるまさにその瞬間にのみ、例外をキャッチする必要があります。メソッドでそれらを適切に処理することはできないgetConnection()ため、呼び出し元自体が処理する必要があるように、代わりにスローする必要があります。

ただし、特定の例外が発生した場合にエラー ページを表示するのは、サーブレット コンテナー自体の責任です。通常、エラー ページはweb.xml次のように構成します。

<error-page>
    <exception-type>java.sql.SQLException</exception-type>
    <location>/WEB-INF/errorpages/database.jsp</location>
</error-page>

例外をキャッチしないようにコードを変更するか、少なくとも必要に応じて再スローServletExceptionする必要があるだけです。

ここにマイナーな書き直しがあります:

public class Database {

    private String url = "jdbc:mysql://localhost/schooldatabase";
    private String username = "root";
    private String password = "passwd";

    static {
        try {
            Class.forName("com.mysql.jdbc.Driver"); // You don't need to load it on every single opened connection.
        } catch (ClassNotFoundException) {
            throw new ExceptionInInitializerError("MySQL JDBC driver missing in classpath", e);
        }
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }

}

DAO クラスでの使用方法は次のとおりです。

public List<Student> list() throws SQLException {
    List<Student> students = new ArrayList<Student>();
    Connection connection = null;
    // ...

    try {
        connection = Database.getConnection();
        // ...
    } finally { // Note: no catch block!
        // ...
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }

    return students;
}

そして、サーブレットのdoGet()またはで DAO クラスを使用する方法を次に示しますdoPost()

try {
    List<Student> students = studentDAO.list();
    request.setAttribute("students", students);
    request.getRequestDispatcher("/WEB-INF/students.jsp").forward(request, response);
} catch (SQLException e) {
    throw new ServletException(e);
}

メソッドの句にServletException追加できないという理由だけで、再スローする必要があります。サーブレットコンテナは、エラーページを見つけながらラップを解除します。SQLExceptionthrowsHttpServletSQLException

于 2012-06-25T14:24:56.017 に答える
1

null例外がスローされた場合に値を返します。メソッドから null 値を取得した場合は、例外を処理し、データベース操作を実行しないでください。

また、データベース ロジック (接続、ステートメントの実行) をビジネス ロジックおよびプレゼンテーションから分離することを忘れないでください。実際の方法では、このコード

response.sendRedirect("studentserr.html");

はプレゼンテーション ロジックであるため、データベース ロジックに含めるべきではありません。

より詳しい情報:

于 2012-06-24T06:33:27.383 に答える
0

クラス「ConnectionClass」をいくつかのパッケージに移動してみてください。そして、これを必要とするJavaクラス(Javaファイルのクラスパスの問題と思われる)またはjspまたはサーブレットページでこのパッケージを使用して呼び出します。例 Demo.java では、pkg1.ConnectionClass obj = new pkg1.ConnectionClass (); としてこれが必要です。

データベース接続クラスをシングルトンにすることをお勧めします。そのため、アプリケーション全体で、接続のインスタンスが 1 つだけ作成され、共有されます。

于 2012-06-25T07:17:52.790 に答える