var cafeListElement = $(".linkbox1");
var searchResult = $("#search-result");
//cafeListElement.append(cafeItem); // AS-IS (요놈이 문제)
searchResult.append(cafeItem); // TO-BE
//이것도 안되고..
<script>
SELECT id, name, address, goodReactionPoint, reviewCount, hashtag, cafeImgUrl1
FROM cafe
<isNotEmpty property="keyword">
WHERE `name` LIKE CONCAT('%', #{keyword}, '%')
OR `address` LIKE CONCAT('%', #{keyword}, '%')
OR `hashtag` LIKE CONCAT('%', #{keyword}, '%')
</isNotEmpty>
GROUP BY id
ORDER BY id DESC
<if test="limitFrom >= 0 ">
LIMIT #{limitFrom}, #{limitTake}
</if>
</script>
//이것도 안돼서 위에 설명대로 개별적인 쿼리로 진행하기로 했고
//그렇게 하니 해결..
<script>
SELECT id, name, address, goodReactionPoint, reviewCount, hashtag, cafeImgUrl1
FROM cafe
<where>
<if test='keyword != null and keyword.equals("") '>
AND (
`name` LIKE CONCAT('%', #{keyword}, '%')
OR `address` LIKE CONCAT('%', #{keyword}, '%')
OR `hashtag` LIKE CONCAT('%', #{keyword}, '%')
)
</if>
</where>
GROUP BY id
ORDER BY id DESC
<if test="limitFrom >= 0 ">
LIMIT #{limitFrom}, #{limitTake}
</if>
</script>
문제의 원인을 드디어 찾음.
script 태그 안에서는 ">" "<" 부등호가 먹히지 않는다!
& gt;(greater than) & lt;(less than)을 사용해야했었다..
// 필터 버튼 클릭 이벤트 핸들러 등록
$(".filterButton").on("click", function(event) {
//keyword는 전역변수선언
keyword = $(this).find(".text-wrapper").text(); // 클릭한 버튼의 text-wrapper에서 키워드 추출
// 필터링된 카페 목록을 요청하는 함수 호출
loadFilteredCafes(keyword, currentPage);
});
// 페이지 이동 버튼 클릭 이벤트 핸들러
$('.pagination').on('click', 'a', function(event) {
var targetPage = parseInt($(this).attr('href').split('=')[1]); // 클릭한 페이지 번호
// 필터링된 카페 목록을 요청하는 함수 호출
loadFilteredCafes(keyword, targetPage);
});
function loadFilteredCafes(keyword, page){
$.ajax({
url: "/usr/findcafe/filterCafes", // 실제 Ajax 요청을 처리할 URL
type: "POST", // POST 요청으로 변경
contentType: "application/json", // JSON 형식으로 데이터 전송
data: JSON.stringify({
keyword: keyword, // 키워드를 JSON 형식으로 전송
page: page // 페이지 번호도 함께 전송
}), // 키워드를 JSON 형식으로 서버로 전송
success: function(dataMap) {
// Ajax 요청 성공 시 처리
console.log("Filtered cafes:", dataMap.cafesCurrentList); // 받은 응답을 콘솔에 출력
alert("카페 전체 리스트 : " + dataMap.cafesTotalCount + "\n현재page 노출 카페 리스트 : " + dataMap.cafesCurrentList.length);
// 받은 응답을 사용하여 카페 목록을 업데이트하거나 화면에 출력하는 등의 작업 수행
totalPages = Math.ceil(dataMap.cafesTotalCount / 5); // 전체 페이지 수 계산
updatePagination(page, totalPages); // 페이지네이션 업데이트
updateCafeList(dataMap.cafesCurrentList); // 카페 목록 업데이트
},
error: function(xhr, status, error) {
// Ajax 요청 실패 시 처리
console.error("Ajax request failed:", status, error);
}
});
// 클릭 이벤트 핸들러를 한 번만 실행하도록 이벤트 핸들러 제거
$(this).off(event);
}
<!-- Ajax 코드 -->
$(document).ready(function() {
var currentPage = 1; // 초기 페이지 번호
var totalPages = 1; // 전체 페이지 수
var keyword = "";
// 필터 버튼 클릭 이벤트 핸들러 등록
$(".filterButton").on("click", function(event) {
//keyword는 전역변수선언
keyword = $(this).find(".text-wrapper").text(); // 클릭한 버튼의 text-wrapper에서 키워드 추출
// 필터링된 카페 목록을 요청하는 함수 호출
loadFilteredCafes(keyword, currentPage);
});
// 페이지 이동 버튼 클릭 이벤트 핸들러
$('.pagination').on('click', 'a', function(event) {
var targetPage = parseInt($(this).attr('href').split('=')[1]); // 클릭한 페이지 번호
// 필터링된 카페 목록을 요청하는 함수 호출
loadFilteredCafes(keyword, targetPage);
});
function loadFilteredCafes(keyword, page){
$.ajax({
url: "/usr/findcafe/filterCafes", // 실제 Ajax 요청을 처리할 URL
type: "POST", // POST 요청으로 변경
contentType: "application/json", // JSON 형식으로 데이터 전송
data: JSON.stringify({
keyword: keyword, // 키워드를 JSON 형식으로 전송
page: page // 페이지 번호도 함께 전송
}), // 키워드를 JSON 형식으로 서버로 전송
success: function(dataMap) {
// Ajax 요청 성공 시 처리
console.log("Filtered cafes:", dataMap.cafesCurrentList); // 받은 응답을 콘솔에 출력
alert("카페 전체 리스트 : " + dataMap.cafesTotalCount + "\n현재page 노출 카페 리스트 : " + dataMap.cafesCurrentList.length);
// 받은 응답을 사용하여 카페 목록을 업데이트하거나 화면에 출력하는 등의 작업 수행
totalPages = Math.ceil(dataMap.cafesTotalCount / 5); // 전체 페이지 수 계산
updatePagination(page, totalPages); // 페이지네이션 업데이트
updateCafeList(dataMap.cafesCurrentList); // 카페 목록 업데이트
},
error: function(xhr, status, error) {
// Ajax 요청 실패 시 처리
console.error("Ajax request failed:", status, error);
}
});
// 클릭 이벤트 핸들러를 한 번만 실행하도록 이벤트 핸들러 제거
$(this).off(event);
}
// 카페 목록을 업데이트하는 함수
function updateCafeList(cafeList) {
// 카페 목록을 표시할 HTML 요소를 가져온다
var cafeListElement = $(".linkbox1");
var searchResult = $("#search-result");
// 이전에 표시된 카페 목록을 초기화
cafeListElement.empty();
// 받은 cafeList를 사용하여 카페 목록을 업데이트
cafeList.forEach( function(cafe) {
// 각 카페에 대한 HTML 요소를 생성하여 cafeListElement에 추가
// alert("카페 id=" + cafe.id); //cafe.id를 가져오는지 alert창으로 확인
var cafeItem = $(`
<div class="cafe-item">
<a href="cafeDetail?id=`+cafe.id+` class="linkbox1">
<div class="content-info-box" style="margin-bottom: 50px">
<div class="cafe-img-box">
<img src="`+cafe.cafeImgUrl1+`" alt="카페 이미지" />
</div>
<div class="name-address">
<div class="cafe-name">`+cafe.name+`</div>
<p class="cafe-address">`+cafe.address+`</p>
</div>
<div class="like-count">
<span class="material-symbols-outlined"> favorite </span>
<div class="like-count-num">`+cafe.goodReactionPoint+`</div>
</div>
<div class="review-count">
<div class="title-review">리뷰</div>
<div class="review-count-num">`+cafe.reviewCount+`</div>
</div>
<div class="show-distance">
<div class="num-km-group">
<div class="km">km</div>
<div class="distance-num">1.8</div>
<!-- 카페와의 거리 추가 -->
</div>
</div>
<div class="hashtag">`+cafe.hashtag+`</div>
</div>
</a>
</div>
`);
//cafeListElement.append(cafeItem); // 5번반복보여준 원인
searchResult.append(cafeItem);
}); // end cafeList.forEach
}
// 페이지네이션 업데이트 함수
function updatePagination(currentPage, totalPages) {
///// 페이지네이션을 표시할 HTML 요소를 가져온다
var paginationElement = $(".pagination");
///// 이전에 표시된 페이지네이션을 초기화
paginationElement.empty();
var paginationHTML = '';
// 페이지 번호 생성
for (var i = 1; i <= totalPages; i++) {
var activeClass = (i === currentPage) ? 'btn-active' : '';
paginationHTML += '<a class="btn btn-circle btn-ghost btn-xs ' + activeClass + '" href="?page=' + i + '">' + i + '</a>';
}
$('.pagination').html(paginationHTML); // 페이지네이션 업데이트
}
});
이제 필터에서 키워드버튼을 클릭하면 Ajax로 해당키워드에 맞는 카페 목록과 그 목록을 한페이지당 5개로 보여주면서 페이지네이션도 업데이트 된다.
