본문 바로가기

Application/JSP Server

[JSP 프로젝트] 주소록 프로그램 (6) - 세부 기능 구현

반응형

1. 주소록 등록

더보기

(1) addrbook_from.jsp에서 내용을 입력하고 확인 버튼을 눌렀을 때 컨트롤러로 작성된 내용이 전달

(2) 컨트롤러가 addrbook 객체를 만들고 모든 값을 넣는다.

(3) AddrBean 클래스의 insertDB() 메서드를 호출

(1) addrbook_from.jsp 추가

<form name=form1 method=post action=addrbook_control.jsp> <%--폼의 action은 컨트롤러로 설정 --%>
<input type=hidden name="action" value="insert">

-> HTML 폼 값들은 자동으로 전달되지만, action 값은 hidden type으로 지정해야한다.

-> hidden type은 화면에 보이지는 않지만 데이터를 action에 지정된 페이지로 전달

 

컨트롤러에서 action에 insert 값이 전달되었을 때 처리 부분 구현

(2) addrbook_control.jsp 수정

	// 주소록 등록 요청인 경우
	else if(action.equals("insert")) {		
	/if(ab.insertDB(addrbook)) {
			response.sendRedirect("addrbook_control.jsp?action=list");
		}
		else
			throw new Exception("DB 입력오류");
	 
	 }

-> insertDB() 수행 결과에 따른 조건분기

성공시 목록으로, 그외는 예외처리로 오류 처리페이지 출력

 

오류 발생시 디버깅 순서

  1. DB 정상 동작 확인
  2. addrbook 테이블 이름 및 칼럼 이름 화인
  3. 빈즈 클래스내 문자열로 작성된 정보 철자 확인
  4. HTML 폼 요소들의 name 값과 빈즈 클래스 멤버변수 이름 확인
  5. action 매개변수 확인
  6. SQL문 점검

 

2. 주소록 목록 보기

addrbook_list.jsp 직접 호출하는 방법과 컨트롤러를 통해 호출하는 방법

-> addrbook_list.jsp에 화면에 표현할 데이터가 있어서 컨트롤러를 통해 호출하는 것이 바람직하다.

 

하지만 컨트롤러를 통해 호출하는 경우

프로그램 처음 실행할 때 컨트롤에 action=list 매개변수로 직접 URL을 입력해야한다.

-> index.jsp 파일 생성해 실행을 편리하게 하고, 컨트롤러를 통해 목록이 출력될 수 있도록 설정

 

 

(1) index.jsp : 컨트롤러를 통해 목록 화면으로 이동

<%@ page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>

<% pageContext.forward("addrbook_control.jsp?action=list"); %>

-> response.sendRedirect()를 이용하면 url 노출이 되므로

 

(2) addrbook_list.jsp : page 지시어 import 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="addrbook_error.jsp" import="java.util.*, jspbook.addrbook.*"%>

-> ArrayList 및 addrbook 객체를 사용하기위해 해당 클래스의 패키지를 import 구문에 추가

 

(3) addrbook_list.jsp : 빈즈초기화

<jsp:useBean id="datas" scope="request" class="java.util.ArrayList" />

-> request scope에 저장한 ArrayList를 가져오기 위해 <jsp:useBean>액션을 이용

-> ArrayList에는 DB에서 가져온 주소록 전체 목록이 있다.

 

(4) addrbook_list.jsp : 데이터 출력

for문 스크립트릿 처리 주의

		<table border="1">
			<tr><th>번호</th><th>이 름</th><th>전화번호</th><th>생 일</th><th>회 사</th><th>메 모</th></tr>
			<%-- 데이터 연동 --%>
			<%
				for(AddrBook  ab : (ArrayList<AddrBook>)datas) {
			%>
			  <tr>
			   <td><a href="javascript:check(<%=ab.getAb_id()%>)"><%=ab.getAb_id() %></a></td>
				<td><%=ab.getAb_tel() %></td>
				<td><%=ab.getAb_name() %></td>
				<td><%=ab.getAb_birth() %></td>
				<td><%=ab.getAb_comdept() %></td>
				<td><%=ab.getAb_memo() %></td>
			  </tr>
			 <%
				}
			 %>
			 
		</table>

