티스토리 뷰

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">상세정보 &raquo;</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">도서주문 &raquo;</a>
				<a href="<c:url value="/books"/>" class="btn btn-secondary">도서 목록 &raquo;</a>
			</div>
		</div>
		<hr>
		<footer>
			<p>&copy; BookMarket</p>
		</footer>
	</div>
</body>
</html>

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday