재밌고 어려운 IT를 이해해보자~!

검색 필터링 [TEAM PROJECT] 본문

코리아IT핀테크과정

검색 필터링 [TEAM PROJECT]

언제나즐거운IT 2024. 2. 2. 04:43

CameraReviewSelectAllPageAction.Java

package controller.board;

import java.io.IOException;
import java.util.ArrayList;

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

import com.google.gson.Gson;

import controller.front.Action;
import controller.front.ActionForward;
import model.board.BoardDAO;
import model.board.BoardDTO;

public class CameraReviewSelectAllPageAction implements Action {

	@Override
	public ActionForward execute(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		ActionForward forward = new ActionForward();

		BoardDAO boardDAO = new BoardDAO();
		BoardDTO boardDTO = new BoardDTO();
		boardDTO.setCategory("리뷰"); // 카테고리 세팅 안하면 오류남! else문으로 가기위한 더미값 입력
		boardDTO.setSearchCondition("");
		ArrayList<BoardDTO> boardDatas = boardDAO.selectAll(boardDTO);
		System.out.println(boardDatas);
		if (boardDatas != null) {
			// Gson 인스턴스 생성
			Gson gson = new Gson();

			// Java 객체를 JSON 문자열로 변환
			String json = gson.toJson(boardDatas);

			// JSP에 JSON 문자열 전달
			request.setAttribute("boardDatasJson", json);
			request.setAttribute("boardDatas", boardDatas);
			forward.setPath("board/cameraReviewSelectAllPage.jsp");
			forward.setRedirect(false);
		} else {
			forward.setPath("error/alertPage.jsp");
		}

		return forward;
	}

}

리스트 객체를 JSP로 넘겨줄땐 JSON 문자열로 변환시켜서 넘겨줘야한다 ... 
따라서 두개의 데이터를 request에 set!

CameraReviewSelectAllPageAction.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"
	import="model.board.*,java.util.ArrayList,com.google.gson.Gson"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="stone"%>

<!DOCTYPE html>
<html>
<head>

<script src="https://code.jquery.com/jquery-3.7.1.min.js"
	integrity="sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="
	crossorigin="anonymous"></script>
<!-- 문자 인코딩 및 메타 정보 설정 -->
<meta charset="UTF-8">
<title>카메라 리뷰 게시판</title>
<meta charset="utf-8" />
<meta name="viewport"
	content="width=device-width, initial-scale=1, user-scalable=no" />

<!-- 외부 CSS 파일 링크 -->
<link rel="stylesheet" href="/chalKag/assets/css/main.css" />
</head>

<body class="is-preload">


<script>
    // Java에서 전송한 데이터를 JavaScript에 할당
    var boardDatas = ${boardDatasJson};

    function onClickFilter() {
        var lowerPrice = parseInt(document.getElementById('minAmount').value, 10);
        var upperPrice = parseInt(document.getElementById('maxAmount').value, 10);
        console.log(lowerPrice);
        console.log(upperPrice);

        // 가격 범위에 따라 boardDatas 필터링
        var filteredData = boardDatas.filter(function (data) {
            var dataPrice = parseInt(data.price, 10);
            console.log(dataPrice);
            return !isNaN(dataPrice) && lowerPrice <= dataPrice && dataPrice <= upperPrice;
        });

        // 기존 테이블 본문 내용 지우기
        var tableBody = document.querySelector('.table-wrapper table tbody');
        tableBody.innerHTML = '';

        // 필터링된 데이터로 테이블 채우기
        filteredData.forEach(function (data) {
            var row = tableBody.insertRow();
            var cell1 = row.insertCell(0);
            var cell2 = row.insertCell(1);
            var cell3 = row.insertCell(2);
            var cell4 = row.insertCell(3);
            var cell5 = row.insertCell(4);
            var cell6 = row.insertCell(5);

            cell1.textContent = data.boardNum;
            var link = document.createElement('a');
            link.href = "/chalKag/cameraReviewSelectOnePage.do?boardNum=" + data.boardNum;
            link.textContent = data.title;
            cell2.appendChild(link);
            cell3.textContent = data.id;
            cell4.textContent = data.boardDate;
            cell5.textContent = data.recommendNum;
            cell6.textContent = data.viewCount;
        });

        // 필터된 데이터가 없을 경우 메시지 표시
        if (filteredData.length === 0) {
            var noDataMessage = document.createElement('p');
            noDataMessage.textContent = 'No data matching the criteria.';
            tableBody.appendChild(noDataMessage);
        }
    }

    document.addEventListener('DOMContentLoaded', function () {
        var filterButton = document.getElementById('filterButton');

        filterButton.addEventListener('click', function () {
            onClickFilter();
        });
    });
