11.02. 책 목록 만들기 - 2

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에서 예제 데이터를 몇 개 넣고 다시 확인해 보자.