<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
1. 보드리스트 먼저 가서 상단에 코어 립을 쓰겠다고 선언 먼저 해준다.




5.이 부분에 닫ㄴ는 태그 넣어주기



6.이거 주석

<table class="listTable">
<tr>
<th>No</th>
<th>제목</th>
<th>작성자</th>
<th>조회</th>
<th>추천</th>
<th>날짜</th>
</tr>
<c:forEach items="${blist}" var="bv" varStatus="status">
<tr>
<td>${pm.totalCount-((status.index)+(pm.scri.page-1)*pm.scri.perPageNum)}</td>
<td class="title">
<c:forEach var="i" begin="1" end="${bv.level_}" step="1">
<c:if test="${i==bv.level_}">
ㄴ
</c:if>
</c:forEach>
<a href="${pageContext.request.contextPath}/board/boardContents.aws?bidx=${bv.bidx}">${bv.subject}</a></td>
<td>${bv.writer}</td>
<td>${bv.viewcnt}</td>
<td>${bv.recom}</td>
<td>${bv.writeday}</td>
</tr>
</c:forEach>
</table>
<c:forEach items="${blist}" var="bv" varStatus="status">
<c:forEach> 태그: JSTL 반복 태그로, items 속성에 주어진 리스트(blist)의 각 요소를 반복하며, 각 요소를 bv라는 변수로 접근할 수 있게 합니다.
varStatus="status": 현재 반복 상태를 나타내는 status 객체를 생성합니다. 이를 통해 반복 횟수나 인덱스 정보를 가져올 수 있습니다
<td>${pm.totalCount-((status.index)+(pm.scri.page-1)*pm.scri.perPageNum)}</td>
<td class="title">
<c:forEach var="i" begin="1" end="${bv.level_}" step="1">
<c:if test="${i==bv.level_}">
ㄴ
</c:if>
</c:forEach>
<a href="${pageContext.request.contextPath}/board/boardContents.aws?bidx=${bv.bidx}">${bv.subject}</a>
</td>
제목 안쪽의 <c:forEach> 태그: bv.level의 값만큼 반복하며, 들여쓰기를 추가합니다. (반복할 때마다 로 공백 추가)
<c:if> 태그: 조건에 따라 특정 내용을 출력합니다. 여기서는 i가 bv.level_과 같을 때 ㄴ 기호를 출력해 제목을 트리 형태로 표현하는 역할을 합니다.
<a href="..."> 태그: 제목을 클릭하면 게시물의 상세 페이지로 이동합니다. ${bv.bidx}는 각 게시물의 고유 ID입니다.
<td>${bv.writer}</td>
<td>${bv.viewcnt}</td>
<td>${bv.recom}</td>
<td>${bv.writeday}</td>
각 셀에 bv 객체의 속성값을 표시합니다.
${bv.writer} : 작성자 이름
${bv.viewcnt} : 조회수
${bv.recom} : 추천수
${bv.writeday} : 작성일
이렇게 테이블을 통해 각 게시물의 정보가 정렬된 형태로 출력됩니다. blist 리스트에 있는 모든 게시물이 forEach를 통해 반복되어 출력되며, 제목 앞의 ㄴ 기호와 공백은 게시물 계층 구조를 시각적으로 보여줍니다.

페이지 부분 수정 했어용
<c:set var="queryParam" value="keyword=${pm.scri.keyword}&searchType=${pm.scri.searchType}"></c:set>
<div class="page">
<ul>
<c:if test="${pm.prev == true}">
<li><a href="${pageContext.request.contextPath}/board/boardList.aws?page=${pm.startPage-1}&${queryParam}">◀</a></li>
</c:if>
<c:forEach var="i" begin="${pm.startPage}" end="${pm.endPage}" step="1">
<li <c:if test="${i==pm.scri.page}"> class='on' </c:if> >
<a href="${pageContext.request.contextPath}/board/boardList.aws?page=${i}&${queryParam}">${i}</a>
</li>
</c:forEach>
<c:if test="${pm.next&&pm.endPage>0}">
<li><a href="${pageContext.request.contextPath}/board/boardList.aws?page=${pm.endPage+1}&${queryParam}">▶</a></li>
</c:if>
</ul>
</div>
이 코드는 JSP와 JSTL을 사용해 페이지네이션(페이지 번호)을 표시하는 부분입니다. 각 태그와 표현식을 하나씩 설명해 드리겠습니다.
<c:set var="queryParam" value="keyword=${pm.scri.keyword}&searchType=${pm.scri.searchType}"></c:set>
<c:set>: JSTL에서 변수를 설정하는 태그입니다. 여기서는 queryParam이라는 변수를 만들고, 검색 키워드(keyword)와 검색 유형(searchType)을 포함한 문자열을 설정합니다.
{pm.scri.searchType}: 현재 검색 유형.
이 queryParam은 페이지 번호 이동 시 검색 조건을 유지하기 위해 사용됩니다.
`<c:if test="${pm.prev == true}">
<li><a href="${pageContext.request.contextPath}/board/boardList.aws?page=${pm.startPage-1}&${queryParam}">◀</a></li>
</c:if>`
<c:if>: 조건문으로 pm.prev가 true일 때만 실행됩니다. pm.prev가 true라는 것은 이전 페이지가 존재한다는 의미입니다.
<c:forEach var="i" begin="${pm.startPage}" end="${pm.endPage}" step="1">
<li <c:if test="${i==pm.scri.page}"> class='on' </c:if> >
<a href="${pageContext.request.contextPath}/board/boardList.aws?page=${i}&${queryParam}">${i}</a>
</li>
</c:forEach>
<c:forEach>: pm.startPage에서 pm.endPage까지의 숫자를 반복하며, 각 숫자가 페이지 번호로 출력됩니다.
<c:if test="${pm.next && pm.endPage > 0}">
<li><a href="${pageContext.request.contextPath}/board/boardList.aws?page=${pm.endPage+1}&${queryParam}">▶</a></li>
</c:if>
<c:if test="{pm.next && pm.endPage > 0}">: pm.next가 true이며, pm.endPage가 0보다 클 때 실행됩니다. pm.next가 true라는 것은 다음 페이지가 존재한다는 뜻입니다.{pm.endPage+1}: 현재 페이지의 마지막 페이지 번호에서 1을 더한 페이지 번호로, 다음 페이지 그룹으로 이동할 수 있습니다.