210712_1~210713_1(SpringBoot)
https://sas-study.tistory.com/274
스프링과 스프링부트의 차이점 참고
war방식으로 생성해서 실제로 tomcat 서버에 배포했을때 실행이 가능하다.
1) boot 프로젝트 생성
2) pom.xml
라이브러리 추가
<!-- 외부 레포지토리 추가 -->
<repositories>
<repository>
<id>ojdbc14</id>
<name>oracle.com</name>
<url>http://maven.geomajas.org</url>
</repository>
</repositories>
<dependencies>
<!-- https://mvnrepository.com/artifact/taglibs/standard -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat.embed/tomcat-embed-jasper -->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<version>9.0.50</version>
</dependency>
3) SpringBoot1Application.java
실행클래스에 인코딩 추가
@Bean //인코딩
public HttpMessageConverter<String> responseBConverter(){
return new StringHttpMessageConverter(Charset.forName("UTF-8"));
}
//인코딩때문에
public CharacterEncodingFilter characterEncodingFilter() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return characterEncodingFilter;
}
4) application.properties
기본환경 설정
#===server setting
server.port=8888
server.tomcat.uri-encoding=UTF-8
#===view resolver
#spring.mvc.view.prefix=/WEB-INF/views/
#spring.mvc.view.suffix=.jsp
#===dataSource setting
spring.datasource.url=jdbc:oracle:thin:@localhost:1521:XE
spring.datasource.username=jspuser
spring.datasource.password=1234
기본설정
주의) Autowired 자동주입 방속을 사용할때 구현 클래스로 변수를 만들자
인터페이스로 만들면 구현메서드를 찾지 못하더라..왜?
요청작업단위
1-1. 글쓰기 폼
매핑계획 /board/writeBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/writeBoard.jsp
1) Mapper : X
2) Dao : X
3) Service : X
4) Controller : O
package com.example.demo;
import java.util.ArrayList;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
@RequestMapping("/board") // board/writeForm.do 의 경로가 된다.
public class BoardController {
private int recordsForPage = 5;
@Autowired
BoardServiceImpl boardService;
//로그
private static final Logger logger =
LoggerFactory.getLogger(BoardController.class);
// 요청단위 본격적인 매핑 메서드들이 추가됨
// 글 입력폼
// 매핑계획/writeBoard.do ===> writeBoard() ===>board/writeBoard.jsp
@RequestMapping(value = "/writeBoard.do", method = RequestMethod.GET)
public String writeBoard(Model model,BoardBean boardBean) {
logger.debug("writeForm called!!!");
model.addAttribute("boardBean",boardBean); //뷰 폼값 자동 매핑
return "writeBoard";
}
5) View(JSP) : O
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.io.*, java.text.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>글입력하기</title>
</head>
<body>
<c:url var="insertUrl" value="writeBoard.do"/>
<sf:form modelAttribute="boardBean" method="POST" action="${insertUrl}">
이름 : <sf:input path="name" size="50" maxlength="50"/>
<sf:errors path="name" cssClass="error"/><br>
이메일 : <sf:input path="mail" size="50" maxlength="50"/>
<sf:errors path="mail" cssClass="error"/><br>
제목 : <sf:input path="subject" size="50" maxlength="50"/>
<sf:errors path="subject" cssClass="error"/><br>
내용 : <sf:textarea path="memo" size="200" cssStyle="width:350px; height:100px;" maxlength="200"/>
<sf:errors path="memo" cssClass="error"/><br>
<input type="submit" value="등록하기">
</sf:form>
</body>
</html>
1-2. 글쓰기 처리
매핑계획 /board/writeBoard.do(POST방식) ===> writeBoardOk() ===>WEB-INF/board/writeBoardOk.jsp
1) Mapper : O
package com.example.demo;
import java.util.ArrayList;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
@Mapper
public interface BoardMapper {
//sql 상수
//연결 @ 어노테이션
// 호출함수
// 글입력처리
final String INSERT = "insert into spring_board (id, subject, name, created_date, mail, memo, hits) "
+ " values (seq_id.nextval, #{subject}, #{name}, sysdate, #{mail}, #{memo}, 0 ) ";
@Insert(INSERT)
void insertBoard(BoardBean boardBean);
2) Dao : O
package com.example.demo;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class BoardDaoImpl {
@Autowired
private BoardMapper boardMapper;
//매퍼클라이언트
public void insertBoard(BoardBean boardBean) {
boardMapper.insertBoard(boardBean);
}
3) Service : O
package com.example.demo;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class BoardServiceImpl {
//business layer 용도
@Autowired
private BoardDaoImpl boardDao ;
//글쓰기
public void insertBoard(BoardBean boardBean) {
boardDao.insertBoard(boardBean);
}
4) Controller : O
//글쓰기 처리
@RequestMapping(value = "/writeBoard.do", method = RequestMethod.POST)
public String writeBoardOk(Model model,BoardBean boardBean) {
logger.debug("writeFormOk called!!!");
boardService.insertBoard(boardBean);
model.addAttribute("result",1); //뷰 폼값 자동 매핑
return "writeBoardOk";
}
5) View(JSP) : O
<%@ 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>
<c:if test="${result==1}">
<script type="text/javascript">
alert('글이 입력되었습니다.')
location.href = 'listBoard.do?current_page=1'
</script>
</c:if>
</body>
</html>
2. 글 목록
매핑계획 /board/listBoard.do(POST방식) ===> listBoardOk() ===>WEB-INF/board/listBoard.jsp
1) Mapper : O
//글 목록갯수
final String SELECT_CNT_ALL = "SELECT count(1) FROM SPRING_BOARD";
//전체 글 갯수를 조회
@Select(SELECT_CNT_ALL)
int getTotalCnt();
//글목록 - 일부 반환
final String SELECT_PAGE=
"SELECT * FROM (select a.*, ceil(rownum/ #{rowsPerPage}) as page "
+ "FROM ( SELECT id, subject, name, created_date, mail, memo, hits "
+ "FROM spring_board order by id desc )a )b WHERE b.page = #{page}";
// #{속성} : preparedStatement , ${속성} : Statement
//BoardBean 의 속성들과 동일한 이름으로 #{mail} 등을 지정해야 한다.
@Select(SELECT_PAGE)
@Results( id= "queryResult", value= {
@Result(property = "id", column="ID"),
@Result(property = "subject", column="SUBJECT"),
@Result(property = "name", column="NAME"),
@Result(property = "created_date", column="CREATED_DATE"),
@Result(property = "mail", column="MAIL"),
@Result(property = "memo", column="MEMO"),
@Result(property = "hits", column="HITS")
})
ArrayList<BoardBean> getList(@Param("page") int page, @Param("rowsPerPage") int rowsPerPage);
2) Dao : O
public int getTotalCnt() {
// TODO Auto-generated method stub
boardMapper.getTotalCnt();
return boardMapper.getTotalCnt();
}
public ArrayList<BoardBean> getList(int nStartPage, int list_num) {
// TODO Auto-generated method stub
return boardMapper.getList(nStartPage, list_num);
}
3) Service : O
public int getTotalCnt() {
// TODO Auto-generated method stub
return boardDao.getTotalCnt();
}
public ArrayList<BoardBean> getList(int nStartPage, int list_num) {
// TODO Auto-generated method stub
return boardDao.getList(nStartPage, list_num);
}
4) Controller : O
//글목록
@RequestMapping(value = "/listBoard.do", method = RequestMethod.GET)
public String listBoard(Model model, @RequestParam("current_page") String current_page) {
logger.debug("listBoard called!!!");
int totcnt = boardService.getTotalCnt();
ArrayList arraylist = boardService.getList(Integer.parseInt(current_page), 5);
model.addAttribute("totalCnt",totcnt);
model.addAttribute("current_page", current_page);//글을 작성후에는 처음 페이지로 돌아간다.
model.addAttribute("boardList", arraylist);
return "listBoard";
}
5) View(JSP) : O
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@page session="false"%>
<%@page
import="com.example.demo.BoardBean, java.util.ArrayList, java.util.Properties, java.io.IOException,
java.io.FileInputStream, com.example.demo.PageNumberingManager "%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
</head>
<body>
<c:set var="current_page" value="${current_page}" />
<c:set var="total_cnt" value="${totalCnt}" />
<%
int c_page = Integer.parseInt((String) (pageContext.getAttribute("current_page")));
pageContext.setAttribute("c_page", c_page);
%>
<table cellspacing=1 width=700 border=0>
<tr>
<td>총 게시물 수 <c:out value="${totalCnt}" /></td>
<td><p align="right">
페이지 :
<c:out value="${current_page}" /></td>
</tr>
</table>
<table cellspacing=1 width=700 border=1>
<tr>
<td width=50><p align="center">번호</p></td>
<td width=100><p align="center">이름</p></td>
<td width=320><p align="center">제목</p></td>
<td width=100><p align="center">등록일</p></td>
<td width=100><p align="center">조회수</p></td>
</tr>
<c:forEach var="board" items="${boardList}">
<tr>
<td width=50><p align="center">${board.id}</p></td>
<td width=100><p align="center">${board.name}</p></td>
<td width=320><p align="center">
<%-- <a href="viewWork.do?memo_id=${board.id}¤t_page=
<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}"> --%>
<a href="viewWork.do?memo_id=${board.id}¤t_page=
<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}">
<c:out value="${board.subject}" /></a></p></td>
<td width=100><p align="center"><c:out value="${board.created_date}" />
</p></td>
<td width=100><p align="center"><c:out value="${board.hits}" />
</p></td>
</tr>
</c:forEach>
<!-- 페이징 -->
<%
int rowsPerPage =5; //가져올 데이터 갯수
int total_cnt = ((Integer)(pageContext.getAttribute("total_cnt"))).intValue();
//전체 페이지
int total_pages = PageNumberingManager.getInstance().getTotalPage(total_cnt, rowsPerPage);
pageContext.setAttribute("t_pages",total_pages);
%>
</table>
<table cellspacing=1 width=700 border=1 >
<tr>
<td align="center">
<c:forEach var="i" begin="1" end="${t_pages}">
<a href="listBoard.do?current_page=${i}">
[
<b><c:if test="${i==c_page}"></c:if>
${i}
<c:if test="${i==c_page}"></c:if></b>
]</a>
</c:forEach>
</td>
</tr>
</table>
<table width=700>
<tr>
<td><input type="button" value="글쓰기" onclick="window.location='writeBoard.do'"></td>
<td><form name="searchString" method="post" action="searchWithSubject.do">
<p align="center"><input type="Text" name="searchStr" size="50" maxlength="50">
<input type="submit" value="글찾기"></p></form>
</td>
</tr>
</table>
</body>
</html>
3. 글보기
매핑계획 /boardviewBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/viewBoard.jsp
1) Mapper : O
//글 보기
final String SELECT_BY_ID = "SELECT id, subject, name, created_date, mail, memo, hits "
+ " FROM spring_board where id=#{id}";
@Select(SELECT_BY_ID)
@ResultMap("queryResult") //위에사용한 @Results 에 id를 만들어놓으면 다음과같이 재사용할수있다.
BoardBean getView(@Param("id") String id);
2) Dao : O
public BoardBean getView(String id) {
// TODO Auto-generated method stub
// 조회수증가
boardMapper.hitup(id);
return boardMapper.getView(id);
}
3) Service : O
public BoardBean getView(String id) {
// TODO Auto-generated method stub
return boardDao.getView(id);
}
4) Controller : O
@RequestMapping(value = "/viewBoard.do", method = RequestMethod.GET)
public String viewBoard(
@RequestParam("memo_id") String memo_id,
@RequestParam("current_page") String current_page,
@RequestParam("searchStr") String searchStr,
Model model
) {
logger.info("viewWork called!");
BoardBean boardBean = boardService.getView(memo_id);
model.addAttribute("memo_id",memo_id);
model.addAttribute("current_page",current_page);
model.addAttribute("searchStr",searchStr);
model.addAttribute("boardBean",boardBean);
return "viewBoard";
5) view : viewBoard.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<c:set var="memo_id" value="${memo_id}"/>
<c:set var="current_page" value="${current_page}"/>
<c:set var="searchStr" value="${searchStr}"/>
<html>
<head>
<meta charset="UTF-8">
<title>글보기</title>
</head>
<%
String searchStr = (String) (pageContext.getAttribute("searchStr"));
%>
<script type="text/javascript">
function boardlist(){
var s = "<%=searchStr%>"
if(s=="None")
location.href='/board/listBoard.do?current_page=${current_page}';
else
location.href='/board/listSearchBoard.do?current_page=${current_page}&searchStr=${searchStr}';
}
function boardmodify(){
location.href='/board/updateBoard.do?memo_id=${memo_id}¤t_page=${current_page}';
}
function boarddelete(){
location.href='/board/deleteBoard.do?memo_id=${memo_id}¤t_page=${current_page}';
}
</script>
<table cellspacing=0 cellpadding=5 border=1 width=500>
<tr><td><b>조회수</b></td><td><c:out value="${boardBean.hits}"/></td></tr>
<tr><td><b>이름</b></td><td><c:out value="${boardBean.name}"/></td></tr>
<tr><td><b>이메일</b></td><td><c:out value="${boardBean.mail}"/></td></tr>
<tr><td><b>제목</b></td><td><c:out value="${boardBean.subject}"/></td></tr>
<tr><td><b>내용</b></td><td width=350><c:out value="${boardBean.memo}"/></td></tr>
</table>
<table cellspacing=0 cellpadding=0 border=0 width=500>
<tr><td>
<input type="button" value="수정" onclick="javascript:boardmodify()">
<input type="button" value="목록" onclick="javascript:boardlist()">
<input type="button" value="삭제" onclick="javascript:boarddelete()">
</td></tr>
</table>
</html>
4-1. 글수정폼
매핑계획 /updateBoard.do(GET방식) ===> getEditView() ===>WEB-INF/board/updateBoard.jsp
1) Mapper : O
//글수정
final String UPDATE_BY_ID = "UPDATE spring_board set subject = #{subject}, mail = #{mail}, "
+ "memo = #{memo} WHERE id=#{id}";
@Update(UPDATE_BY_ID)
void updateBoard(BoardBean boardBean);
2) Dao : O
public BoardBean getEditView(String id) {
// TODO Auto-generated method stub
return boardMapper.getView(id);
}
3) Service : O
public BoardBean getEditView(String id) {
// TODO Auto-generated method stub
return boardDao.getEditView(id);
}
4) Controller : O
//글수정. 특정페이지 수정을 위한 내용 출력 폼
@RequestMapping(value = "/updateBoard.do", method = RequestMethod.GET)
public String updateBoard(
@RequestParam("memo_id") String memo_id,
@RequestParam("current_page") String current_page,
Model model
) {
logger.info("updateBoard called!");
BoardBean boardBean = boardService.getEditView(memo_id);
model.addAttribute("memo_id",memo_id);
model.addAttribute("current_page", current_page);
model.addAttribute("boardBean", boardBean);
return "updateBoard";
}
5) view --updateBoard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.io.*, java.text.*" %>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<script language="javascript">
function writeCheck(){
var form = document.modifyform;
if(!form.dbsubject.value){
alert("제목을 적어주세요");
form.dbsubject.focus();
return;
}
if(!form.dbmemo.value){
alert("내용을 적어주세요");
form.dbmemo.focus();
return;
}
form.submit();
}
function boardlist(){
location.href='/board/listBoard.do?current_page=${current_page}';
}
</script>
<meta charset="UTF-8">
<title>글수정하기</title>
</head>
<body>
<c:url var="updateUrl" value="updateBoardOk.do"/>
<sf:form modelAttribute="boardBean" method="POST" action="${updateUrl}">
<table width=400 border=1 cellspacing=0 cellpadding=5>
<%--modelAttribute로 데이터를 넘기는데, 추가적인 정보를 넘기기위해서 hidden field를 사용함--%>
<input type="hidden" name="memo_id" value="${memo_id}">
<input type="hidden" name="current_page" value="${current_page}">
<tr>
<td><b>이름</b></td>
<%--이름은 readonly 처리 --%>
<td><sf:input readonly="true" path="name" size="50" maxlength="50"/>
<sf:errors path="name" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>이메일</b></td>
<td><sf:input path="mail" size="50" maxlength="50"/>
<sf:errors path="mail" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>제목</b></td>
<td><sf:input path="subject" size="50" maxlength="50"/>
<sf:errors path="subject" cssClass="error"/><br></td>
</tr>
<tr>
<td><b>내용</b></td>
<td><sf:textarea path="memo" size="200" cssStyle="width:350px; height:100px;" maxlength="200"/>
<sf:errors path="memo" cssClass="error"/><br></td>
</tr>
</table>
<table>
<tr>
<td><input type="submit" value="수정하기">
<input type="button" value="목록" onclick="javascript:boardlist()">
</td>
</tr>
</table>
</sf:form>
</body>
</html>
4-2 글수정처리
매핑계획 /updateBoard.do(GET방식) ===> updateBoard() ===>WEB-INF/board/updateBoardOk.jsp
1) Mapper : O
//글수정
final String UPDATE_BY_ID = "UPDATE spring_board set subject = #{subject}, mail = #{mail}, "
+ "memo = #{memo} WHERE id=#{id}";
@Update(UPDATE_BY_ID)
void updateBoard(BoardBean boardBean);
2) Dao : O
public void updateBoard(BoardBean boardBean) {
// TODO Auto-generated method stub
boardMapper.updateBoard(boardBean);
}
3) Service : O
public void updateBoard(BoardBean boardBean) {
// TODO Auto-generated method stub
boardDao.updateBoard(boardBean);
}
4) Controller : O
//글수정. 특정페이지 수정을 위한 내용 출력 폼
@RequestMapping(value = "/updateBoardOk.do", method = RequestMethod.POST)
public String updateBoardOk(
BoardBean boardBean,
@RequestParam("memo_id") int memo_id,
@RequestParam("current_page") String current_page,
Model model
) {
logger.info("updateBoardOk called!");
boardBean.setId(memo_id);
boardService.updateBoard(boardBean);
model.addAttribute("current_page", current_page);
model.addAttribute("memo_id", memo_id);
return "updateBoardOk";
}
5) view -- updateBoardOk.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Context-Type" content="text/html" charset="UTF-8">
<meta http-equiv="refresh" content="3;url=/board/viewBoard.do?
memo_id=${memo_id}¤t_page=${current_page}&searchStr=None">
<title>글수정처리</title>
</head>
<body>
<c:out value="${memo_id}"/>번 글이 수정되었습니다.
</body>
</html>
5. 글삭제
매핑계획 /deleteBoard.do(GET방식) ===> deleteBoard() ===>WEB-INF/board/deleteBoard.jsp
1) Mapper : O
// 글삭제
final String DELETE_BY_ID = "DELETE FROM spring_board WHERE id=#{id}";
2) Dao : O
public void deleteBoard(int id) {
// TODO Auto-generated method stub
boardMapper.deleteBoard(id);
}
3) Service : O
public void deleteBoard(int id) {
// TODO Auto-generated method stub
boardDao.deleteBoard(id);
}
4) Controller : O
//글삭제 컨트롤파일 bbsController+ 매핑 @ 어노테이션 매핑을 사용함
@RequestMapping(value="/deleteBoard.do", method=RequestMethod.GET)
public String deleteBoard(
@RequestParam("memo_id") int memo_id,
@RequestParam("current_page") String current_page,
Model model) {
logger.info("deleteBoard called!");
boardService.deleteBoard(memo_id);
//페이지를 다시조회한다.
model.addAttribute("totalCnt", new Integer(boardService.getTotalCnt()));
model.addAttribute("current_page", current_page);
model.addAttribute("memo_id", memo_id);
return "deleteBoard";
//글삭제는 뷰가 없다..근데 만듬
}
5) View --deleteBoard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
<meta http-equiv="refresh"
content="3;url=/board/listBoard.do?
current_page=${current_page}&searchStr=None">
<title>글삭제</title>
</head>
<body>
<c:out value="${memo_id}" />
번 글이 삭제되었습니다.
</body>
</html>
6. 글검색
매핑계획 /boardviewBoard.do(GET방식) ===> writeBoard() ===>WEB-INF/board/viewBoard.jsp
1) Mapper : O
// 글검색 갯수
final String SELECT_CNT_BY_SUBJECT = "select count(1) from spring_board where"
+ " subject like '%'||'${searchThis}'||'%'";
// 해당 주제의 관련글 갯수를 조회
@Select(SELECT_CNT_BY_SUBJECT)
int getTotalCntBySubject(@Param("searchThis") String includingThis);
// 글검색
final String SELECT_ROWS_BY_SUBJECT = "SELECT * FROM (select a.*, ceil(rownum/ #{rowsPerPage}) as page "
+ "FROM ( SELECT id, subject, name, created_date, mail, memo, hits "
+ "FROM spring_board where subject like '%'||'${likeThis}'||'%' "
+ " order by id desc )a )b WHERE b.page = #{page}";
// 해당 주제의 관련글 조회
@Select(SELECT_ROWS_BY_SUBJECT)
@ResultMap("queryResult")
public ArrayList<BoardBean> getSearchedList(@Param("page") int page, @Param("rowsPerPage") int rowsPerPage,
@Param("likeThis") String strSearchThis);
2) Dao : O
public int getTotalCntBySubject(String search) {
// TODO Auto-generated method stub
return boardMapper.getTotalCntBySubject(search);
}
public ArrayList<BoardBean> getSearchedList(int nStartPage, int list_num, String strSearchThis) {
// TODO Auto-generated method stub
return boardMapper.getSearchedList(nStartPage, list_num, strSearchThis);
}
3) Service : O
public int getTotalCntBySubject(String search) {
// TODO Auto-generated method stub
return boardDao.getTotalCntBySubject(search);
}
public ArrayList<BoardBean> getSearchedList(int nStartPage, int list_num, String strSearchThis) {
// TODO Auto-generated method stub
return boardDao.getSearchedList(nStartPage, list_num, strSearchThis);
}
4) Controller : O
//글검색 메소드를 지정하지않으면 POST,GET 둘다 가능하다
@RequestMapping(value="/listSearchBoard.do", method = RequestMethod.POST)
public String listSearchBoard(@RequestParam("searchStr") String searchStr, Model model) {
//redirect
return listSearched("1", searchStr, model); //처음에는 1페이지만 보여줌
}
//검색된 상태에서 특정 페이지로 이동하기
@RequestMapping(value="/listSearchBoard.do", method=RequestMethod.GET)
public String listSearched(
@RequestParam("pageForView")String pageForView,
@RequestParam("searchStr") String searchStr,
Model model) {
logger.info("listSearched called!");
// 익스플로러에서 주소부분 인코딩때문에
// String searchStr2="";
// try {
// searchStr2 = URLDecoder.decode(searchStr,"EUC-KR");
// } catch (UnsupportedEncodingException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
//
// int searchCnt = boardService.getTotalCntBySubject(searchStr2);
// ArrayList searchList = boardService.getSearchedList(pageForView, 5, searchStr2);
//
// model.addAttribute("searchCnt", searchCnt);
// try {
// searchStr = URLEncoder.encode(searchStr,"EUC-KR");
// } catch (UnsupportedEncodingException e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// model.addAttribute("searchStr",searchStr) ; // 페이징 때문에 계속 몰고 다닌다.
// model.addAttribute("pageForView",pageForView) ;
// model.addAttribute("boardList",searchList) ;
//
// return "searchBoard";
// }
model.addAttribute("totalCnt", new Integer(boardService.getTotalCntBySubject(searchStr)));
model.addAttribute("searchedList", boardService.getSearchedList(Integer.parseInt(pageForView), 5, searchStr));
model.addAttribute("pageForView", Integer.parseInt(pageForView));
model.addAttribute("searchStr", searchStr);
return "listSearchBoard";
}
5. View -- listSearchBoard.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="s" uri="http://www.springframework.org/tags"%>
<%@page session="false"%>
<%@page
import="com.example.demo.BoardBean, java.util.ArrayList, java.util.Properties, java.io.IOException,
java.io.FileInputStream, com.example.demo.PageNumberingManager "%>
<!DOCTYPE >
<html>
<head>
<meta charset="UTF-8">
<title>목록</title>
</head>
<body>
<c:set var="total_cnt" value="${totalCnt}" />
<c:set var="searchString" value="${searchStr}" />
<c:set var="pageForView" value="${pageForView}" />
<%
int total_cnt = ((Integer)(pageContext.getAttribute("total_cnt"))).intValue();
String searchStr = (String)pageContext.getAttribute("searchString");
int rowsPerPage =5;
int total_pages = PageNumberingManager.getInstance().getTotalPage(total_cnt, rowsPerPage);
pageContext.setAttribute("t_pages", total_pages);
%>
<table cellspacing=1 width=700 border=0>
<tr>
<td>총 게시물 수 <c:out value="${totalCnt}" /></td>
<td><p align="right">
페이지 :
<c:out value="${t_pages}" /></td>
</tr>
</table>
<table cellspacing=1 width=700 border=1>
<tr>
<td width=50><p align="center">번호</p></td>
<td width=100><p align="center">이름</p></td>
<td width=320><p align="center">제목</p></td>
<td width=100><p align="center">등록일</p></td>
<td width=100><p align="center">조회수</p></td>
</tr>
<c:forEach var="board" items="${searchedList}">
<tr>
<td width=50><p align="center">${board.id}</p></td>
<td width=100><p align="center">${board.name}</p></td>
<td width=320><p align="center">
<%-- <a href="viewWork.do?memo_id=${board.id}¤t_page=
<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}"> --%>
<a href="viewBoard.do?memo_id=${board.id}¤t_page=
<c:out value="${current_page}"/>&searchStr=None"title="${board.memo}">
<c:out value="${board.subject}" /></a></p></td>
<td width=100><p align="center"><c:out value="${board.created_date}" />
</p></td>
<td width=100><p align="center"><c:out value="${board.hits}" />
</p></td>
</tr>
</c:forEach>
</table>
<table cellspacing=1 width=700 border=1 >
<tr>
<td align="center">
<c:forEach var="i" begin="1" end="${t_pages}">
<a href="listSearchBoard.do?pageForView=${i}&searchStr=<c:out value="${searchStr}"/>">
[
<b><c:if test="${i==c_page}"></c:if>
${i}
<c:if test="${i==c_page}"></c:if></b>
]</a>
</c:forEach>
</td>
</tr>
</table>
<table width=700>
<tr>
<td><input type="button" value="전체목록으로돌아가기" onclick="window.location='listBoard.do?current_page=1'"></td>
</tr>
</table>
</body>
</html>