11.5. 책 목록 서비스 인터페이스 메소드 시그니쳐 생성
src/main/java/sample/spring/yse/BookService.java
List<Map<String, Object>> list(Map<String, Object> map);
책 목록 서비스 인터페이스 메소드 시그니쳐는 클래스 메소드와 맞춘다.
11.6. 책 목록 컨트롤러 메소드 추가
src/main/java/sample/spring/yse/BookController.java
@RequestMapping(value = "list")
public ModelAndView list(@RequestParam Map<String, Object> map) {
List<Map<String, Object>> list = this.bookService.list(map);
ModelAndView mav = new ModelAndView();
mav.addObject("data", list);
mav.setViewName("/book/list");
return mav;
}
책 목록을 데이터베이스에서 가지고 온다.
List<Map<String, Object>> list = this.bookService.list(map);
데이터를 뷰에 전달할 수 있게 mav 객체에 넣는다.
mav.addObject("data", list);
/book/list 뷰를 리턴한다.
mav.setViewName("/book/list");
11.7. 책 목록 뷰 작성
책 목록 뷰를 생성한다. src => main => webapp => WEB-INF => views => book 우클릭 후 new -> file 을 선택하고 파일 이름을 list.jsp로 생성하면 된다.
src/main/webapp/WEB-INF/views/book/list.jsp
<%@ page pageEncoding="UTF-8" contentType="text/html;charset=utf-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<title>책 목록</title>
</head>
<body>
<h1>책 목록</h1>
<table>
<thead>
<tr>
<td>제목</td>
<td>카테고리</td>
<td>가격</td>
</tr>
</thead>
<tbody>
<c:forEach var="row" items="${data}">
<tr>
<td>
<a href="/detail?bookId=${row.book_id}">
${row.title}
</a>
</td>
<td>${row.category}</td>
<td><fmt:formatNumber type="number" maxFractionDigits="3" value="${row.price}" /></td>
</tr>
</c:forEach>
</tbody>
</table>
<p>
<a href="/create">생성</a>
</p>
</body>
</html>
JSTL에서 반복문을 사용하기 위해서는 <c:forEach 구문을 사용할 수 있다.
<c: 태그를 사용하기 위해서는 태그 라이브러리를 선언해야 한다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
반복문은 아래와 같이 사용한다.
<c:forEach var="row" items="${data}">
items에는 컨트롤러에서 전달받은 데이터를 넣어준다. 반복 가능한 객체면 어디서 생성한 객체든 무관하다.
items="${data}"
var는 목록의 한 행(row)을 나타내는 변수명을 넣으면 된다.
var="row"
반복문 안에서 데이터는 ${row.이름} 으로 사용할 수 있다.
${row.title}
11.8. 책 목록 화면 확인
책 목록 페이지 http://localhost:8080/list에 접속한다.
데이터가 없으므로 빈 목록이 나오는 것이 정상이다.
생성 페이지 http://localhost:8080/create에서 예제 데이터를 몇 개 넣고 다시 확인해 보자.