AJAX와 JSON

WebDev/본과정 / / 2021. 5. 17. 10:32

1. 비동기 통신과 동기통신의 차이점은?

1-1. 비동기 통신

: 클라이언트와 서버가 서로 요청(Request) 및 응답(Response)하는 과정이 동시에 일어나지 않는(Asynchronous) 통신기법.

 

1-2. 통기 통신

: 클라이언트와 서버가 서로 요청 및 응답하는 과정이 동시에 일어나는(Synchronous) 통신기법.

 

 

2. xml 과 json 에 대하여 설명하시오.

2-1. xml

: eXtensible Markup Language의 약자로, 마크업 언어기반 문서인 HTML에서 좀 더 확장적인 기능등을 제공하여 태그(Tag)를 이용한 기능구현 및 환경설정등을 할 수 있는 문서.

 

2-2. json

: JavaScript Object Notation의 약자로, 자바스크립트의 기능 중 하나인 객체(Object)의 성질을 이용하여 키 : 값(Key : Value) 관계를 형성하여 데이터를 전달할 수 있어 개발 친화적인 특성을 지닌 개방형 표준 포맷.

 

 

3. list를 ajax로 json으로 출력하시오.

3-1-1. 소스코드 (Controller 객체)

// Ajax를 이용한 게시글 리스트
@GetMapping("/board/ajaxList")
public void ajaxList(Model model) {
	log.info("ajaxList()");
}

 

3-1-2. 소스코드 (JSP)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!DOCTYPE html>
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">

  <title>MyBoard - Ajax List</title>
  
  <script src="//code.jquery.com/jquery-1.11.3.min.js"></script>
  <script src="//code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
  
  <script type="text/javascript">
		function getList() {
			var url = "${pageContext.request.contextPath}/rest/after.json";

			$.ajax({
	            type: 'GET',
	            url: url,
	            cache : false,
	            dataType: 'json',
		        success: function(result) {
					var htmls="";
					
		        	$("#list-table").html("");	

					$("<tr>" , {
						html : "<td>" + "번호" + "</td>"+
							  	"<td>" + "이름" + "</td>"+
								"<td>" + "제목" + "</td>"+
								"<td>" + "날짜" + "</td>"+				
								"<td>" + "히트" + "</td>"
					}).appendTo("#list-table")

					if(result.length < 1){
						htmls.push("등록된 댓글이 없습니다.");
					} else {
		                    $(result).each(function(){			                    			                    
			                    htmls += '<tr>';
			                    htmls += '<td>'+ this.bId + '</td>';
			                    htmls += '<td>'+ this.bName + '</td>';
			                    htmls += '<td>'
			         			for(var i=0; i < this.bIndent; i++) {
			         				htmls += '-'	
			        			}
			                    htmls += '<a href="${pageContext.request.contextPath}/content_view?bId=' + this.bId + '">' + this.bTitle + '</a></td>';
 			                    htmls += '<td>'+ this.bDate + '</td>'; 
			                    htmls += '<td>'+ this.bHit + '</td>';	
			                    htmls += '</tr>';			                    		                   
		                	});

		                	htmls+='<tr>';
		                	htmls+='<td colspan="5"> <a href="${pageContext.request.contextPath}/write_view">글작성</a> </td>';		                	
		                	htmls+='</tr>';                	
					}
					$("#list-table").append(htmls);			
		        }
			});
		}
  </script>
  <script>
		$(document).ready(function(){
			getList();
		});
	</script>	
</head>
<body>
	<table id="list-table" border="1">
	</table>
</body>
</html>

 

3-2. 구현화면

 

 

4. content_view 내 삭제 기능 또한 ajax를 사용하여 구현하시오.

4-1-1. 소스코드 (Controller 객체)

// AJAX를 이용한 게시글 삭제
@RequestMapping(value = "/rest/delete/{bId}", method = RequestMethod.DELETE)
public int restDelete(@PathVariable("bId") int bId) {
	log.info("restDelete");
	return boardService.remove(bId);
}

 

