반응형

# MVC07_04 Ajax와 JSON 데이터 처리_1

  • 버튼 클릭 시 회원 리스트 보일 수 있도록 작업

## memberList.jsp

<div class="panel-group">
  <div class="panel panel-default">
    <div class="panel-heading">
      <h4 class="panel-title">
        <a data-toggle="collapse" href="#collapse1">Collapsible panel</a>
      </h4>
    </div>
    <div id="collapse1" class="panel-collapse collapse">
      <div class="panel-body">Panel Body</div>
      <div class="panel-footer">Panel Footer</div>
    </div>
  </div>
</div>
  • memberList.jsp에 부트스트랩 적용 및 스크립트로 버튼 클릭 시 리스트 보여질 수 있도록 초기작업.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="kr.bit.model.*" %>    
<%@ page import="java.util.*" %>
<%
     // ArrayList<MemberVO> list=(ArrayList<MemberVO>)request.getAttribute("list");
%>    
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>
<script type="text/javascript">

	$(document).ready(function(){
		<c:if test="${!empty msg}">
			alert("${msg}");
			<c:remove var="msg" scope="session"/>
		</c:if>
	});

	function deleteFn(num) {
		location.href="${ctx}/memberDelete.do?num="+num; // ?num=12
	}
	
	function check() {
		if ($('#user_id').val() == '') {
			alert("아이디를 입력해주세요.");
			return false;
	 	}
		
		if ($('#password').val() == '') {
			alert("비밀번호를 입력해주세요.");
			return false;
		}
		
		return true;
	}
	
	function logout() {
		location.href="<c:url value='/memberLogout.do'/>";
	}
	
	function memberList() {
		// var html = $("#collapse1 .panel-body").html();
		// alert(html);
		
		$.ajax({
			url : "<c:url value='/memberAjaxList.do'/>",	// 서버 요청
			type : "get",
			dataType : "json",
			success : resultHtml,	// 회원 리스트로 받기([{}, {}, {}])
			error : function() {error("error");}
		});
		
		
	}	
	
	function resultHtml(data) {
		var html="<table class='table table-hover'>";
		html+="<tr>";
		html+="<th>번호</th>";
		html+="<th>아이디</th>";
		html+="<th>비밀번호</th>";
		html+="<th>이름</th>";
		html+="<th>나이</th>";
		html+="<th>이메일</th>";
		html+="<th>전화번호</th>";
		html+="<th>삭제</th>";
		html+="</tr>";
		
		// 반복문 처리
		$.each(data, function(index, obj) {
			html+="<tr>";
			html+="<td>" + obj.num + "</td>";
			html+="<td>" + obj.id + "</td>";
			html+="<td>" + obj.pass + "</td>";
			html+="<td>" + obj.name + "</td>";
			html+="<td>" + obj.age + "</td>";
			html+="<td>" + obj.email + "</td>";
			html+="<td>" + obj.phone + "</td>";
			html+="<td>삭제</td>";
			html+="</tr>";
		});
		html+="</table>";
		
		$("#collapse1 .panel-body").html(html);
	}
</script>
</head>
<body>

