2012-06-24 1 views
0

데이터베이스 커넥션이 필요한 서블릿이나 jsp 파일에서 호출 할 수있는 .java 파일에 별도의 데이터베이스 연결 메소드를 작성하려고했습니다. 내 코드 jsp와 서블릿을위한 별도의 데이터베이스 연결 방법

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 클래스를 사용하는 경우이 잘 작동합니다. 나는 이것을 위해 무엇을해야합니까 ??

+0

sendRedirect의 사용을 다시 고려할 수도 있습니다. 예를 들어 http://stackoverflow.com/questions/2047122/requestdispatcher-interface-vs-sendredirect를 참조하십시오. – Sridhar

답변

1

예외가 발생하는 경우를 대비하여 null 값을 반환하십시오. 메서드에서 null 값을 가져 오는 경우 예외를 처리하고 데이터베이스 작업을 수행하지 마십시오.

또한 데이터베이스 논리 (연결, 명령문 실행)를 비즈니스 논리 및 표현과 분리해야합니다. 실제 코드에서이 코드

response.sendRedirect("studentserr.html"); 

은 프레젠테이션 논리이므로 절대로 데이터베이스 논리에 있어서는 안됩니다.

상세 정보 :

0

일부 패키지에 클래스 "ConnectionClass"를 옮겨보십시오. 그런 다음 자바 클래스에서이 패키지를 사용하여 (자바 파일에서 classpath 문제로 보이는) 또는 JSP 또는 서블릿 페이지에서 호출해야합니다. 예 Demo.java에서 으로 필요합니다. pkg1.ConnectionClass obj = new pkg1.ConnectionClass();

데이터베이스 연결 클래스를 싱글 톤으로 설정하는 것이 좋습니다. 따라서 응용 프로그램을 통해 단일 연결 인스턴스 만 만들어지고 공유됩니다.

2

당신이 잘 감당할 수있는 순간에만 예외를 잡아야합니다. 당신은 getConnection() 메쏘드에서 그것들을 현명하게 다룰 수 없으므로 대신에 그것을 던져서 호출자 자신이 처리해야합니다.

그러나 예외가 발생할 경우 오류 페이지를 표시하는 것은 서블릿 컨테이너 자체의 책임입니다.

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

는 당신은 필요한 당신이 ServletException으로 예외를 잡을 수없는, 또는 적어도 다시 throw 결코 그에 따라 코드를 변경해야 다음과 같이 정상적으로 web.xml에서 오류 페이지를 구성합니다.여기

사소한 재 작성의 :

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

그리고 여기 당신의 DAO 클래스를 사용하는 방법입니다 서블릿의 doGet() 또는 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); 
} 

그것은 당신이 어떤 HttpServlet 방법의 throws 절에 SQLException를 추가 할 수 있기 때문에 단순히 ServletException로 슬로우 다시해야합니다. servletcontainer는 오류 페이지를 찾는 동안 SQLException의 랩을 해제합니다.