Forward/Include

34805 ワード

Include


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>
Header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div style="background-color:#00008b; color:white; height:20px; padding:5px;">
SPMS(Simple Project Management System)
</div>
Tail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div style="background-color:#f0fff0; height:20px; padding:5px; margin-top:10px;">
SPMS copyright@2021 bitcamp 
</div>
MemberList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 페이지 지시자 추가. java의 import와 동일 -->
<%@ page import="spms.vo.Member" %>
<%@ page import="java.util.ArrayList" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 목록</title>
</head>
<body>
<jsp:include page="/Header.jsp" />
	<h1>회원 목록</h1>
	<p><a href='add'>신규 회원</a></p>
	<%
		ArrayList<Member> members = 
				(ArrayList<Member>)request.getAttribute("members");
		for(Member member : members){
	%>
		<%=member.getNo() %>,
		<a href='update?no=<%=member.getNo() %>'>
			<%=member.getName() %>
		</a>,
		<%=member.getEmail() %>,
		<%=member.getCreatedDate() %>
		<a href='delete?no=<%=member.getNo() %>'>
			[삭제]
		</a>
		<br/>
	<%
		}
	%>
	<jsp:include page="/Tail.jsp" />
</body>
</html>
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.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import spms.vo.Member;

@SuppressWarnings("serial")
@WebServlet("/member/list")
public class MemberListServlet extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		Connection conn = null;	// MySQL 연결담당
		Statement stmt = null;	// SQL문 담당
		ResultSet rs = null;	// SELECT문의 결과 담당
		
		final String sqlSelect = "SELECT mno,mname,email,cre_date" + "\r\n" +
								"FROM members" + "\r\n" +
								"ORDER BY mno ASC";
		
		ServletContext sc = this.getServletContext();
		String driver = sc.getInitParameter("driver");
		String url = sc.getInitParameter("url");
		String id = sc.getInitParameter("username");
		String pwd = sc.getInitParameter("password");
		
		try {
			// 1) MySQL 제어 객체를 로딩
			Class.forName(driver);
			// 2) MySQL과 연결
			conn = DriverManager.getConnection(url, id, pwd);
			
			stmt = conn.createStatement();
			rs = stmt.executeQuery(sqlSelect);
			
			resp.setContentType("text/html; charset=UTF-8"); // 먼저 호출
			
			/* members테이블의 전체 인원을 저장하기 위해
			 * ArrayList를 사용한다
			 * */
			ArrayList<Member> members = new ArrayList<Member>();
			
			// DB로부터 members테이블의 정보를 가져와서 member객체에 담고
			// member객체를 ArrayList에 차례로 저장한다.
			while(rs.next()) {
				members.add(new Member()
							.setNo(rs.getInt("mno"))
							.setName(rs.getString("mname"))
							.setEmail(rs.getString("email"))
							.setCreatedDate(rs.getDate("cre_date")));
			}
			
			// jsp에 전달하기 위해 request의 공유 공간에 저장한다
			req.setAttribute("members", members);
			
			// jsp로 request를 전달한다
			RequestDispatcher rd = 
					req.getRequestDispatcher("/member/MemberList.jsp");
			rd.include(req, resp);
			/* jsp로 전달(위임)하는 방식 2가지
			 * 1) forward : 제어권을 아예 넘겨준다(네가 알아서 처리해라)
			 * 2) include : 실행할 동안 제어권을 줬다가 처리가 끝나면 다시 넘겨 받는다
			 *              (마지막 확인은 내가 처리한다)
			 * */
			
		}catch(Exception e) {
			//throw new ServletException(e);
			
			req.setAttribute("error", e);
			RequestDispatcher rd = req.getRequestDispatcher("/Error.jsp");
			rd.forward(req, resp);
		}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();
			}
		}
	}
}
結果

Forward


mysqlサーバを閉じて故意にエラーが発生しました.
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>
MemberList.jsp
:catchセクションの変更
}catch(Exception e) {
			//throw new ServletException(e);
			
			req.setAttribute("error", e);
			RequestDispatcher rd = req.getRequestDispatcher("/Error.jsp");
			rd.forward(req, resp);
		}finally {
結果