4-1-2. 소스코드 (JSP)

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

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

<script>
function getList() {
	var url = "${pageContext.request.contextPath}/rest/after.json";

	$.ajax({
        type: 'GET',
        url: url,
        cache : false,
        dataType: 'json',
        success: function(result) {
			var htmls="";
			
        	$("#list-table").html("");	

			$("<tr>" , {
				html : "<td>" + "번호" + "</td>"+
						"<td>" + "이름" + "</td>"+
						"<td>" + "제목" + "</td>"+
						"<td>" + "날짜" + "</td>"+				
						"<td>" + "히트" + "</td>"
			}).appendTo("#list-table")

			if(result.length < 1){
				htmls.push("등록된 댓글이 없습니다.");
			} else {
                    $(result).each(function(){			                    			                    
	                    htmls += '<tr>';
	                    htmls += '<td>'+ this.bId + '</td>';
	                    htmls += '<td>'+ this.bName + '</td>';
	                    htmls += '<td>'
	         			for(var i=0; i < this.bIndent; i++) {
	         				htmls += '-'	
	        			}
	                    htmls += '<a href="${pageContext.request.contextPath}/content_view?bId=' + this.bId + '">' + this.bTitle + '</a></td>';
		                    htmls += '<td>'+ this.bDate + '</td>'; 
	                    htmls += '<td>'+ this.bHit + '</td>';	
	                    htmls += '</tr>';			                    		                   
                	});	//each end

                	htmls+='<tr>';
                	htmls+='<td colspan="5"> <a href="${pageContext.request.contextPath}/write_view">글작성</a> </td>';		                	
                	htmls+='</tr>';               	
			}
			$("#list-table").append(htmls);
        }
	});
}
</script>

<script type="text/javascript">
	$(document).ready(function (){
		$('#a-delete').click(function(event){
			event.preventDefault();
			console.log("ajax 호출전"); 
			 
			$.ajax({
			    type : "DELETE",
			    url : "${pageContext.request.contextPath}/rest/delete/" + "${content_view.bId}",
			    data:{"bId":"${content_view.bId}"},
			    success: function (result) {       
			           console.log(result); 
			           getList();               
			    },
			    error: function (e) {
			        console.log(e);
			    }
			})	 
		});
	});	
</script>
</head>
<body>
	<table id="list-table" width="500" cellpadding="0" cellspacing="0" border="1">
		<form action="modify" method="post">
			<input type="hidden" name="bId" value="${content_view.bId}">
			<tr>
				<td> 번호 </td>
				<td> ${content_view.bId} </td>
			</tr>
			<tr>
				<td> 히트 </td>
				<td> ${content_view.bHit} </td>
			</tr>
			<tr>
				<td> 이름 </td>
				<td> <input type="text" name="bName" value="${content_view.bName}"></td>
			</tr>
			<tr>
				<td> 제목 </td>
				<td> <input type="text" name="bTitle" value="${content_view.bTitle}"></td>
			</tr>
			<tr>
				<td> 내용 </td>
				<td> <textarea rows="10" name="bContent" >${content_view.bContent}</textarea></td>
			</tr>
			<tr >
				<td colspan="2">
					<input type="submit" value="수정">&nbsp;&nbsp;
					<a href="list">목록보기</a>&nbsp;&nbsp;
					<a id="a-delete" href="${pageContext.request.contextPath}/rest/delete?bId=${content_view.bId}">삭제</a>&nbsp;&nbsp;
					<a href="reply_view?bId=${content_view.bId}">답변</a>
				</td>
			</tr>
		</form>
	</table>
</body>

 

4-2. 구현화면

 

4-3. 개선사항

  • 게시글이 삭제되고 나서 해당 페이지의 리다이렉트 기능 추가가 필요하다.
  • JSP내 Script에서 일부 기능들의 경로를 재설정해야 한다.