jQuery/Ajax
ajax 통신 (상세한 예시)
have a good time
2021. 11. 11. 17:35
story.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<main class="main">
<section class="container">
<!--전체 리스트 시작-->
<article class="story-list" id="storyList">
<!-- ******** -->
<div class="story-list__item">
<div class="sl__item__header">
<div>
<img class="profile-image" src="#"
onerror="this.src='/images/person.jpeg'" />
</div>
<div>Hello</div>
</div>
<div class="sl__item__img">
<img src="/images/home.jpg" />
</div>
<div class="sl__item__contents">
<div class="sl__item__contents__icon">
<button>
<i class="fas fa-heart active" id="storyLikeIcon-1" onclick="toggleLike()"></i>
</button>
</div>
<span class="like"><b id="storyLikeCount-1">3 </b>likes</span>
<div class="sl__item__contents__content">
<p>안녕하세요</p>
</div>
<div id="storyCommentList-1">
<div class="sl__item__contents__comment" id="storyCommentItem-1"">
<p>
<b>사용자 :</b> 감사합니다.
</p>
<button>
<i class="fas fa-times"></i>
</button>
</div>
</div>
<div class="sl__item__input">
<input type="text" placeholder="댓글 달기..." id="storyCommentInput-1" />
<button type="button" onClick="addComment()">게시</button>
</div>
</div>
</div>
<!-- ******** -->
</article>
</section>
</main>
<script src="/js/story.js"></script>
</body>
</html>
<story.jsp 파일 실행화면>
다음과 같다.
이 경우는 말 그대로, story.jsp 파일에
실제 웹상에 나타날 그림을 지정해준 상태이다.
하지만, story.jsp 화면을 javascript, ajax통신으로 받은 그림들로 채워지도록 한다면,
story.jsp 파일에서
<!--*******--> 사이의 html 내용들을 story.js 파일에 옮긴다.
(getStoryItem()메서드로 옮긴다.)
(이와 더불어 story.js의 storyLoad() 메서드에서 ajax 통신을 하기 때문에 함께 코드 추가)
<story.js 파일>
// (1) 스토리 로드하기
let page = 0;
function storyLoad() {
$.ajax({
url: `/api/image?page=${page}`,
dataType: "json"
}).done(res => {
//console.log(res);
res.data.content.forEach((image)=>{
let storyItem = getStoryItem(image);
$("#storyList").append(storyItem);
});
}).fail(error => {
console.log("오류", error);
});
}
storyLoad();
function getStoryItem(image) {
let item = `<div class="story-list__item">
<div class="sl__item__header">
<div>
<img class="profile-image" src="/upload/${image.user.profileImageUrl}"
onerror="this.src='/images/person.jpeg'" />
</div>
<div>${image.user.username}</div>
</div>
<div class="sl__item__img">
<img src="/upload/${image.postImageUrl}" />
</div>
<div class="sl__item__contents">
<div class="sl__item__contents__icon">
<button>`;
if(image.likeState){
item += `<i class="fas fa-heart active" id="storyLikeIcon-${image.id}" onclick="toggleLike(${image.id})"></i>`;
}else{
item += `<i class="far fa-heart" id="storyLikeIcon-${image.id}" onclick="toggleLike(${image.id})"></i>`;
}
item += `
</button>
</div>
<span class="like"><b id="storyLikeCount-${image.id}">${image.likeCount} </b>likes</span>
<div class="sl__item__contents__content">
<p>${image.caption}</p>
</div>
<div id="storyCommentList-${image.id}">`;
image.comments.forEach((comment)=>{
item +=`<div class="sl__item__contents__comment" id="storyCommentItem-${comment.id}">
<p>
<b>${comment.user.username} :</b> ${comment.content}
</p>`;
if(principalId == comment.user.id){
item += ` <button onclick="deleteComment(${comment.id})">
<i class="fas fa-times"></i>
</button>`;
}
item += `
</div>`;
});
item += `
</div>
<div class="sl__item__input">
<input type="text" placeholder="댓글 달기..." id="storyCommentInput-${image.id}" />
<button type="button" onClick="addComment(${image.id})">게시</button>
</div>
</div>
</div>`;
return item;
}
<story.jsp 파일>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../layout/header.jsp"%>
<main class="main">
<section class="container">
<!--전체 리스트 시작-->
<article class="story-list" id="storyList">
<!--*******-->
<!--******-->
</article>
</section>
</main>
<script src="/js/story.js"></script>
</body>
</html>
이렇게 된다.
즉 sotry.js 에서 storyLoad 메서드로 ajax 통신하고 받게 된 image 들을
let storyItem = getStoryItem(image);
코드로 getStoryItem 메서드에 적용시킨 후,
다시 story.jsp 파일의 id = "storyList" 에다가 그 결과값을 붙여주는 것이다.
참고 자료 : 이지업 강의 사이트 "스프링부트 SNS프로젝트 - 포토그램 만들기"