본문 바로가기

Application/JSP Server

[JSP 프로젝트] 주소록 프로그램 (4) - 컨트롤러 설계 및 오류 페이지 구현

반응형

1. 컨트롤러 설계

MVC 패턴에서 JSP와 빈즈 클래스 중간에 위치해 데이터 전달과 비즈니스 로직 호출을 담당

-> 일반적으로 스프링 프레임워크스트러츠 프레임워크 이용

 

프론트 컨트롤러:프레임워크를 사용해 모든 사용자 요청을 가로채서 프레임 워크 기반 서비스를 제공하는 컨트롤러

 

각각의 사용자 요청에 따라

개별적으로 자바 클래스로 컨트롤러를 구현하거나 하나의 컨트롤러에서 여러 요청을 메서드 단위로 구현해 처리

-> 여기서는 JSP 파일을 기반으로 하는 간단한 컨트롤러 구조 설계 및 구현

 

addrbook_control.jsp는 가장 단순한 형태의 컨트롤러로 action 매개변수 값을 참조해 if문을 이용한 구조

-> 자체적으로 화면에 보여주는 내용은 없다.

 

 

addrbook_form.jsp에서 내용을 작성한 후 데이터베이스에 저장하는 과정

-> 컨트롤러에 action이라는 매개변수로 insert 값을 전달하고

-> 컨트롤러는 action 매개변수 값을 검사하고 해당 값에 따른 처리를 수행

-> insert는 AddrBean 클래스의 insertDB() 메서드를 호출하고

-> true가 반환된 경우 addrbook_list.jsp로 포워딩하여 추가된 주소록 목록이 보이도록 한다.

 

(1) addrbook_form.jsp -> action=insert ->addrbook_control.jsp (뷰 컨트롤러)

(2) addrbook_control.jsp -> setXxx() -> AddrBean

(3) addrbook_control.jsp -> insertDB (AddrBook addrbook) -> AddrBook

(4) AddrBook  -> 데이터베이스 저장 -> DB

(5) AddrBook -> true 리턴 -> addrbook_control.jsp

(6) addrbook_control.jsp -> response.sendRedirect() -> addrbook_list.jsp

 

 

-> 만일 컨트롤러가 없으면

-> addrbook_form.jsp -> addrbook_insert.jsp -> addrbook_list.jsp 같이 비즈니스 로직 처리 페이지가 필요하고, addrbook_edit_form을 처리하려면 별도 페이지가 필요하다.

 

addrbook_control.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"  errorPage="addrbook_error.jsp" import="jspbook.addrbook.*, java.util.*"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<% request.setCharacterEncoding("utf-8"); %>