<div class="container">
	<h2>회원관리 시스템</h2>
	<div class="panel panel-default">
		<div class="panel-heading">
		<c:if test="${sessionScope.userId == null || sessionScope.userId == ''}">
			<form class="form-inline" action="${ctx}/memberLogin.do" method="post">
			    <div class="form-group">
					<label for="user_id">ID:</label>
					<input type="text" class="form-control" id="user_id" name="user_id">
			    </div>
			    <div class="form-group">
					<label for="pwd">Password:</label>
					<input type="password" class="form-control" id="password" name="password">
			    </div>
			    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
			</form>
		</c:if>
		<c:if test="${sessionScope.userId != null && sessionScope.userId != ''}">
			${sessionScope.userName}님 환영합니다.
			<button type="submit" class="btn btn-warning" onclick="logout()" >로그아웃</button>
		</c:if>	
		</div>
	<div class="panel-body">
		<div class="table-responsive">          
			<table class="table table-hover">
			<thead>
				<tr>
					<th>번호</th>
					<th>아이디</th>
					<th>비밀번호</th>
					<th>이름</th>
					<th>나이</th>
					<th>이메일</th>
					<th>전화번호</th>
					<th>삭제</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach var="vo" items="${list}">
				<tr>
		    	    <td>${vo.num}</td>
		    	    <td><a href="${ctx}/memberContent.do?num=${vo.num}">${vo.id}</a></td>
		    	    <td>${vo.pass}</td>
		    	    <td>${vo.name}</td>
		    	    <td>${vo.age}</td>
		    	    <td>${vo.email}</td>
		    	    <td>${vo.phone}</td>
		    	    <c:if test="${sessionScope.userId == vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})"></td>
		    	    </c:if>
		    	    <c:if test="${sessionScope.userId != vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})" disabled="disabled"></td>
		    	    </c:if>
				</tr>    	 
				</c:forEach>
				<tr>
					<td colspan="8" align="right"><input type="button" value="회원가입" class="btn btn-primary" onclick="location.href='${ctx}/memberRegister.do'"/></td>			  
				</tr>
			</tbody>
			</table>
		</div>
	</div>
	<div class="panel-footer">
		회원관리 ERP System(admin@naver.com)
	</div>
	</div>
</div>
<div class="panel-group">
	<div class="panel panel-default">
		<div class="panel-heading">
			<h4 class="panel-title">
				<a data-toggle="collapse" href="#collapse1" onclick="memberList()">회원 리스트 보기</a>
			</h4>
		</div>
		<div id="collapse1" class="panel-collapse collapse">
			<div class="panel-body">
	
			</div>
	    	<div class="panel-footer">Panel Footer</div>
		</div>
	</div>
</div>

</body>
</html>

 

# MVC07_05 Ajax와 JSON 데이터 처리_2

## Ajax 이용한 회원 리스트 불러오기 기능

1. HandlerMapping

  • 위에서 작업한 ajax 관련 memberAjaxList.do 요청 처리위한 코드 추가.
package kr.bit.frontcontroller;

import java.util.HashMap;

import kr.bit.controller.Controller;
import kr.bit.controller.*;

public class HandlerMapping {
  private HashMap<String, Controller> mappings;
  public HandlerMapping() {
	  mappings=new HashMap<String, Controller>();
	  mappings.put("/memberList.do", new MemberListController());
	  mappings.put("/memberInsert.do", new MemberInsertController());
	  mappings.put("/memberRegister.do", new MemberRegisterController());
	  mappings.put("/memberContent.do", new MemberContentController());
	  mappings.put("/memberUpdate.do", new MemberUpdateController());
	  mappings.put("/memberDelete.do", new MemberDeleteController());
	  mappings.put("/memberLogin.do", new MemberLoginController());
	  mappings.put("/memberLogout.do", new MemberLogoutController());
	  mappings.put("/memberDbcheck.do", new MemberDbcheckController());
	  mappings.put("/memberAjaxList.do", new MemberAjaxListController());
  }
  public Controller getController(String key) { // key=>/memberList.do
	  return mappings.get(key);
  }
}

2. MemberAjaxListController 생성

  • 프로젝트 > src > kr.bit.controller 우 클릭 > New > class 클릭 후 MemberAjaxListController 이름으로 생성
  • Gson API 이용 하기위해 mvnrepository 방문하여 필요한 라이브러리 다운로드 (https://mvnrepository.com/artifact/com.google.code.gson/gson), jar 파일 다운로드 후 lib 폴더에 추가.
package kr.bit.controller;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.gson.Gson;

import kr.bit.model.MemberDAO;
import kr.bit.model.MemberVO;

public class MemberAjaxListController implements Controller {

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		MemberDAO dao = new MemberDAO();
		List<MemberVO> list = dao.memberList();
		
		// Gson API 이용 
		Gson g = new Gson();
		String json = g.toJson(list);	// [{}, {}, {}...]
		
		// $.ajax() 에 따른 json으로 응답
		response.setContentType("text/json;charset=euc-kr");
		response.getWriter().print(json);
		
		return null;
	}

}

## Ajax 이용한 회원 삭제 기능

