관리 메뉴

DeseoDeSeo

[Spring] SpringMVC02_비동기방식 본문

spring

[Spring] SpringMVC02_비동기방식

deseodeseo 2023. 9. 13. 09:01

○ 기존의 src > main > webapp > web-inf> view폴더에 있던 파일들을 삭제하고  boardform을 "main.jsp"로 바꿈.

main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ taglib prefix ="c" uri="http://java.sun.com/jsp/jstl/core" %>
	<%@ taglib prefix ="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<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.6.4/jquery.min.js"></script>
<script
	src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
	<div class="container">
		<h2>Spring MVC02</h2>
		<div class="panel panel-default">
			<div class="panel-heading">Board</div>
			<div class="panel-body">
				<table id="boardList" class="table table-bordered table-hover">
				<!-- tr class = success , info , danger, warning, active -->
					<tr class="danger">  
						<td>번호</td>
						<td>제목</td>
						<td>작성자</td>
						<td>작성일</td>
						<td>조회수</td>
					</tr>	
					<tbody id="view">
						<!-- 비동기 방식으로 가져온 게시글을 나오게 할 부분.  -->
						
					</tbody>	
					
					<tr>
						<td colspan="5">
							<button onclick="goForm()" class="btn btn-primary btn-sm"> 글쓰기 </button>
						</td>
					</tr>		
				</table>

			</div>
			
			<!-- 글쓰기 폼 -->
			<div class ="panel-body" id="wform" style="display:none;">
				<form id="frm">         <!--action ="boardInsert.do" method="post"> form 태그는 동기 방식임. --> 
				<table class="table" >
					<tr>
						<td>제목</td>
						<!-- 반드시 name의 이름은 vo의 필드명과 똑같이 해야한다. -->
						<!-- class=form-control사용하면 알아서 크기에 맞춰짐. -->
						<td><input type ="text" name ="title" class ="form-control"></td>
				   </tr>
				   <tr>
					     <td>내용</td>
						<td><textarea class ="form-control" name ="content" rows="7" cols=""></textarea></td>
					</tr>
					<tr>
					     <td>작성자</td>
						<td><input type="text"  name ="writer" class ="form-control"></td>
					</tr>
					
					<tr>
						<td colspan="2" align="center">
							<button class="btn btn-success btn-sm" type="button" onclick="goInsert()">등록</button>
							<button class="btn btn-warning btn-sm" type="reset" id="fclear" >취소</button>
							<button onclick = "goList()" class="btn btn-info btn-sm">목록</button>
							<!-- a태그는 동기방식임. -->
						</td>
					</tr>
				</table>
				</form>
			
			</div>
			

			<div class="panel-footer">스프링게시판-쿨쿨이</div>
		</div>
	</div>
	
	<script type="text/javascript">
		$(document).ready(function(){
			//html이 다 로딩되고나서 아래의 코드를 실행함.
			loadList();
			
		});

	//함수 정의
		function loadList(){
			//비동기방식으로 게시글 리스트 가져오기 기능
			//ajax는 jquery라이브러리안에 있는 라이브러리.
			//jquery => $()
			//ajax안에는 요청url, 어떻게 데이터 받을지, 요청방식 등등 => 객체 형태로 넣어줌.
			//json=> java script object 
			$.ajax({ //객체 표현
				url:"boardList.do",
				type : "get",
				dataType:"json",
				success: makeView, 
				//ajax를 요청한 다음에 성공하면 makeView를 실행함.(콜백함수)요청하고 나중에 끝나고 실행됨.
				error:function(){alert("error");}
				//실패하면 실행할 것..!
			});
		}
	function makeView(data){
		
		var listHtml = "";
		$.each(data, function(index, obj){
			// index는 회차 반복을 위해서 사용. obj는 하나씩 돌면서 데이터를 담음.
			listHtml += "<tr>";
			listHtml += "<td>" + (index+1) + "</td>";
			listHtml += "<td id='t"+ obj.idx +"'>";
			listHtml += "<a href='javascript:goContent(" + obj.idx+ ")'>";
			listHtml += obj.title;			
			listHtml += "</a>";
			listHtml += "</td>";
			
			listHtml += "<td id='w"+ obj.idx +"'>" + obj.writer + "</td>";
			listHtml += "<td>" + obj.indate + "</td>";
			listHtml += "<td>" + obj.count + "</td>";
			listHtml += "</tr>";
			
			// 상세보기 화면
			listHtml += "<tr id='c"+ obj.idx +"' style='display:none'>";
			listHtml += "<td>내용</td>";
			listHtml += "<td colspan='4'>";
			listHtml += "<textarea id='ta" +obj.idx+ "' readonly rows='7' class='form-control'>"; //readonly는 읽기전용.
			listHtml += obj.content;
			listHtml += "</textarea>";
			 
			//수정, 삭제 화면
			listHtml += "<br>";
			listHtml += "<span id='ub"+ obj.idx +"'>";
			listHtml +="<button onclick='goUpdateForm("+obj.idx+ ")' class='btn btn-sm btn-success'>수정화면</button></span> &nbsp;" // non break space 
			listHtml +="<button onclick='goDelete("+ obj.idx +")' class='btn btn-sm btn-warning'>삭제</button> &nbsp;"
			listHtml += "</td>";
			listHtml +="</tr>";
			
		});
		
		$("#view").html(listHtml);
		//서버의 역할은 데이터를 분배하는 역할임. 각 클라이언트의 환경에 맞게 꾸며준다. 
		goList();
	}
	//goForm 함수를 만들어서 view는 감추고 wform은 보이게 하시오.
	function goForm(){
		/*  css바꿈 */
			$("#boardList").css("display","none");
			$("#wform").css("display","block");
	}
	function goList(){
		/*  css바꿈 */
			$("#wform").css("display","none");
			$("#boardList").css("display","block");
	}
	function goInsert(){
		/*  게시글 등록기능-비동기 */
		var fData = $("#frm").serialize();
		/* goInsert를 눌렀을 때 frm 안에 있는 input 태그 값의 title="안녕"&content="반가워" 이런식으로 직렬화 해서 가져오는거임. */
		$.ajax({
			url : "boardInsert.do",
			type : "post",
			data : fData,
			success: loadList,
			error: function(){ alert("error") }
		});
		$("#fclear").trigger("click");
	}
	function goContent(idx){
		//display속성의 값을 가져옴.
		// 안 보이는 상태면 보이게 해줌.
		if($("#c"+ idx).css("display")=="none"){
			$("#c"+ idx).css("display", "table-row");
		}else{
			$("#c"+ idx).css("display","none");
		}
	}
	function goDelete(idx){
		$.ajax({
			url:"boardDelete.do",
			type:"get",
			data:{"idx": idx},
			success:loadList,
			error: function(){alert("error");}
		});
	}
	function goUpdateForm(idx){
		
		$("#ta"+ idx).attr("readonly", false);
		
		var title =$("#t"+ idx).text();
		var newTitle  ="<input id='nt"+ idx +"' value='"+ title +"' type='text' class='form-control'>";
		$("#t"+ idx).html(newTitle);
		
		var writer =$("#w"+ idx).text();
		var newWriter  ="<input id='nw"+idx+"' value='"+ writer +"' type='text' class='form-control'>";
		$("#w"+ idx).html(newWriter);
		
		var newBtn ="<button onclick='goUpdate("+idx+")' class='btn btn-primary btn-sm'>수정</button>";
		$("#ub"+idx).html(newBtn);
		
	}
	function goUpdate(idx){
		var title =$("#nt" + idx).val();
		var content =$("#ta" + idx).val();
		var writer =$("#nw" + idx).val();
		//console.log(title+"/"+ content+"/"+writer);
		//boardUpdate.do로 요청을 통해 게시글을 수정하고 
		// 수정된 게시글 다시 불러와서 적용시키시오.
		$.ajax({
			url:"boardUpdate.do",
			type:"get",
			data:{"idx": idx},
			success:loadList,
			error: function(){alert("error");}
		});
		
	}

	</script>

