4. MemberListServlet 클래스를 페이지 컨트롤러로 만들기
이제 프런트 컨트롤러가 준비되었으니 기존의 서블릿을 페이지 컨트롤러로 변경한다. 먼저 spms.servlets.MemberListServlet 클래스를 수정한다.
package spms.servlets;
import java.io.IOException;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import spms.dao.MemberDao;
//프런트 컨트롤러 적용
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
ServletContext sc = this.getServletContext();
//ServletContext에 저장된 DAO 객체 사용
MemberDao memberDao = (MemberDao)sc.getAttribute("memberDao");
//DAO의 selectList() 메서드 반환값을 request에 담기
request.setAttribute("members", memberDao.selectList());
//response.setContentType("text/html; charset=UTF-8");
//JSP로 출력을 위임한다.
//RequestDispatcher rd = request.getRequestDispatcher("/member/MemberList.jsp");
//rd.include(request, response); //인클루딩
//JSP URL 정보 프런트 컨트롤러에게 알리기 위해 ServletRequest 보관소에 저장
request.setAttribute("viewUrl", "/member/MemberList.jsp");
} catch (Exception e) {
throw new ServletException(e);
/*
e.printStackTrace();
request.setAttribute("error", e); //예외 객체를 request에 보관
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response); //포워딩
*/
} finally {}
}
}
응답 데이터의 문자 집합은 프런트 컨트롤러에서 이미 설정하였기 때문에 페이지 컨트롤러에서 다음 코드를 제거한다.
//response.setContentType("text/html; charset=UTF-8");
또한, 화면 출력을 위해 JSP로 실행을 위임하는 것도 프런트 컨트롤러가 처리하기 때문에 다음 코드를 제거한다.
//JSP로 출력을 위임한다.
//RequestDispatcher rd = request.getRequestDispatcher("/member/MemberList.jsp");
//rd.include(request, response); //인클루딩
대신 JSP URL 정보를 프런트 컨트롤러에게 알려주고자 ServletRequest 보관소에 저장한다.
//JSP URL 정보 프런트 컨트롤러에게 알리기 위해 ServletRequest 보관소에 저장
request.setAttribute("viewUrl", "/member/MemberList.jsp");
오류가 발생했을 때 오류 처리 페이지(/Error.jsp)로 실행을 위임하는 작업도 프런트 컨트롤러가 하기 때문에 다음 코드를 제거한다.
/*
e.printStackTrace();
request.setAttribute("error", e); //예외 객체를 request에 보관
RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
rd.forward(request, response); //포워딩
*/
대신 Dao를 실행하다가 오류가 발생한다면, 기존의 오류를 ServletException 객체에 담아서 던지도록 하였다.
throw new ServletException(e);
service() 메서드는 ServletException을 던지도록 선언되어 있기 때문에 기존의 예외 객체를 그냥 던질 수 없다. 그래서 ServletException 객체를 생성한 것이다.
5. 프런트 컨트롤러를 통한 회원 목록 페이지 요청
프런트 컨트롤러와 페이지 컨트롤러가 준비되었으니 실행하기 위해 web06 프로젝트를 톰캣 실행 환경에 추가하고, 기존의 web05 프로젝트는 제거한다. 톰캣 실행 환경에 웹 프로젝트를 배치하는 방법은 https://stbhg5.tistory.com/30 를 참고한다.
웹 브라우저에서 http://localhost:9999/web06/member/list.do 를 요청한다. 다음 그림과 같이 출력될 것이다(그림 1).
- *.do 요청
요청 URL이 .do로 끝나기 때문에, 다음 그림과 같이 DispatcherServlet 클래스가 요청을 받는다. /member/list.do 요청을 처리할 페이지 컨트롤러(MemberListServlet)을 찾아 실행을 위임한다(그림 2).
- 회원 목록 페이지에 있는 링크의 URL에 .do 접미사 붙이기
회원 목록 페이지에 있는 링크들을 보면 아직 예전의 서블릿 URL을 가리키고 있다. 링크의 URL에 .do를 붙인다. 회원 목록 JSP 파일(MemberList.jsp)을 열고 링크의 URL에 .do를 붙인다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>회원 목록2</title>
</head>
<body>
<jsp:include page="/Header.jsp"/>
<h1>회원목록2</h1>
<p><a href='add.do'>신규 회원</a></p>
<c:forEach var="member" items="${members}">
${member.no},
<a href='update.do?no=${member.no}'>${member.name}</a>,
${member.email},
${member.createdDate}
<a href='delete.do?no=${member.no}'>[삭제]</a><br>
</c:forEach>
<jsp:include page="/Tail.jsp"/>
</body>
</html>
이제부터 '신규회원'이나 '변경', '삭제' 링크를 클릭하면 프런트 컨트롤러(DispatcherServlet)에게 요청할 것이다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
79. 페이지 컨트롤러의 진화 (1) (0) | 2022.07.27 |
---|---|
78. 프런트 컨트롤러의 도입 (4) (0) | 2022.07.26 |
76. 프런트 컨트롤러의 도입 (2) (1) | 2022.07.24 |
75. 프런트 컨트롤러의 도입 (1) (0) | 2022.07.21 |
74. 미니 MVC 프레임워크 만들기 도입부 및 환경설정 (0) | 2022.07.20 |
댓글