본문 바로가기
👨‍💻 2. 웹개발_Back end/2-4 JSP & Servlet

[JSP & Servlet] 5장 MVC 아키텍처 (2) - 뷰 분리 및 포워딩과 인클루딩

by 달님🌙 2021. 10. 14.
반응형

 

5.4 서블릿에서 뷰 분리하기

 

1. 서블릿에서 뷰 분리하기

 

2. 뷰 분리

 

3. VO 객체 생성 실습 ( _13_MVC_jsp_VO )

 

 

MemberListServlet

package spms.servlets;

import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

import javax.servlet.GenericServlet;
import javax.servlet.RequestDispatcher;
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

import spms.vo.Member;

/**
 * Servlet implementation class MemberListServlet
 */
@WebServlet("/member/list")
public class MemberListServlet extends GenericServlet {
	/**
	 * @see Servlet#service(ServletRequest request, ServletResponse response)
	 */
	@Override
	public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//DB 연결
		Connection conn = null;
		//sql문 
		Statement stmt = null;
		//sql문 결과
		ResultSet rs = null;
		
		String sqlSelect = "SELECT * FROM MEMBERS ORDER BY MNO ASC";
		
		ServletContext sc = this.getServletContext();
		
		//mysql 서버 접속정보
		String driver = sc.getInitParameter("driver");
		String mySqlUrl = sc.getInitParameter("url");
		String id = sc.getInitParameter("username");
		String pwd = sc.getInitParameter("password");
		
		try {
			// 1. MySQL 제어 객체를 로딩
			//DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
			Class.forName(driver);
			// 2. MySQL 연결
			conn = DriverManager.getConnection(mySqlUrl, id, pwd);
			// 3. sql문 객체 생성
			stmt = conn.createStatement();
			// 4. sql 전송 후 결과 값 리턴받기
			rs = stmt.executeQuery(sqlSelect);
			// 5. 결과를 브라우저로 전송
			response.setContentType("text/html;charset=UTF-8");
			ArrayList<Member> members = new ArrayList<Member>();
			
			//DB결과 값을 VO로 담음
			while(rs.next()) {
				members.add(new Member() 
										.setNo(rs.getInt("MNO"))
										.setName(rs.getString("MNAME"))
										.setEmail(rs.getNString("EMAIL"))
										.setCreateDate(rs.getDate("CRE_DATE")));
			}
			
			//request에 회원 목록 데이터 보관
			request.setAttribute("memberList", members);
			
			//JSP로 출력 -> 화면 생성을 jsp로 위임할 때 requestDispatcher 객체 사용
			RequestDispatcher rd = request.getRequestDispatcher(
						"/member/MemberList.jsp"
			);
			rd.include(request, response);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(rs != null) {
					rs.close();
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(stmt != null) {
					stmt.close();
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
			
			try {
				if(conn != null) {
					conn.close();
				}
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

MemberList.jsp

<%@ page import="spms.vo.Member"%>
<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
	<h1>회원 목록</h1>
	<p><a href="add">신규 회원</a></p>
	<%
		//MemberListServlet에서 request.setAttribute로 전달한 결과 값 꺼내쓰기
		ArrayList<Member> members = (ArrayList<Member>)request.getAttribute("memberList");
		for(Member member : members) {
	%>
	<%=member.getNo() %>,
	<a href="update?no=<%=member.getNo()%>"><%=member.getName() %></a>,
	<%=member.getEmail() %>,
	<%=member.getCreateDate() %>
	<a href="delete?no=<%=member.getNo()%>">삭제</a><br>
	<%} %>
	
</body>
</html>

 

실행 결과

 

5.5 포워딩과 인클루딩

 

1. 제어권 위임

 

 

예) MemberListServlet.java 코드에서 include와 forward는 같은 결과를 출력함

//동일한 실행 결과를 가진다.
rd.include(request, response);
rd.forward(request, response);

 

2. 포워딩과 인클루딩 차이

- 포워딩 방식 : 서블릿 A로 돌아가지 않고 바로 서블릿 B가 실행됨

 

3. 포워딩과 인클루딩 실습하기

 

1) 인클루딩 방식 실습

Error.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시스템 오류</title>
</head>
<body>
	<p>요청을 처리하는 중에 문제가 발생하였습니다. 잠시 후에 다시 요청하시기 바랍니다.
	만약 계속해서 이 문제가 발생한다면 시스템 운영팀(사내번호 : 8282)에 연락하기 바랍니다.</p>
</body>
</html>

 

MemberListServlet.java 코드 수정

//작위적인 에러 발생시키기 (MEMBERS -> MEM)
String sqlSelect = "SELECT * FROM MEM ORDER BY MNO ASC";

 // 에러 코드 변경
catch(Exception e) {
	throw new ServletException(e);

 

실행 화면

 

2) 포워딩 방식 실습

MemberListServlet.java 코드 수정

//rd.include(request, response);
			rd.forward(request, response);
		} catch(Exception e) {
			//throw new ServletException(e); // 에러 코드 변경
			
			request.setAttribute("error", e);
			RequestDispatcher rd = request.getRequestDispatcher("/Error.jsp");
			rd.forward(request, response);
		}

 

Error.jsp 파일 수정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	Exception e = (Exception)request.getAttribute("error");
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>시스템 오류</title>
</head>
<body>
	<p>요청을 처리하는 중에 문제가 발생하였습니다. 잠시 후에 다시 요청하시기 바랍니다.
	만약 계속해서 이 문제가 발생한다면 시스템 운영팀(사내번호 : 8282)에 연락하기 바랍니다.</p>
	<p><%=e.getMessage() %></p>
</body>
</html>

 

실행 화면 (다시 제어권이 돌아오지 않음)

 

2) Header, Tail 파일을 이용해서 화면 출력 제어권 위임 실습하기

구조 확인하기

 

MemberListServlet.java 코드 수정

//에러 다시 되돌리기 (MEM -> MEMBERS)
String sqlSelect = "SELECT * FROM MEMBERS ORDER BY MNO ASC";

 

Error.jsp 수정

<%@ page import="spms.vo.Member"%>
<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
	<!-- jsp 인클루딩 : jsp:include/> -->
	<!-- jsp 포워딩 : jsp:forward/> -->
	<jsp:include page="/Header.jsp"/> <!-- 이 부분 추가 -->
	<h1>회원 목록</h1>
	<p><a href="add">신규 회원</a></p>
	<%
		//MemberListServlet에서 request.setAttribute로 전달한 결과 값 꺼내쓰기
		ArrayList<Member> members = (ArrayList<Member>)request.getAttribute("memberList");
		for(Member member : members) {
	%>
	<%=member.getNo() %>,
	<a href="update?no=<%=member.getNo()%>"><%=member.getName() %></a>,
	<%=member.getEmail() %>,
	<%=member.getCreateDate() %>
	<a href="delete?no=<%=member.getNo()%>">삭제</a><br>
	<%} %>
	<jsp:include page="/Tail.jsp"/> <!-- 이 부분 추가 -->
</body>
</html>

 

실행 화면

 

반응형

댓글