1. memberList.jsp

  • memberList.jsp에 ajax로 가져온 회원리스트에서 삭제 버튼 클릭 시 삭제 기능 될 수 있도록 구현.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="kr.bit.model.*" %>    
<%@ page import="java.util.*" %>
<%
     // ArrayList<MemberVO> list=(ArrayList<MemberVO>)request.getAttribute("list");
%>    
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
<c:set var="ctx" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css'>
<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>
<script src='https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js'></script>
<script type="text/javascript">

	$(document).ready(function(){
		<c:if test="${!empty msg}">
			alert("${msg}");
			<c:remove var="msg" scope="session"/>
		</c:if>
	});

	function deleteFn(num) {
		location.href="${ctx}/memberDelete.do?num="+num; // ?num=12
	}
	
	function check() {
		if ($('#user_id').val() == '') {
			alert("아이디를 입력해주세요.");
			return false;
	 	}
		
		if ($('#password').val() == '') {
			alert("비밀번호를 입력해주세요.");
			return false;
		}
		
		return true;
	}
	
	function logout() {
		location.href="<c:url value='/memberLogout.do'/>";
	}
	
	function memberList() {
		// var html = $("#collapse1 .panel-body").html();
		// alert(html);
		
		$.ajax({
			url : "<c:url value='/memberAjaxList.do'/>",	// 서버 요청
			type : "get",
			dataType : "json",
			success : resultHtml,	// 회원 리스트로 받기([{}, {}, {}])
			error : function() { error("error"); }
		});	
	}	
	
	function resultHtml(data) {
		var html="<table class='table table-hover'>";
		html+="<tr>";
		html+="<th>번호</th>";
		html+="<th>아이디</th>";
		html+="<th>비밀번호</th>";
		html+="<th>이름</th>";
		html+="<th>나이</th>";
		html+="<th>이메일</th>";
		html+="<th>전화번호</th>";
		html+="<th>삭제</th>";
		html+="</tr>";
		
		// 반복문 처리	[{}, {}, {}]
		$.each(data, function(index, obj) {
			html+="<tr>";
			html+="<td>" + obj.num + "</td>";
			html+="<td>" + obj.id + "</td>";
			html+="<td>" + obj.pass + "</td>";
			html+="<td>" + obj.name + "</td>";
			html+="<td>" + obj.age + "</td>";
			html+="<td>" + obj.email + "</td>";
			html+="<td>" + obj.phone + "</td>";
			html+="<td><input type='button' value='삭제' class='btn btn-warning' onclick='delFn(" + obj.num + ")'></td>";
			html+="</tr>";
		});
		html+="</table>";
		
		$("#collapse1 .panel-body").html(html);
	}
	
	function delFn(num) {
		$.ajax({
			url : "<c:url value='/memberAjaxDelete.do'/>",
			type : "get",
			data : {"num" : num},
			success : memberList,
			error : function() { alert("error"); }			
		});
	}
</script>
</head>
<body>

