-
210712_1~210713_1(SpringBoot)Spring 2021. 7. 12. 18:00
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>
'Spring' 카테고리의 다른 글
210709_1(Spring3_MyBatis 글목록부터) (0) 2021.07.09 210708_1(Spring3_MyBatis) (0) 2021.07.08 210707_1(Springmvc+iBatis, xml을 이용하는방법) (0) 2021.07.07 210706_1(iBatis) (0) 2021.07.06 210705_2(iBatis) (0) 2021.07.05