-> 스크립트릿을 이용해 for문을 돌면서 ArrayList에서 addrbook 객체를 하나씩 불러와 getter 메서드를 이용해 출력

-> 번호 부분의 <a href>부분은 주소록 수정을 위해 비밀번호 입력후 컨트톨러로 전달하기 위한 부분 [자바스크립트]

(5) addrbook_list.jsp : 수정 삭제 화면으로 이동하기 위한 자바스크립트

<head>부분에 작성

<script type="text/javascript">
	function check(ab_id) {
		pwd = prompt('수정/삭제 하려면 비밀번호를 넣으세요');
		document.location.href="addrbook_control.jsp?action=edit&ab_id="+ab_id+"&upasswd="+pwd;
	}
</script>

-> check() 함수: ab_id를 인자로 받아옴

-> prompt 명령 : 사용자로 부터 비밀번호를 입력받기 위한 창을 실행해 입력된 내용을 pwd 변수로 가져옴

-> document.location.href 속성 값을 addrbook_control.jsp로 설정하고 해당 페이지로 이동

 

 

action edit 컨트롤러 aciton 코드 값
ab_id 선택한 주소록의 ab_id 컨트롤러에서 해당 주소록의 비밀번호 가져올때 필요한 매개변수
upasswd 사용자가 입력한 비밀번호 컨트롤러에서 사용자 입력 비밀번호와 데이터베이스에 저장된 주소록의 비밀번호 비교

 

 

 


3. 주소록 수정 및 삭제 구현

컨트롤러에서 데이터를 가지고 와서 이를 request scope에 'gb'라는 이름으로 저장한 다음

addrbook_edit_form.jsp로 전달해 출력

 

(1) addrbook_control.jsp : 비밀번호 확인 및 수정 페이지 이동

// 주소록 수정 페이지 요청인 경우
	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");
		}
	 
	 }

request.getParameter("upasswd") -> 사용자가 입력한 비밀번호를 가지고와 관리자 비밀번호와 비교

[문자열 비교이기 때문에 ==가 아닌 equals() 메서드 사용]

 

일치 -> request scope에 addrbook 객체를 넣고 포워딩

 

request scope에 addrbook 객체를 넣고 포워딩

(1) request 범위에 'ab'라는 이름으로 addrbook 객체를 저장

(2) addrbook_edit_form.jsp로 페이지 이동

(3) response.sendRedirect()가 아니라 pasgeContext.forward() 메서드 이용 [속성 값 함께 전달]

 

불일치 -> 자바스크립트의 alert()을 이용해 메시지 출력 후 목록 페이지로 이동

 

addrbook_edit_form.jsp에서 컨트롤러를 통해 전달된 addrbook 객체를 참조

(2) addrbook_edit_form.jsp : page 지시어 import 추가

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="addrbook_error.jsp" import="jspbook.addrbook.*"%>

->addrbook 객체를 사용하기 위해 해당 클래스 패키지들을 import 구문에 추가

 

(3) addrbook_edit_form.jsp : addrbook 객체 참조 부분

<%-- 자바 빈 추가 부분 --%>
<jsp:useBean id="ab" scope="request" class="jspbook.addrbook.AddrBook" />

-> <jsp:useBean> 액션을 이용해 request scope에서 addrbook 객체를 가져온다.

-> 컨트롤러에서 request scope에 저장한 데이터로 addrbook_list.jsp에서 선택한 주소록 내용

 

(4) addrbook_edit_form.jsp : 수정 화면 구성