<div class="container">
	<h2>회원관리 시스템</h2>
	<div class="panel panel-default">
		<div class="panel-heading">
		<c:if test="${sessionScope.userId == null || sessionScope.userId == ''}">
			<form class="form-inline" action="${ctx}/memberLogin.do" method="post">
			    <div class="form-group">
					<label for="user_id">ID:</label>
					<input type="text" class="form-control" id="user_id" name="user_id">
			    </div>
			    <div class="form-group">
					<label for="pwd">Password:</label>
					<input type="password" class="form-control" id="password" name="password">
			    </div>
			    <button type="submit" class="btn btn-default" onclick="return check()">로그인</button>
			</form>
		</c:if>
		<c:if test="${sessionScope.userId != null && sessionScope.userId != ''}">
			${sessionScope.userName}님 환영합니다.
			<button type="submit" class="btn btn-warning" onclick="logout()" >로그아웃</button>
		</c:if>	
		</div>
	<div class="panel-body">
		<div class="table-responsive">          
			<table class="table table-hover">
			<thead>
				<tr>
					<th>번호</th>
					<th>아이디</th>
					<th>비밀번호</th>
					<th>이름</th>
					<th>나이</th>
					<th>이메일</th>
					<th>전화번호</th>
					<th>삭제</th>
				</tr>
			</thead>
			<tbody>
				<c:forEach var="vo" items="${list}">
				<tr>
		    	    <td>${vo.num}</td>
		    	    <td><a href="${ctx}/memberContent.do?num=${vo.num}">${vo.id}</a></td>
		    	    <td>${vo.pass}</td>
		    	    <td>${vo.name}</td>
		    	    <td>${vo.age}</td>
		    	    <td>${vo.email}</td>
		    	    <td>${vo.phone}</td>
		    	    <c:if test="${sessionScope.userId == vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})"></td>
		    	    </c:if>
		    	    <c:if test="${sessionScope.userId != vo.id}">
		    	    	<td><input type="button" value="삭제" class="btn btn-warning" onclick="deleteFn(${vo.num})" disabled="disabled"></td>
		    	    </c:if>
				</tr>    	 
				</c:forEach>
				<tr>
					<td colspan="8" align="right"><input type="button" value="회원가입" class="btn btn-primary" onclick="location.href='${ctx}/memberRegister.do'"/></td>			  
				</tr>
			</tbody>
			</table>
		</div>
	</div>
	<div class="panel-footer">
		회원관리 ERP System(admin@naver.com)
	</div>
	</div>
</div>
<div class="panel-group">
	<div class="panel panel-default">
		<div class="panel-heading">
			<h4 class="panel-title">
				<a data-toggle="collapse" href="#collapse1" onclick="memberList()">회원 리스트 보기</a>
			</h4>
		</div>
		<div id="collapse1" class="panel-collapse collapse">
			<div class="panel-body">
	
			</div>
	    	<div class="panel-footer">Panel Footer</div>
		</div>
	</div>
</div>

</body>
</html>

2. HandlerMapping

package kr.bit.frontcontroller;

import java.util.HashMap;

import kr.bit.controller.Controller;
import kr.bit.controller.*;

public class HandlerMapping {
  private HashMap<String, Controller> mappings;
  public HandlerMapping() {
	  mappings=new HashMap<String, Controller>();
	  mappings.put("/memberList.do", new MemberListController());
	  mappings.put("/memberInsert.do", new MemberInsertController());
	  mappings.put("/memberRegister.do", new MemberRegisterController());
	  mappings.put("/memberContent.do", new MemberContentController());
	  mappings.put("/memberUpdate.do", new MemberUpdateController());
	  mappings.put("/memberDelete.do", new MemberDeleteController());
	  mappings.put("/memberLogin.do", new MemberLoginController());
	  mappings.put("/memberLogout.do", new MemberLogoutController());
	  mappings.put("/memberDbcheck.do", new MemberDbcheckController());
	  mappings.put("/memberAjaxList.do", new MemberAjaxListController());
	  mappings.put("/memberAjaxDelete.do", new MemberAjaxDeleteController());
  }
  public Controller getController(String key) { // key=>/memberList.do
	  return mappings.get(key);
  }
}

3. MemberAjaxDeleteController 생성

package kr.bit.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import kr.bit.model.MemberDAO;

public class MemberAjaxDeleteController implements Controller {

	@Override
	public String requestHandler(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		int num=Integer.parseInt(request.getParameter("num"));
		
		MemberDAO dao=new MemberDAO();
		int cnt=dao.memberDelete(num);
		
		response.getWriter().print(cnt);
		
		return null;
	}

}

 

# MVC07_06 Ajax와 JSON

## ajax로 회원 리스트 출력 시

  • MemberAjaxListController에서 list에 담긴 회원리스트를 Gson 라이브러리를 이용해서 arrayList 를 json형태로 변형. 해당 데이터는 아래와 같은 형식으로 되어있다.
[{"num" : 1, "id" : aaa, "pass" : 1234}, {"num" : 2, "id" : bbb, "pass" : 1212}]

위 데이터를 ajax를 이용하여 memberList.jsp 에 가져와서 $.each (key 값 이용해서 데이터 보여줌)를 이용해서 보여준다.

반응형

+ Recent posts