0

SQLExceptionが発生した場合にHTMLファイルにリダイレクトする方法を探していました。例を挙げましょう。

私の接続クラスは次のようなものです。

public class DBConection{
    Connection con = null;
    public DBConnection() throws RuntimeException{      
        try {
            Class.forName("org.gjt.mm.mysql.Driver");
            String user = "root";
            String pass = "12345";
            String db = "java";
            con = DriverManager.getConnection("jdbc:mysql://localhost/" + db, user, pass);
        }catch (ClassNotFoundException ex) {
            throw new RuntimeException();
        }catch (SQLException ex) {
            throw new RuntimeException();
        }
    }
}

サーブレットクラスから呼び出しています。

public class ElectionsServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String RETURN_PAGE = "index.jsp";

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        DBConnection con = new DBConnection();
        response.sendRedirect(RETURN_PAGE);
    }
}   

DBConnection中にエラーが発生した場合は、RETURN_PAGEにリダイレクトします。誰か助けてもらえますか?

4

3 に答える 3

2

組み込みのコンテナ管理の例外処理機能を使用するだけです。キャッチされた例外をとして再スローし、エラーページをのように定義する必要がありServletExceptionます。<error-page>web.xml

それに応じて、DBアクセスロジックを変更するだけで済みます。それは正気、安全、そして効率的とはほど遠いです。例外処理も奇妙です。非推奨のMySQLJDBCドライバークラス名を使用しているという事実を考えると、これは完全に古いリソースからリッピングされたようです。

基本的なキックオフの例は次のとおりです。

public final class Database {
    
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String URL = "jdbc:mysql://localhost/java";
    private static final String USER = "root";
    private static final String PASS = "12345";

    static {      
        try {
            Class.forName(DRIVER);
        }
        catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError("The JDBC driver is missing in classpath!", e);
        }
    }

    private Database() {
        // Don't allow construction.
    }

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL, USER, PASS);
    }

}

最後に、サーブレットで次のように使用して処理します。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
    Connection connection = null;
    // ...

    try{
        connection = Database.getConnection();
        // ...
    } 
    catch (SQLException e) {
        throw new ServletException("DB fail!", e);
    }
    finally {
        // ...
        if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
    }
}

(DBジョブをDAOクラスでラップすることをお勧めします。これによりSQLException、がスローされますが、これは別の問題です)

そして、次のようにエラーページを宣言しweb.xmlます。

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

もちろん使用することもできます<location>/index.jsp</location>が、エンドユーザーがそこに戻る理由を完全に混乱させるため、エンドユーザーにとってはあまり友好的ではありません。むしろ、それをdatabase.jspエラーページのリンクとして、次のようなユーザーフレンドリーなものと一緒に配置します

申し訳ありませんが、DBとの通信中に回復不能な問題が発生しました。インデックスページに戻るには、次のリンクをクリックしてください。

参照:

于 2012-04-19T15:51:24.867 に答える
0

質問はすでに回答されていますが、いくつかコメントを追加します。

  • キャッチする必要はなく、インスタンスSQLExceptionClassNotFoundExceptionリハウするだけです。クラスでRuntimeExceptionこの例外が発生したときに何もしないことを計画している場合は、コンストラクターの署名に追加するだけです。これにより、コンパイラーは、コンストラクターの使用時に try-catch ブロックが追加されていることを確認します。DBConnectionthrows
  • throws RuntimeExceptionコンストラクターの署名に追加する必要はありません。RuntimeException非チェック例外です。
于 2012-04-19T15:52:15.907 に答える
-1

メソッドに try-catch ブロックを追加doPostし、try ブロックで例外が発生した場合は、その例外をキャッチして にリダイレクトしRETURN_PAGEます。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
        try{
        DBConnection con = new DBConnection();
        }catch(Exception e){
        response.sendRedirect(RETURN_PAGE);
       }
    }
于 2012-04-19T15:31:13.000 に答える