
myHomeList. jsp
function filteringSort() {
const housingType = $('#boardMyhomeHousingType').val();
const homeSize = $('#boardMyhomeHomeSize').val();
$.ajax({
type: "GET",
url: "/gami/board/board_myhome/filterList.do",
data: {
housingType: housingType,
homeSize: homeSize
},
success: function(html) {
$('.grid-wrapper').html(html); // 게시글 영역만 교체
},
error: function() {
alert('게시글 필터링 실패');
}
});
}
$(document).ready(function() {
$('#boardMyhomeHousingType, #boardMyhomeHomeSize').on('change', function() {
filteringSort();
});
});
controller
// 필터링 적용, 게시글 조각 업데이트
@RequestMapping(value = "/filterList.do", method = RequestMethod.GET)
public void myHomeFilterList(@RequestParam(required = false) String housingType,
@RequestParam(required = false) String homeSize,
HttpServletRequest request,
HttpServletResponse response) throws Exception {
System.out.println("housingType 넘어옴?"+housingType+"homeSize는?"+homeSize);
List<MyhomeDomain> filteredList = myhomeService.filterArticles(housingType, homeSize);
request.setAttribute("myhomeList", filteredList);
// Tiles나 ViewResolver를 거치지 않고 JSP 파일로 직접 포워딩
request.getRequestDispatcher("/WEB-INF/views/board/board_myhome/myHomeListFragment.jsp")
.forward(request, response);
}
request.getRequestDispatcher(String path) : RequestDispatcher객체를 얻는 메서드.
이 객체는 요청request을 다른 jsp에 넘길 수 있게 해준다.
여기서 path는 jsp의 ‘절대 경로’.forward(request, response) : 현재 컨트롤러의 요청과 응답을 그대로 JSP로 넘김.
URL변경이 없기 때문에 클라이언트는 다른 페이지로 이동했다는걸 모름
내부 HTML만 브라우저로 보낸다. ( 부분 업데이트 시 쓰기 좋음)
→ WEB-IN는 외부접근 X, 노출없이 내부에서만 사용하는 용도로 좋다.return "myHomeListFragment” 와 뭐가 다를까?
return : ViewResolver나 Tiles가 처리 - 전체 layout이 붙는다.
현재방식 : 직접 JSP로 보냄 - AJAX 조각 응답에 적합.board.xml
<select id="selectFilterArticlesList" resultMap="MyhomeResultMap">
<![CDATA[
SELECT *
FROM (
SELECT
b.boardMyhomeArticleNo,
b.memberId,
b.boardMyhomeTitle,
b.boardMyhomeContents,
b.boardMyhomeLikes,
b.boardMyhomeViews,
b.boardMyhomeUpdated,
b.boardMyhomeHomeSize,
b.boardMyhomeHousingType,
i.imagefilename,
ROW_NUMBER() OVER (ORDER BY b.boardMyhomeUpdated DESC) AS recNum
FROM boardMyhome b
JOIN image i ON b.boardMyhomeArticleNo = i.articleNo
WHERE i.imagetype = '커버'
]]>
<if test="boardMyhomeHousingType != null and boardMyhomeHousingType != ''">
AND b.boardMyhomeHousingType = #{boardMyhomeHousingType}
</if>
<if test="boardMyhomeHomeSize != null and boardMyhomeHomeSize != ''">
AND b.boardMyhomeHomeSize = #{boardMyhomeHomeSize}
</if>
<![CDATA[
) filtered
]]>
</select>
<![CDATA[ ... ]]> <if>같은 Mybatis 태그를 쓸 때는 거의 필수적!<if> 안 넘어오면 오류 없이 해당 조건이 생략됨.myHomeListFragment.jsp
<div class="grid-container">
<c:choose>
<c:when test="${not empty myhomeList}">
<c:forEach var="article" items="${myhomeList}">
<div class="card">
<!-- 썸네일 -->
<div class="thumbnail">
<c:choose>
<c:when test="${not empty article.boardMyhomeArticleNo}">
<a
href="${contextPath }/board/board_myhome/viewCount.do?boardMyhomeArticleNo=${article.boardMyhomeArticleNo}">
<img
src="${contextPath}/board/board_myhome/myHomeCoverImages.do?articleNo=${article.boardMyhomeArticleNo}&image=${article.imageFileName}"
alt="커버 이미지">
</a>
</c:when>
<c:otherwise>
(이미지 없음)
</c:otherwise>
</c:choose>
</div>
<!-- 게시글 정보 -->
<div class="card-content">
<h3>
<a
href="${contextPath}/board/board_myhome/viewCount.do?boardMyhomeArticleNo=${article.boardMyhomeArticleNo}">
${article.boardMyhomeTitle} </a>
</h3>
<p>작성자: ${article.memberId}</p>
<p>❤️ ${article.boardMyhomeLikes} | 👀${article.boardMyhomeViews} | 💬 ${article.totalReply}</p>
<p>${article.boardMyhomeUpdated}</p>
</div>
</div>
</c:forEach>
</c:when>
<c:otherwise>
<p>해당 조건에 맞는 게시글이 없습니다.</p>
</c:otherwise>
</c:choose>
</div>