서비스 프레임워크 설명서 |
이제 위의 sample0.jsp에서 페이지 컨텍스트에 저장한 모델들(query와 srs 애트리뷰트)을 이용하여 검색 결과를 랜더링하는 코드를 추가한다.
1. <%@ page import="com.konantech.ksf.client.CrzClient, 2. … 3. %> 4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 5. <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %> 6. <%@ taglib uri="http://java.konantech.com/jsp/tags/ksf" prefix="ksf" %> 7. <!DOCTYPE html> 8. <html> 9. … 10. <form name="search-form" lass="form-inline" role="form"> 11. <div class="form-group col-md-6"> <%-- 사용자가 입력했던 검색 쿼리를 입력창에 표시한다. --%> 12. <input class="form-control" placeholder="Search" type="text" name="query" value="<c:out value="${query}"/>"/> 13. </div> 14. <button type="submit" class="btn btn-primary">검색</button> 15. </form> 16. … 17. <div class="col-md-9"> <%-- 검색을 수행했을 경우 --%> 18. <c:if test="${not empty srs}"> 19. <c:choose> <%-- 검색 결과가 없을 경우 --%> 20. <c:when test="${srs.totalCount == 0}"> 21. <div> 22. <strong>"<a><c:out value="${sq.query}"/></a>" 에 대한 검색결과가 없습니다. </strong> 23. </div> 24. </c:when> <%-- 검색 결과가 있을 경우 --%> 25. <c:otherwise> 26. <div> 27. <strong>"<a><c:out value="${sq.query}"/></a>" 에 대한 검색결과</strong> 28. <small>총 <fmt:formatNumber value="${srs.totalCount}" groupingUsed="true"/>건</small> 29. </div> 30. <hr/> 31. <dl> <%-- 검색 결과를 루프를 돌며 표시한다. --%> 32. <c: forEach var="row" items="${srs.rows}" varStatus="status"> 33. <dt> 34. <a href="#${srs.rowIds[status.index]}">${row.title} </a> 35. <small><c:out value="${row.writer}"/> | <ksf:formatDate value="${row.regdate}" pattern="yyyy.MM.dd"/></small> 36. </dt> 37. <dd> 38. <p>${row.contents}</p> 39. </dd> 40. </c:forEach> 41. </dl> 42. </c:otherwise> 43. </c:choose> 44. </c:if> 45. </div><!--//.col-md-9--> 46. … 47. </html>
28 라인
검색 건수를 표시하기 위해 <fmt:formatNumber> 태그를 이용했다. groupingUsed를 true로 설정하여 1,000자리 마다 쉼표가 추가된다. 예를 들어 1214건 일 경우 1,204로 표시된다.
32 라인
모든 검색 결과에 대해 루프를 반복한다. 반복할 검색 결괏값의 배열을 구하기 위해 ${srs.rows}라는 EL을 이용하였다. JSP 엔진은 내부적으로 SearchResultSet 클래스인 srs 애트리뷰트의 getter 함수들 중 getRows() 함수를 호출한다. getRows()는 키가 시나리오 필드명이고 값이 해당 필드 값인 맵들의 배열을 반환한다. 루프 상에서 현재 레코드를 나타내는 맵은 row라는 변수에 할당되고 (var="row") 루프 상에서 현재 위치는 status라는 변수에 할당된다 (varStatus="status").
34 라인
이제 row 변수에서 키에 해당하는 속성을 프로퍼티 접근 연산자(.)를 통해 접근할 수 있다. 예를 들어 ${row.title}은 row의 title 속성을 표시한다. 이는 JSP 스크립트로 <%=row.get("title")%>과 같은 의미이다. JSTL의 <c:out> 태그를 사용하면 <c:out value="${row.title}" escapeXml="false"/> 로 표시할 수 있다. title 속성값은 하이라이팅을 위해 <b>를 포함하므로 <c:out value="${row.title}"/> 를 사용하지 않고 직접 EL 변수를 출력하였다. 현재 row의 rowId는 ${srs.rowIds[status.index]}로 구할 수 있다. 유사하게 현재 row의 score는 ${srs.scores[status.index]}로 구할 수 있다.
35 라인
<ksf:formatDate> 태그를 이용하여 등록일(regdate)을 표시한다. regdate의 타입이 Date가 아닌 String이기 때문에 <fmt:formatDate>가 아닌 <ksf:formatDate>를 사용하였다. <fmt> 태그를 사용할 경우에는 아래와 같이 포멧팅 전에 String을 Date로 파싱하는 단계가 추가로 필요하다.
<fmt:parseDate var="regdate" value="${row.regdate}" pattern="yyyyMMddHHmmss"/> <fmt:formatDate value="${regdate}" pattern="yyyy.MM.dd"/>
작성된 JSP를 배치하고 "축구"라는 검색어로 검색한 결과를 확인한다.