</script>

	<!-- 커스텀 태그를 사용하여 네비게이션 포함 -->
	<stone:printNav member='${member}' />

	<!-- 메인 콘텐츠 래퍼 -->
	<div id="main">

		<!-- 카메라 리뷰 게시판 데이터 선택을 위한 폼 -->


		<!-- featured 포스트 섹션 -->
		<div class="post featured">
			<header class="major">
				<h2>
					camera review board
					<!-- <a href="#">camera review board</a> -->
				</h2>
				<br>

				<p>
					Discover the world through lenses! 📷 Welcome to our Camera Review
					Board, <br>where shutterbugs unite to share insights on the
					latest cameras. <br>Dive into detailed reviews, expert
					opinions, and community discussions.
				</p>
			</header>
		</div>

		<hr>
		<!-- 검색 폼 섹션 -->
		<div class="pricefilter">
			<label for="minAmount">최소금액:</label> <input type="text"
				id="minAmount" name="minAmount" placeholder="최소금액을 입력하세요" required>
			<br> <label for="maxAmount">최대금액:</label> <input type="text"
				id="maxAmount" name="maxAmount" placeholder="최대금액을 입력하세요" required>
			<button type="button" name="확정" id="filterButton">확정</button>
		</div>

		<div>

			<select name="serchField" style="width: 40%; display: inline-block;">
				<option value="title">제목</option>
				<option value="content">작성자</option>
				<option value="productName">상품명</option>
				<option value="company">제조사</option>
			</select> <input type="text" name="search"
				style="margin-left: 10px; width: 40%; display: inline-block;"
				placeholder="검색어를 입력해 주세요."> <input type="button"
				value="SERCH" style="margin-left: 10px; width: 15%;"
				onclick="Update.do">
			<!-- <input type="submit" style="margin-left: 10px; width: 15%;" value="검색하기"> -->
		</div>

		<!-- 리뷰 게시판 데이터를 테이블로 표시하는 섹션 -->
		<div class="table-wrapper" style="margin-top: 20px;">
			<table class="alt" style="margin-top: 30px;">
				<thead>
					<tr>
						<th width="10%">boardNum</th>
						<th width="*">title</th>
						<th width="15%">writer</th>
						<th width="15%">boardDate</th>
						<th width="10%">recommend</th>
						<th width="10%">views</th>
					</tr>
				</thead>

				<!-- JSTL forEach를 사용하여 카메라 리뷰 데이터 반복 처리하여 출력-->
				<tbody>
					<!-- 출력할 게시글 정보(boardDatas)가 없을 경우 출력 문구 -->
					<c:if test="${fn:length(boardDatas) <= 0}">
						<tr>
							<td colspan="10" align="center">등록된 글이 없습니다!</td>

						</tr>
					</c:if>
					<!-- 출력할 게시글 정보(boardDatas)가 없을 경우 있을 경우 반복문을 사용하여 전체 목록 출력 -->
					<c:if test="${fn:length(boardDatas) > 0}">
						<c:forEach var="data" items="${boardDatas}">
							<tr>
								<td name="boardNum">${data.boardNum}</td>
								<!-- 게시글 상새 페이지로 연결되는 태그 -->
								<td><a
									href="/chalKag/cameraReviewSelectOnePage.do?boardNum=${data.boardNum}">${data.title}</a></td>
								<td>${data.id}</td>
								<td>${data.boardDate}</td>
								<td>${data.recommendNum}</td>
								<td>${data.viewCount}</td>
							</tr>
						</c:forEach>
					</c:if>
				</tbody>
			</table>
		</div>





		<!-- 페이징을 포함한 푸터 섹션 -->
		<footer>
			<div class="pagination">
				<!--<a href="#" class="previous">Prev</a>-->
				<a href="#" class="page active">1</a> <a href="#" class="page">2</a>
				<a href="#" class="page">3</a> <span class="extra">&hellip;</span> <a
					href="#" class="page">8</a> <a href="#" class="page">9</a> <a
					href="#" class="page">10</a> <a href="#" class="next">Next</a>
			</div>
		</footer>
	</div>

	<!-- 커스텀 태그를 사용하여 저작권 정보 포함 -->
	<stone:copyright />

	<!-- JavaScript 파일 링크 -->
	<script src="/chalKag/assets/js/jquery.min.js"></script>
	<script src="/chalKag/assets/js/jquery.scrollex.min.js"></script>
	<script src="/chalKag/assets/js/jquery.scrolly.min.js"></script>
	<script src="/chalKag/assets/js/browser.min.js"></script>
	<script src="/chalKag/assets/js/breakpoints.min.js"></script>
	<script src="/chalKag/assets/js/util.js"></script>
	<script src="/chalKag/assets/js/main.js"></script>

</body>

</html>

최소금액 최대금액 을 유저로부터 입력받아 확정버튼을 누르면 filter 메서드를 통해
리스트의 각 data들의 price를 확인해서 유저가 입력한 Max Min값의 사이값들만 필터링해서  테이블을 새로 채워준다..

필요한 준비물
import com.google.gson.Gson;
을 위한 gson-2.8.9.jar...
JSP에 JSON 문자열 전달하기위해서 필요하다!

Comments