<jsp:useBean id="ab" scope="page" class="jspbook.addrbook.AddrBean"/> 
<jsp:useBean id="addrbook" class="jspbook.addrbook.AddrBook"/>
<jsp:setProperty name="addrbook" property="*"/> 
<% 
	// 컨트롤러 요청 파라미터
	String action = request.getParameter("action");

	// 파라미터에 따른 요청 처리
	// 주소록 목록 요청인 경우

	if(action.equals("list")) {
		
		/* ArrayList<AddrBook> datas = ab.getDBList();
		request.setAttribute("datas", datas);
		pageContext.forward("addrbook_list2.jsp");
	 */
	 }
	// 주소록 등록 요청인 경우
	else if(action.equals("insert")) {		
	/* 	if(ab.insertDB(addrbook)) {
			response.sendRedirect("addrbook_control.jsp?action=list");
		}
		else
			throw new Exception("DB 입력오류");
	 */
	 }
	// 주소록 수정 페이지 요청인 경우
	else if(action.equals("edit")) {
	/* 	AddrBook abook = ab.getDB(addrbook.getAb_id());
		if(!request.getParameter("upasswd").equals("1234")) {
			out.println("<script>alert('비밀번호가 틀렸습니다.!!');history.go(-1);</script>");
		}
		else {
			request.setAttribute("ab",abook);
			pageContext.forward("addrbook_edit_form.jsp");
		}
	 */
	 }
	// 주소록 수정 등록 요청인 경우
	else if(action.equals("update")) {
	/* 		if(ab.updateDB(addrbook)) {
				response.sendRedirect("addrbook_control.jsp?action=list");
			}
			else
				throw new Exception("DB 갱신오류");
	 */
	}
	// 주소록 삭제 요청인 경우
	else if(action.equals("delete")) {
		/* if(ab.deleteDB(addrbook.getAb_id())) {
			response.sendRedirect("addrbook_control.jsp?action=list");
		}
		else
			throw new Exception("DB 삭제 오류");
	}*/
	else {
		/*out.println("<script>alert('action 파라미터를 확인해 주세요!!!')</script>");
	 */
	 }
%>

 

-> action 매개변수 값을 비교해 if, else if 구조로 action에 대한 처리 블록을 만들어 둔 상태

 

오류 페이지 지정 및 한글처리

 

MVC 모델에서 예외적인 상황 제외하고 모든 요청은 컨트롤러를 통한다.

-> JSP 혹은 HTML 파일을 직접 호출 하는 경우가 거의 없고, 대부분 컨트롤러를 걸친다.

 

-> 비즈니스 로직의 처리가 컨트롤러에서 발생하고, 컨트롤러가 오류 처리도 담당한다.

-> page 지시어에 오류 페이지를 지정해 별도의 페이지에서 오류를 처리

-> HTML 폼으로 전달된 한글 처리 부분 추가

 

 

빈즈 초기화

 

(1) 입력 폼을 통해 입력된 데이터를 데이터베이스에 저장하려는 경우 입력한 내용은 우선 컨트롤러로 전달

(2) 컨트롤러에서 입력된 데이터를 자바 객체로 매핑하고 비즈니스 로직 처리를 위한 클래스를 통해 필요한 처리 수행

(3) 주소록 매핑을 위한 addrbook 클래스 및 비즈니스 로직 처리를 위한 AddrBean 클래스를 모두 초기화

(4) addrbook의 경우 <jsp:setProperty>를 이용해 모든 매개변수를 클래스 내 멤버변수에 대응

(5) HTML 폼에 입력된 데이터는 자동으로 AddrBean 객체로 전달

(6) ad_id와 같은 키 값은 request.getParameter()가 아닌 addrbook 클래스의 getAb_id() 메서드로 참조 가능

(7) 요청에 따른 기능을 구분하기 위해 action 매개변수 이용

 

 

action에 따른 처리 구현

모든 요청이 컨트롤러로 집중되기에 컨트롤러에서 각각의 요청을 구분하고 처리

-> action 매개변수 값을 비교해 각각으 요청을 처리할 수 있도록 구성

 

action 분류

list 주소록 목록 보여주기 AddrBean 클래스의 getDBList 메서드를 통해
DB로부터 가져온 Array<addrbook> 객체를 reqeust_cscope에 저장해 addrbook_list.jsp로 포워딩
insert 주소록 신규 등록 AddrBean 클래스의 insertDB() 메서드를 호출해 성공 후 response.sendRedirect()를 이용해 페이지 전환
edit  선택한 주소록 수정 페이지로 이동 (1) 선택된 주소록의 ab_id 값을 통해 AddrBean 클래스의 getDB()메서드 호출
(2) 수정할 주소록의 데이터를 addrbook 객체로 가져와 사용자가 입력한 비밀번호와 데이터베이스의 비밀번호가 일치여부 확인
(3) 일치할 경우 request scope에 저장하고 수정 페이지로 포워딩
(4) 일치하지 않으면 이전 페이지로 되돌려 보낸다.
update 주소록 수정 처리 수정된 데이터를 데이터베이스에서 갱신하는 부분
(1) AddrBean 클래스의 updateDB() 메서드를 이용해 처리
(2) response.sendRedirect()를 이용해 목록 화면으로 보낸다.
delete 주소록 삭제 처리 주소록 수정 처리 페이지에서 삭제 요청이 들어온 경우
(1) AddrBean 클래스의 deleteDB() 메서드를 이용해 삭제
(2) 주소록 목록 화면으로 이동

 


2. 오류 처리 화면 만들기

주소록 처리하는 데 문제가 발생할 경우 사용자에게 보여줄 오류 페이지 작성

-> 모든 JSP의 page 속성에 errorpage="addrbook_error.jsp" 삽입

 

addrbook_error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<body>
<div align="center">
<H2>주소록 에러</H2>
<HR>
<table cellpadding=5 width=400>
<tr width=100% bgcolor="pink"><td>
주소록 처리중 에러가 발생 했습니다.<BR>
관리자에게 문의해 주세요..<BR>
빠른시일내 복구하겠습니다.
<HR>
에러내용 : <%= exception%>
<HR>

</td>
</tr>
</table>
</div>
</body>
</HTML>

-> page 지시어에 isErrorPage="true"

-> 상세 에러 메시지 출력 : printStackTrace() 이용

반응형