</body>
</html>

 

글쓰기

 

<button class="btn btn-success btn-sm" type="button" onclick="goInsert()">등록</button>

function goInsert(){
		/*  게시글 등록기능-비동기 */
		var fData = $("#frm").serialize();
		/* goInsert를 눌렀을 때 frm 안에 있는 input 태그 값의 title="안녕"&content="반가워" 이런식으로 직렬화 해서 가져오는거임. */
		$.ajax({
			url : "boardInsert.do",
			type : "post",
			data : fData,
			success: loadList,
			error: function(){ alert("error") }
		});
		$("#fclear").trigger("click");
	}

jQuery :  자바스크립트를 간편하게 사용할 수 있도록 단순화시킨 오픈소스 기반 라이브러리

☑ Ajax 메소드의 종류

   ○ $.ajax( ) : 비동기식 Ajax를 이용하여 HTTP 요청함.

   ○  $.get( ) : HTTP GET 방식으로 요청 후 서버로부터 데이터를 받음.

   ○  $.post( ) : HTTP POST 방식으로 요청 후 서버로부터 데이터를 받음.

   ○  $.getScript( ) : HTTP GET 방식으로 요청 후 서버로부터 받은 JavaScript 파일을 로드하고 실행.

    ○  $.getJSON( ) : HTTP GET 방식으로 요청 후 서버로부터 받은 JSON파일을 로드하고 실행.

    ○  .load( ) : URL로부터 HTML데이터를 받고 jQuery 셀럭터로 선택된 곳에 넣어 줌으로써 동적으로 페이지 내용을 쉽게 교체함.

    ○  $( ) : jQuery에서 선택자 역할을 함. 실제로 사용자가 입력한 ID값을 받아옴.

                 ➜ $(요소선택자).동작함수( ) ;

                        ➤ 요소 선택자를 이용해 원하는 HTML요소를 선택하고 동작함수를 정의하여 선택된 요소에 원하는 동작을 설정.

     ○  console.log( $('bed').html( ) );  ➜ 요소에 접근하기! 

    ○  .val( )는 Value값을 가져오는 메소드.

 

 