<table border="1">
  <tr>
    <th>이 름</th>
    <td><input type="text" name="ab_name" value="홍길동<%--<%=ab.getAb_name() %> --%>"></td>
  </tr>
  <tr>
    <th>email</th>
    <td><input type="text" name="ab_email" value="hgd@hh.com<%--<%=ab.getAb_email() %> --%>"></td>
  </tr>
    <tr>
    <th>전화번호</th>
    <td><input type="text" name="ab_tel" value="010-123-1234<%--<%=ab.getAb_tel() %> --%>"></td>
  </tr>
      <tr>
    <th>생 일</th>
    <td><input type="date" name="ab_birth" value="1995-10-02<%--<%=ab.getAb_birth() %> --%>"></td>
  </tr>
  <tr>
    <th>회 사</th>
    <td><input type="text" name="ab_comdept" value="킹콩대학교<%--<%=ab.getAb_comdept() %> --%>"></td>
  </tr>
  <tr>
    <th>메 모</th>
    <td><input type="text" name="ab_memo" value="IT대학<%--<%=ab.getAb_memo() %> --%>"></td>
  </tr>
  <tr>
    <td colspan=2 align=center><input type=submit value="저장"><input type=reset value="취소"><input type="button" value="삭제" onClick="delcheck()"></td>
</tr>
</table>

-> 각각의 데이터 출력은 <input> 태그의 value 속성을 이용

-> 표현식을 이용해 gb.getAb_name()과 같이 데이터 출력

 

데이터 삭제 부분

<tr>
    <td colspan=2 align=center><input type=submit value="저장"><input type=reset value="취소"><input type="button" value="삭제" onClick="delcheck()"></td>
</tr>

-> 데이터 삭제 확인위해 자바스크립트 함수 delcheck()를 호출

 

(5) addrbook_edit_form.jsp :  삭제 확인 자바스크립트

<script type="text/javascript">
	function delcheck() {
		result = confirm("정말로 삭제하시겠습니까 ?");
	
		if(result == true){
			document.form1.action.value="delete";
			document.form1.submit();
		}
		else
			return;
	}
</script>

->confirm : 사용자에게 확인 여부

-> true인 경우 action 매개변수를 delete로 바꾼 뒤 submit

(6) addrbook_control.jsp : action=delete 구현

true -> addrbook_control.jsp의 다음 부분 실행

	// 주소록 삭제 요청인 경우
	else if(action.equals("delete")) {
		if(ab.deleteDB(addrbook.getAb_id())) {
		response.sendRedirect("addrbook_control.jsp?action=list");
		}
		else
			throw new Exception("DB 삭제 오류");
	}

(1) addrbook 객체로 전달된 ab_id 값 인자로 AddrBean의 deleteDB() 메서드를 호출

(2) AddrBean에서 데이터베이스에서 해당 데이터 삭제

(3) 정상 삭제시 addrbook_contorl.jsp?actionlist로 컨트롤러 호출

(4) 컨트롤러가 다시 데이터베이스에서 데이터를 가져와서 addrbook_list.jsp로 이동

 

(7) addrbook_edit_form.jsp : 폼 hidden 속성

<form name=form1 method=post action=addrbook_control.jsp>
<%-- DB연동 후 추가부분 --%>
<input type=hidden name="ab_id" value="<%=ab.getAb_id()%>">
<input type=hidden name="action" value="update">

-> 수정 양식 폼이 컨트롤러로 전달, 이때 필요한 속성인 ab_id와 action을 hidden 매개변수로 전달

-> 기본 action 값은 update, 삭제의 경우 스크립트를 통해 delete로 변경

 

(8) addrbook_control.jsp : action=update 구현

addrbook_edit_form.jsp에서 내용 수정 후 저장을 누르면 addrbook_control.jsp의 다음 부분이 실행

 

	// 주소록 수정 등록 요청인 경우
	else if(action.equals("update")) {
	 		if(ab.updateDB(addrbook)) {
				response.sendRedirect("addrbook_control.jsp?action=list");
			}
			else
				throw new Exception("DB 갱신오류");
	 
	}

(1) addrbook_edit_form.jsp에서 수정한 내용은 AddrBean의 updateDB() 메서드 인자로 전달

(2) 정상적으로 데이터베이스에서 업데이트가 되면 addrbook_control.jsp?action=list로 redirection

(3) 컨트롤러에서 action=list에 대한 처리가 이루어지고 최신 목록 데이터와 함께 addrbook_list.jsp로 이동

 

 

 

MVC 패턴, JSP, 빈즈, 데이터베이스와의 관계

전반적인 웹 애플리케이션 구성

 

반응형