MyBatis + MVC 실습 (6) : 검색 기능

지역별 맛집을 검색해서 리스트를 출력해 주는 기능을 만들어 보자.

아래처럼 키워드를 입력하고 검색 버튼을 누르면 그 아래 영역에 검색 결과를 출력할 것이다.

 

 

 

1. 검색 결과 리스트와 수를 출력할 mapper 코드를 작성한다.

mapper.xml

LIKE문을 사용할 때 작은 따옴표(')와 | 기호를 써야 하는 점에 유의한다!

<select id="foodLocationFindData" resultType="FoodVO" parameterType="hashmap">
    SELECT fno, name, score, poster, type, address, num
    FROM (SELECT fno, name, score, poster, type, address, rownum as num
    FROM (SELECT fno, name, score, poster, type, address
    FROM food_location WHERE address LIKE '%'||#{address}||'%' ORDER BY fno ASC))
    WHERE num BETWEEN #{start} AND #{end}
</select>
<select id="foodLocationFindTotalPage" resultType="int" parameterType="String">
    SELECT CEIL(COUNT(*)/12.0) FROM food_location
    WHERE address LIKE '%'||#{address}||'%'
</select>

 

 

2. 데이터베이스에 연결해서 결과를 받아 올 메서드를 DAO에서 구현한다.

DAO.java(Class)

public static List < FoodVO > foodLocationFindData(Map map) {
  List < FoodVO > list = null;
  SqlSession session = null;
  try {
    session = ssf.openSession();
    list = session.selectList("foodLocationFindData", map);
  } catch (Exception ex) {

  } finally {
    if (session != null)
      session.close();
  }
  return list;
}

public static int foodLocationFindTotalPage(String address) {
  int total = 0;
  SqlSession session = null;
  try {
    session = ssf.openSession();
    total = session.selectOne("foodLocationFindTotalPage", address);
  } catch (Exception ex) {

  } finally {
    if (session != null)
      session.close();
  }
  return total;
}

 

 

3. 메서드에 어떻게 값을 넣고 화면에 출력할 값을 보내줄 Model 코드를 작성한다.

Model.java (Class)

@RequestMapping("food/food_find.do")
public String food_find(HttpServletRequest request, HttpServletResponse response) {
  try {
    request.setCharacterEncoding("UTF-8");
  } catch (Exception ex) {}
  String page = request.getParameter("page");
  if (page == null)
    page = "1";
  String addr = request.getParameter("addr");
  if (addr == null)
    addr = "강남";
  int curPage = Integer.parseInt(page);
  int rowSize = 12;
  int start = (rowSize * curPage) - (rowSize - 1);
  int end = rowSize * curPage;

  Map map = new HashMap();
  map.put("address", addr);
  map.put("start", start);
  map.put("end", end);

  List < FoodVO > list = FoodDAO.foodLocationFindData(map);
  int totalPage = FoodDAO.foodLocationFindTotalPage(addr);
  System.out.println(totalPage);
  request.setAttribute("curPage", curPage);
  request.setAttribute("list", list);
  request.setAttribute("totalPage", totalPage);
  request.setAttribute("addr", addr);
  request.setAttribute("main_jsp", "../food/food_find.jsp");
  return "../main/main.jsp";
}

 

4. 화면까지 만들면 끝~

find.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">
<title>Insert title here</title>
</head>
<body>
<div class="wrapper row3">
  <div id="breadcrumb" class="clear"> 
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">맛집</a></li>
      <li><a href="#">지역별 맛집 찾기</a></li>
    </ul>
  </div>
</div>
<div class="wrapper row3">
  <main class="container clear">
  	<h2 class="sectiontitle">지역별 맛집 찾기</h2> 
  	<div class="row inline">
	  	<form method="post" action="../food/food_find.do">
	  		<input type=text name=addr size=35 class="input-sm" value="${addr }">
	  		<input type=submit value="검색" size=10 class="btn btn-sm btn-primary">
	  	</form>
  	</div>
  	<div style="height:20px"></div>
  	<div class="row">
  		<c:forEach var="vo" items="${list }">
	    <div class="col-md-3">
	      <div class="thumbnail">
	        <a href="#">
	          <img src="${vo.poster }" style="width:100%">
	          <div class="caption">
	            <p>${vo.name }&nbsp;<span style="color:orange">${vo.score }</span></p>
	            <p>${vo.type }</p>
	          </div>
	        </a>
	      </div>
	    </div>
	  </c:forEach>
  	</div>
  	<div class="row">
  		<div class="text-center">
  			<a href="../food/food_find.do?addr=${addr }&page=${curPage>1?curPage-1:curPage}" class="btn btn-sm btn-danger">이전</a>
  			${curPage } page / ${totalPage } pages
  			<a href="../food/food_find.do?addr=${addr }&page=${curPage<totalPage?curPage+1:curPage}" class="btn btn-sm btn-danger">다음</a>
  		</div>
  	</div>
  </main>
</div>
</body>
</html>

댓글()