○  url : 요청 url

○ type : 요청방식( get, post, put, delete)

○ data: 전달할 파라미터

○ dataType: 서버에서 반환되는 데이터 형식( text, html, xml, json, jsonp, and script )

        - "xml" : XML문서

        - "html" : html을 텍스트 데이터로

        -"script": JavaScript 코드를 텍스트 데이터로 

 

 

BoardController.java
@RequestMapping("/boardInsert.do")
	 public @ResponseBody void boardInsert(Board board) {
		 System.out.println("게시글 작성 기능수행");
		 mapper.boardInsert(board);
	 }

BoardMapper.java
public void boardInsert(Board board);
BoardMapper.xml
	<insert id ="boardInsert" parameterType="kr.spring.entity.Board">
		INSERT INTO BOARD(TITLE, CONTENT, WRITER) VALUES(#{title},#{content},#{writer})
	</insert>

 

$.each(data, function(index, obj)

❑  $.each( )메서드는 object와 배열 모두사용 가능한 일반적인 반복 함수.

❑ 첫번째 매개변수로 배열이나 객체, 두번째 매개변수로 콜백함수를 받음.

    콜백함수의 인자로는 인덱스와 값을 인자로 갖는다.

BoardController.java
package kr.spring.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import kr.spring.entity.Board;
import kr.spring.mapper.BoardMapper;

@Controller // 현재 클래스를 핸들러맵핑이 찾기 위해 컨트롤러로 등록하는 부분.
public class BoardController {

	@Autowired // 자동으로 연결하는 거.
	private BoardMapper mapper;// mybatis한테 JCBC를 실행하라고 요청하는 객체
	 
	@RequestMapping("/")// 요청url로 들어왔을 때 아래 기능을 수행하겠다.
	 public String home(){
		System.out.println("홈 기능 수행"); 
		return "main"; // 다시 접속할 주소를 리다이렉트 방식으로 리턴하는거임. 
	}
	 @RequestMapping("/boardList.do")
	 public @ResponseBody List<Board> boardList() {
		 System.out.println("게시글 전체보기 기능수행");
		 //@responsebody를 넣어야지 비동기방식으로 됨.
		 // 확장성을 위해서 arraylist대신 List를 사용함.
		 List<Board> list = mapper.getLists();
		 return list;
	 }
	 
	 @RequestMapping("/boardInsert.do")
	 public @ResponseBody void boardInsert(Board board) {
		 System.out.println("게시글 작성 기능수행");
		 mapper.boardInsert(board);
	 }
	 @RequestMapping("/boardDelete.do")
	 public @ResponseBody void boardDelete(@RequestParam("idx") int idx) {
		 System.out.println("게시글 삭제 기능수행");
		 mapper.boardDelete(idx);
	 }
	

}