티스토리 뷰
6.1.3 @PathVariable을 이용하여 도서 분야와 일치하는 도서 목록 출력하기
BookRepository.java
getBookListByCategory()메서드를 선언한다.
package com.springmvc.repository;
import java.util.List;
import com.springmvc.domain.Book;
//만들어질 함수를 미리 정의하는 것
public interface BookRepository {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
}
BookRepositoryImpl.java
인터페이스에서 getBookListByCategory()메서드를 선언했으므로 구현을 해야한다.
ArrayList가 있지만 하나 더 만드는 이유는 getAllBookList()는 모든 값들을 가져와 출력하는 메소드지만
지금 필요한 것은 특정 검색 값들에 해당하는 도서 목록만 출력하는 것이므로 ArrayList를 하나 더 생성했다.
또한 for문과 if문을 활용해서 list를 가져온 후 검색한 값과 같은 결과를 ArrayList에 담도록 작성했다.
이때 사용하는 equalsIgnoreCase는 대소문자를 구분하지 않는다.
package com.springmvc.repository;
import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Repository;
import com.springmvc.domain.Book;
@Repository
public class BookRepositoryImpl implements BookRepository {
private List<Book> listOfBooks = new ArrayList<Book>();
public BookRepositoryImpl() {
..........
}
@Override
public List<Book> getAllBookList() {
// TODO Auto-generated method stub
return listOfBooks;
}
@Override
public List<Book> getBookListByCategory(String category) {
List<Book> bookByCategory = new ArrayList<Book>();
for(int i =0; i<listOfBooks.size(); i++) {
Book book = listOfBooks.get(i);
if(category.equalsIgnoreCase(book.getCategory()))
bookByCategory.add(book);
}
return bookByCategory;
}
}
BookService.java
BookRepository와 같이 getBookListByCategory()메서드를 선언한다.
package com.springmvc.service;
import java.util.List;
import com.springmvc.domain.Book;
public interface BookService {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
}
BookServiceImpl .java
BookRepository와 같이 인터페이스에서 getBookListByCategory()메서드를 선언했으므로 구현을 해야한다.
ArrayList가 있지만 하나 더 만드는 이유는 getAllBookList()는 모든 값들을 가져와 출력하는 메소드지만
지금 필요한 것은 특정 검색 값들에 해당하는 도서 목록만 출력하는 것이므로 ArrayList를 하나 더 생성했다.
package com.springmvc.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.springmvc.domain.Book;
import com.springmvc.repository.BookRepository;
@Service
public class BookServiceImpl implements BookService {
//autoinjection하는 것임 자동 객체 생성함
@Autowired
private BookRepository bookRepository;
@Override
public List<Book> getAllBookList() {
// TODO Auto-generated method stub
return bookRepository.getAllBookList();
}
@Override
public List<Book> getBookListByCategory(String category) {
List<Book> booksByCategory = bookRepository.getBookListByCategory(category);
return booksByCategory;
}
}
BookController.java
@PathVariable을 이용해서 경로변수를 생성하고 url에 경로변수를 출력하도록 작성했다.
또한, 검색 결과가 같은 도서 목록을 가져와 출력해주었다.
package com.springmvc.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
...
@Controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
.....
@GetMapping("/{category}")
public String requestBooksByCategory(@PathVariable("category") String bookCategory, Model model) {
List<Book> booksByCategory = bookService.getBookListByCategory(bookCategory);
model.addAttribute("bookList",booksByCategory);
return "books";
}
web.xml
웹 요청 url에 한글을 포함하여 전송할 수 있도록 web.xml에 필터를 추가 작성한다.
web.xml은 시작하기 전 객체를 실행하여 가져가도록 하기 때문에 web.xml에 한글이 깨지지않도록 filter를 작성해주는 것이다.
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
주소창에 http://localhost:8080/bookmarket/books/IT전문서 를 입력하면 아래와 같은 결과가 나온다.
도서 분류가 IT 전문서인 도서 목록들이 출력된다.
주소창에 http://localhost:8080/bookmarket/books/IT활용서 를 입력하면 아래와 같은 결과가 나온다.
분류가 IT활용서인 도서 목록들이 출력된다.
6.2.3 @MatrixVariable을 이용하여 매트릭스 변수 값과 일치하는 도서 목록 출력하기
@MatrixVariable을 사용하기 위해서는 servlet-context.xml에 아래와 같은 코드를 추가적으로 작성해야한다.
servlet-context.xml
<annotation-driven enable-matrix-variables="true"/>
BookRepository.java
인터페이스에 getBookListByFilter() 메서드를 선언한다.
package com.springmvc.repository;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.springmvc.domain.Book;
//만들어질 함수를 미리 정의하는 것
public interface BookRepository {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
Set<Book> getBookListByFilter(Map<String, List<String>> filter);
}
BookRepositoryImpl.java
인터페이스에 선언했으므로 구현해준다.
getBookListByFilter()메서드는 도서 출판사(publisher) 및 도서 분야(category)를 포함한 웹 요청 URL에 대해 도서를 검색하여 도서 목록을 반환한다.
package com.springmvc.repository;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.springframework.stereotype.Repository;
import com.springmvc.domain.Book;
@Repository
public class BookRepositoryImpl implements BookRepository {
private List<Book> listOfBooks = new ArrayList<Book>();
public BookRepositoryImpl() {
...
}
@Override
public List<Book> getAllBookList() {
...
}
@Override
public List<Book> getBookListByCategory(String category)
{
...
}
@Override
public Set<Book> getBookListByFilter(Map<String, List<String>> filter) {
Set<Book> booksByPublisher = new HashSet<Book>();
Set<Book> booksByCategory = new HashSet<Book>();
Set<String> booksByFilter = filter.keySet();
if(booksByFilter.contains("publisher")) {
for(int j=0; j<filter.get("publisher").size(); j++) {
String publisherName = filter.get("publisher").get(j);
for(int i=0; i<listOfBooks.size(); i++) {
Book book = listOfBooks.get(i);
if(publisherName.equalsIgnoreCase(book.getPublisher())) {
booksByPublisher.add(book);
}
}
}
}
if(booksByFilter.contains("category")) {
for(int i=0; i<filter.get("category").size(); i++) {
String category = filter.get("category").get(i);
List<Book> list = getBookListByCategory(category);
booksByCategory.addAll(list);
}
}
booksByCategory.retainAll(booksByPublisher);
return booksByCategory;
}
}
* Set은 중복되지 않고 순서가 없다.
* contains는 특정문자열 포함하는지 확인하는 함수다.
* if문에서 필터링을 한 후 다음 if문에서 ArrayList에 담아준다.
BookService.java
package com.springmvc.service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.springmvc.domain.Book;
public interface BookService {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
Set<Book> getBookListByFilter(Map<String, List<String>> filter);
}
BookServiceImpl.java
package com.springmvc.service;
import java.util.List;
...
@Service
public class BookServiceImpl implements BookService {
//autoinjection하는 것임 자동 객체 생성함
@Autowired
private BookRepository bookRepository;
@Override
public List<Book> getAllBookList() {
...
}
@Override
public List<Book> getBookListByCategory(String category) {
...
}
@Override
public Set<Book> getBookListByFilter(Map<String, List<String>> filter) {
Set<Book> booksByFilter = bookRepository.getBookListByFilter(filter);
return booksByFilter;
}
}
BookController.java
requestBooksByFilter() 메서드를 추가한다.
@RequestMapping의 요청 매핑 경로 /filter/{bookFilter}와 매핑하게 되어 getBooksByFilter() 메서드가 실행된다.
package com.springmvc.controller;
import java.util.List;
...
@Controller
@RequestMapping("/books")
public class BookController {
@Autowired
private BookService bookService;
@GetMapping
public String requestBookList(Model model) {
...
}
@GetMapping("/all")
public ModelAndView requestAllBooks(Model model) {
...
}
@GetMapping("/{category}")
public String requestBooksByCategory(@PathVariable("category") String bookCategory, Model model) {
...
}
@GetMapping("/filter/{bookFilter}")
public String requestBooksByFilter(@MatrixVariable(pathVar="bookFilter") Map<String, List<String>> bookFilter, Model model) {
Set<Book> booksByFilter = bookService.getBookListByFilter(bookFilter);
model.addAttribute("bookList",booksByFilter);
return "books";
}
}
출력 결과
/books/filter/bookFilter;publisher=길벗;category=IT전문서,IT활용서
/books/filter/bookFilter;publisher=길벗;category=IT전문서
6.3.3 @RequestParam을 이용하여 도서 ID와 일치하는 도서의 상세 정보 출력하기
BookRepository.java
package com.springmvc.repository;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.springmvc.domain.Book;
//만들어질 함수를 미리 정의하는 것
public interface BookRepository {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
Set<Book> getBookListByFilter(Map<String, List<String>> filter);
Book getBookById(String bookId);
}
BookRepositoryImpl.java
@Override
public Book getBookById(String bookId) {
Book bookInfo = null;
for(int i=0; i<listOfBooks.size(); i++) {
Book book = listOfBooks.get(i);
if(book != null && book.getBookId() != null && book.getBookId().equals(bookId)) {
bookInfo = book;
break;
}
}
if(bookInfo == null) {
throw new IllegalArgumentException("도서 ID가 "+bookId+ "인 해당 도서를 찾을 수 없습니다.");
}
return bookInfo;
}
BookService.java
package com.springmvc.service;
import java.util.List;
import java.util.Map;
import java.util.Set;
import com.springmvc.domain.Book;
public interface BookService {
List<Book> getAllBookList();
List<Book> getBookListByCategory(String category);
Set<Book> getBookListByFilter(Map<String, List<String>> filter);
Book getBookById(String bookId);
}
BookServiceImpl.java
@Override
public Book getBookById(String bookId) {
Book bookById = bookRepository.getBookById(bookId);
return bookById;
}
BookController.java
@GetMapping("/filter/{bookFilter}")
public String requestBooksByFilter(@MatrixVariable(pathVar="bookFilter") Map<String, List<String>> bookFilter, Model model) {
Set<Book> booksByFilter = bookService.getBookListByFilter(bookFilter);
model.addAttribute("bookList",booksByFilter);
return "books";
}
@GetMapping("/book")
public String requestBookById(@RequestParam("id") String bookId, Model model) {
Book bookById = bookService.getBookById(bookId);
model.addAttribute("book",bookById);
return "book";
}
books.jsp
<div class="container">
<div class="row" align="center">
<c:forEach items="${bookList}" var="book">
<div class="col-md-4">
<h3>${book.name}</h3>
<p>${book.author}
<br>${book.publisher} | ${book.releaseDate}
<p align=left>${fn:substring(book.description,0,100) }...
<p>${book.unitPrice}원
<p><a href="<c:url value="/books/book?id=${book.bookId}"/>"class="btn btn-secondary" role="button">상세정보 »</a>
</div>
</c:forEach>
</div>
book.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<link href="<c:url value="/resources/css/bootstrap.min.css"/>"rel="stylesheet" />
<title>도서 상세 정보</title>
</head>
<body>
<nav class="navbar-expand navbar-dark bg-dark">
<div class="container">
<div class="navbar-header">
<a class="navbar-brand" href="./home">Home</a>
</div>
</div>
</nav>
<div class="jumbotron">
<div class="container">
<h1 class="display-3">도서 정보</h1>
</div>
</div>
<div class="container">
<div class="row">
<div class="col-md-12">
<h3>${book.name}</h3>
<p>${book.description }</p>
<br>
<p><b>도서코드 : </b><span class="badge badge-info">${book.bookId }</span>
<p><b>저자</b> : ${book.author}
<p><b>출판사</b> : ${book.publisher}
<p><b>출판일</b> : ${book.releaseDate}
<p><b>분류</b> : ${book.category}
<p><b>재고수</b> : ${book.unitsInStock}
<h4>${book.unitPrice }원</h4>
<br>
<p><a href="#" class="btn btn-primary">도서주문 »</a>
<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 »</a>
</div>
</div>
<hr>
<footer>
<p>© BookMarket</p>
</footer>
</div>
</body>
</html>
'코딩 > spring' 카테고리의 다른 글
[15주 5일차] 스프링 폼 태그 : 도서 등록 페이지 만들기 (0) | 2024.01.19 |
---|---|
[15주 4일차] 요청 처리 메서드의 파라미터 유형 (0) | 2024.01.18 |
[15주 4일차] 컨트롤러 구현 (2) (0) | 2024.01.18 |
[15주 3일차] 컨트롤러 구현 (0) | 2024.01.17 |
[15주 3일차] 스프링 MVC 애플리케이션의 계층적 구조 (0) | 2024.01.17 |
- Total
- Today
- Yesterday