서블릿 초기화 매개변수는 그 매개변수가 선언된 서블릿에서만 사용될 수 있고 다른 서블릿은 참조할 수 없다. 따라서 JDBC 드라이버와 데이터베이스 연결 정보에 대한 초기화 매개변수를 각 서블릿마다 별도로 설정해야 해서 매우 번거롭고 낭비적이다. 이런 경우 컨텍스트 초기화 매개변수(같은 웹 애플리케이션에 소속된 서블릿들이 공유하는 매개변수)를 사용한다.
web.xml에 컨텍스트 초기화 매개변수를 선언한다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID"
version="3.1">
<display-name>web04</display-name>
<!-- 컨텍스트 초기화 파라미터 -->
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost/studydb</param-value>
</context-param>
<context-param>
<param-name>username</param-name>
<param-value>study</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>study</param-value>
</context-param>
...
</web-app>
MemberUpdateServlet 클래스의 doGet()에서 서블릿 초기화 매개변수를 사용하는 코드를 컨텍스트 초기화 매개변수를 사용하는 코드로 변경한다.
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
try {
//HttpServlet 클래스로부터 상속받은 getServletContext()를 호출하여 ServletContext 객체 준비
ServletContext sc = this.getServletContext();
//getInitParameter()를 호출하면 web.xml에 선언된 컨텍스트 초기화 매개변수 값을 얻음
Class.forName(sc.getInitParameter("driver"));
conn = DriverManager.getConnection(
sc.getInitParameter("url"),
sc.getInitParameter("username"),
sc.getInitParameter("password"));
...
} catch (Exception e) {
throw new ServletException(e);
} finally {
try {if (rs != null) rs.close();} catch(Exception e) {}
try {if (stmt != null) stmt.close();} catch(Exception e) {}
try {if (conn != null) conn.close();} catch(Exception e) {}
}
}
MemberUpdateServlet 클래스의 doPost()에서도 컨텍스트 초기화 매개변수를 사용하는 코드로 변경한다.
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
try {
//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 컨텍스트 초기화 매개변수에서 해당 정보 가져와 처리.
ServletContext sc = this.getServletContext();
Class.forName(sc.getInitParameter("driver"));
conn = DriverManager.getConnection(
sc.getInitParameter("url"),
sc.getInitParameter("username"),
sc.getInitParameter("password"));
...
} catch (Exception e) {
throw new ServletException(e);
} finally {
try {if (stmt != null) stmt.close();} catch(Exception e) {}
try {if (conn != null) conn.close();} catch(Exception e) {}
}
}
톰캣 서버를 재시작 후 회원정보를 등록하면 이전과 똑같이 정상적으로 수행된다. 이렇게 여러 서블릿에서 공통으로 참고하는 값이 있을 경우 컨텍스트 매개변수로 정의하면 web.xml 파일을 좀 더 간결하게 유지할 수 있다. 또한 변경 사항이 발생하더라도 한 번만 변경하면 되기 때문에 유지보수에 편리하다.
MemberListServlet 클래스와 MemberAddServlet 클래스도 컨텍스트 초기화 매개변수를 사용하도록 수정하였고, MemberListServlet 클래스의 슈퍼 클래스를 GenericServlet 클래스에서 HttpServlet 클래스로 교체한 뒤 service()대신 doGet()을 오버라이딩했다. 이후 회원 정보를 삭제하는 서블릿인 MemberDeleteServlet 클래스를 만들었다.
@WebServlet("/member/delete")
public class MemberDeleteServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection conn = null;
Statement stmt = null;
try {
//JDBC 드라이버를 로딩하고 데이터베이스 연결 시 컨텍스트 초기화 매개변수에서 해당 정보 가져와 처리.
ServletContext sc = this.getServletContext();
Class.forName(sc.getInitParameter("driver"));
conn = DriverManager.getConnection(
sc.getInitParameter("url"),
sc.getInitParameter("username"),
sc.getInitParameter("password"));
stmt = conn.createStatement();
stmt.executeUpdate(
"DELETE FROM MEMBERS WHERE MNO=" +
request.getParameter("no"));
response.sendRedirect("list");
} catch (Exception e) {
throw new ServletException(e);
} finally {
try {if (stmt != null) stmt.close();} catch(Exception e) {}
try {if (conn != null) conn.close();} catch(Exception e) {}
}
}
}
MemberListServlet 클래스에서 출력되는 각 항목의 끝에 삭제링크를 추가한 뒤, MemberUpdateServlet 클래스에도 삭제 버튼을 추가하였다.
삭제버튼을 클릭하면 해당 회원 정보가 정상적으로 삭제된다.
회원 상세 정보 페이지에서도 삭제버튼을 클릭하면 해당 회원 정보가 정상적으로 삭제된다.
2개의 데이터가 삭제된 모습이다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
33. 필터 사용하기 (2) (0) | 2022.01.30 |
---|---|
32. 필터 사용하기 (1) (0) | 2022.01.29 |
30. 서블릿 초기화 매개변수 (2) (0) | 2022.01.26 |
29. 서블릿 초기화 매개변수 (1) (0) | 2022.01.25 |
28. 리다이렉트 (0) | 2022.01.24 |
댓글