65. Spring으로 게시물 검색하기

hanahana·2022년 9월 14일
0

Spring 학원수강

목록 보기
20/45
post-thumbnail

list.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>
<link href="/resources/css/menubar-style.css" rel="stylesheet">
<meta charset="UTF-8">
<title>자유게시판</title>
</head>
<body>

	<header>
		<h1 align="center">Welcome Our WebSite!</h1>

		<!-- ${empty sessionScope.loginUser } -->
		<c:if test="${sessionScope.loginUser eq null}">
			<div class="login-area">
				<form action="/member/login.kh" method="post">
					<table align='right'>
						<tr>
							<td>아이디 :</td>
							<td><input type="text" name="memberId"></td>
							<td rowspan="2"><input type="submit" value="로그인"></td>
						</tr>
						<tr>
							<td>비밀번호 :</td>
							<td><input type="password" name="memberPw"></td>
							<td></td>
						</tr>
						<tr>
							<td colspan="3"><a href="/member/joinView.kh">회원가입</a></td>

						</tr>
					</table>

				</form>
			</div>
		</c:if>

		<!-- ${not empty sessionScope.loginUser } -->
		<c:if test="${sessionScope.loginUser ne null}">
			<div class="login-area">
				<table align="right">
					<tr>
						<td colspan="3" rowspan="2">${loginUser.memberName }님환영합니다</td>
					</tr>
					<tr>

					</tr>
					<tr>
						<td><a href="/member/myPage.kh">정보수정</a>
						<td><a href="/member/logout.kh">로그아웃</a></td>
					</tr>
				</table>
			</div>
		</c:if>

		<div class="nav-area">
			<div class="menu" onclick="location.href='/home.kh';">Home</div>
			<div class="menu" onclick="showNoticeList();">공지사항</div>
			<div class="menu" onclick="location.href='/board/list.kh';">자유게시판</div>
			<div class="menu" onclick="">사진게시판</div>
		</div>

		<script>
			function showNoticeList() {

			}
		</script>
	</header>

	<h1 align="center">게시글 목록</h1>
	<br>
	<br>
	<table align="center" border="1">
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>날짜</th>
			<th>조회수</th>
			<th>첨부파일</th>
		</tr>

		<c:forEach items="${bList }" var="board" varStatus="i">
			<tr>
				<td>${i.count }</td>
				
				<c:if test="${searchValue eq null }">
				<td><a href="/board/detail.kh?boardNo=${board.boardNo }">${board.boardTitle }</td>
				</c:if>
				
				<c:if test="${searchValue ne null }">
				<td><a href="/board/detail.kh?boardNo=${board.boardNo }&searchCondition=${searchCondition }&searchValue=${searchValue}">${board.boardTitle }</td>
				</c:if>
				
				<td>${board.boardWirter }</td>
				<td>${board.bCreateDate }</td>
				<td>${board.boardCount }</td>
				<c:if test="${!empty board.boardFile }">
					<td>O</td>
				</c:if>
				<c:if test="${empty board.boardFile }">
					<td>X</td>
				</c:if>
			</tr>
		</c:forEach>

	

			<tr align="center" height="20">
				<td colspan="6">
					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
						test="${startNavi ne 1 && startNavi > 0}">
						<a href="/board/list.kh?page=${startNavi-1 }">이전</a>
					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
						var="p" begin="${startNavi }" end="${endNavi }">
						<c:if test="${pageNow == p  }">
							<b>${p }</b>
						</c:if>
						<c:if test="${pageNow ne p}">
							<a href="/board/list.kh?page=${p }">${p }</a>
						</c:if>
					</c:forEach> <!-- 	endNavi가 maxPage와 같지 않을때만 출력 --> <c:if
						test="${endNavi < maxPage }">
						<a href="/board/list.kh?page=${endNavi+1 }">다음</a>
					</c:if>

				</td>
			</tr>
		

<!-- 검색창 구성-->
		<tr>
			<td colspan="4" align="center">
				<form action="/board/search.kh" method="get">
					<select name="searchCondition">
						<option value="all">전체</option>
						<option value="writer">작성자</option>
						<option value="title">제목</option>
						<option value="contents">내용</option>
					</select> 
					<input type="text" size="25" name="searchValue" required="required"> <input
						type="submit" value="검색">
				</form>
			</td>
			<td colspan="2" align="center">
				<button onclick="location.href='/board/writeView.kh';">글쓰기</button>
			</td>
		</tr>
<!-- 검색창 종료-->
	</table>

</body>
</html>
  • 리스트를 출력하는 jsp에 검색창을 만든다.
  • select를 이용하여 전체, 작성자, 제목, 목록을 고르고 text에 입력하면 submit으로 search.kh 컨트롤로로 전송한다.
  • searchCondintion으로 검색 카테고리를 seachValue로 검색어를 controller로 전달한다

Controller

/**
	 * 게시물 검색
	 * @param mv
	 * @param searchCondition
	 * @param searchValue
	 * @return
	 */
	@RequestMapping (value="/board/search.kh", method = RequestMethod.GET)
	public ModelAndView boardSearchList(ModelAndView mv,
			@RequestParam("searchCondition") String searchCondition,
			@RequestParam(value="page", required=false) Integer page, //페이징을 위한 매개변수
			@RequestParam("searchValue") String searchValue,
			HttpSession session) {
		try {
			session.removeAttribute("pageNow");
		
			
			/////////////////////////////////페이징시작//////////////////////////////
			int currentPage = (page != null) ? page: 1;
			int boardLimit = 10; //한 화면에 출력할 게시물 수
			
			
		List<Board> bList = bService.printAllByValue(searchCondition, searchValue, currentPage, boardLimit);
		if(!bList.isEmpty()) {
			

	
			
			int totalCount = bService.getTotalCount(searchCondition, searchValue);
			
			int naviLimit = 5; //한 화면에 출력할 게시판 페이지 수
			int maxPage; //게시판의 총 페이지 수
			int startNavi; //한 화면에 출력되는 게시판 페이지의 처음 수
			int endNavi;//한 화면에 출력되는 게시판 페이지의 마지막 수
			
			maxPage =(int)((double)totalCount/boardLimit+0.9);
			startNavi = ((int)((double)currentPage/naviLimit+0.9)-1)*naviLimit+1;
			endNavi=startNavi+naviLimit-1;
			
			//endNavi가 maxNavi보다 커지는 오류방지
			if(maxPage<endNavi) {
				endNavi = maxPage;
			}
			
			
			mv.addObject("startNavi",startNavi);
			mv.addObject("endNavi", endNavi);
			mv.addObject("maxPage",  maxPage);
			////////////////////////////////페이징종료///////////////////////////////////
			
			
			mv.addObject("bList",bList);
			
			session.setAttribute("pageNow", page);
			mv.addObject("searchValue",searchValue);
			mv.addObject("searchCondition",searchCondition);
			mv.setViewName("board/listView");
		}
		
		}catch (Exception e) {
			
			mv.addObject("msg",e.getMessage()).setViewName("/common/errorPage");
	
		
		}
		
	
		return mv;
	}
  • 검색어를받아 검색어를 다른 메소드로 넘기고 그 전달값을 List로 전달받고 게시물을 출력해준다.
  • 똑같이 게시물 리스트가 출력되기때문에 페이징을 해줘야 한다,
  • 페이징은 https://velog.io/@hana78786/63.-스프링으로-게시물-리스트-페이징하기 에서 확인할수있다.
  • 아까 jsp에서 받아온 searchCondintion와 seachValue를 전달값으로 보내야 한다.

Service Store Mapper

Service

@Override
	public List<Board> printAllByValue(String searchCondition, String searchValue, int currentPage, int boardLimit) {
		List<Board> bList = bStore.selectAllByValue(session,searchCondition, searchValue, currentPage,boardLimit);
		return bList;
	}
  • 페이징을 할 매개변수, 검색어와 검색 카테고를 담당하는 매개변수를 가지고 세션과 store로 보낸다

Store

@Override
	public List<Board> selectAllByValue(SqlSessionTemplate session, String searchCondition, String searchValue,  int currentPage, int boardLimit) {
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("searchCondition", searchCondition);
		paramMap.put("serchValue", searchValue);
		int offset = (currentPage-1)*boardLimit;
		RowBounds rowBounds = new RowBounds(offset, boardLimit);
		List<Board> bList = session.selectList("BoardMapper.selectAllByValue",paramMap, rowBounds);
		return bList;
	}
  • 페이징을 위해 가져온 currentPage, boardLimit는 RowBounds로 받아 select태그로 넘겨주면 자동으로 페이징처리를 한 게시물 목록만 전달해준다.
  • searchCondition, serchValue 라는 2개의 변수를 전달하기 위해 HashMap을 이용한다.
  • HashMap<전달할자료형, 전달할자료형> 변수명 = new HashMap<전달할자료형, 전달할자료형> 으로 구성된다.
    • paramMap.put("출력할이름", 값을담당할변수명); 의 방식으로 HashMap에 값을 저장한다.
  • List<Board> bList = session.selectList("BoardMapper.selectAllByValue",paramMap, rowBounds)
    • 여러개의 열을 List로 저장할것이기에 List를 선던해 값을 받는다. “”안에는 Mapper와 연결할 namespace와 id를 연결한다, 전달할매개변수, 페이징을 해주는 rowBounds 의 구성이 된다.

Mapper


	<select id="selectAllByValue" resultMap="boardResultMap">
		select * from board_tbl
		<where>
			<if test="searchCondition.toString() == 'title'">
			B_STATUS = 'Y' and BOARD_TITLE like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'writer'">
			B_STATUS = 'Y' and BOARD_WIRTER like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'contents'">
			B_STATUS = 'Y' and BOARD_CONTENTS like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'all'">
			B_STATUS = 'Y' and BOARD_CONTENTS like '%'|| #{serchValue} ||'%' or BOARD_WIRTER like '%'|| #{serchValue} ||'%' or BOARD_TITLE like '%'|| #{serchValue} ||'%'
			</if>
		</where>
	</select>
  • HashMap으로 저달한 매개변수를 변수명으로 사용할수있다.
  • searchCondition에 따라 where절이 달라지기때문에 if문을 사용했다.
    • searchCondition를 String으로 변환하여 그 값을 비교해야한다.
  • select * from board_tbl 뒤에 태그를 붙여 where절을 대신한다.
    • B_STATUS = 'Y' and BOARD_TITLE like '%'|| #{serchValue} ||'%'
      • like와 %%를 이용하면 일부 검색이 가능하다
      • ‘’ ||를 이용해야 한다
      • like ‘%검색어%’ 로 구성되야하기때문에 %에는 ‘’로 문자열임을 표시하고 ||를 이용하여 변수와 쿼리문을 연결한다.
      • where태그를 사용하기때문에 쿼리문에 where는 쓰지 않아도 괜찮다

Controller로 돌아가자

/**
	 * 게시물 검색
	 * @param mv
	 * @param searchCondition
	 * @param searchValue
	 * @return
	 */
	@RequestMapping (value="/board/search.kh", method = RequestMethod.GET)
	public ModelAndView boardSearchList(ModelAndView mv,
			@RequestParam("searchCondition") String searchCondition,
			@RequestParam(value="page", required=false) Integer page, //페이징을 위한 매개변수
			@RequestParam("searchValue") String searchValue,
			HttpSession session) {
		try {
			session.removeAttribute("pageNow");
		
			
			/////////////////////////////////페이징시작//////////////////////////////
			int currentPage = (page != null) ? page: 1;
			int boardLimit = 10; //한 화면에 출력할 게시물 수
			
			
		List<Board> bList = bService.printAllByValue(searchCondition, searchValue, currentPage, boardLimit);
		if(!bList.isEmpty()) {
			

	
			
			int totalCount = bService.getTotalCount(searchCondition, searchValue);
			
			int naviLimit = 5; //한 화면에 출력할 게시판 페이지 수
			int maxPage; //게시판의 총 페이지 수
			int startNavi; //한 화면에 출력되는 게시판 페이지의 처음 수
			int endNavi;//한 화면에 출력되는 게시판 페이지의 마지막 수
			
			maxPage =(int)((double)totalCount/boardLimit+0.9);
			startNavi = ((int)((double)currentPage/naviLimit+0.9)-1)*naviLimit+1;
			endNavi=startNavi+naviLimit-1;
			
			//endNavi가 maxNavi보다 커지는 오류방지
			if(maxPage<endNavi) {
				endNavi = maxPage;
			}
			
			
			mv.addObject("startNavi",startNavi);
			mv.addObject("endNavi", endNavi);
			mv.addObject("maxPage",  maxPage);
			////////////////////////////////페이징종료///////////////////////////////////
			
			
			mv.addObject("bList",bList);
			
			session.setAttribute("pageNow", page);
			mv.addObject("searchValue",searchValue);
			mv.addObject("searchCondition",searchCondition);
			mv.setViewName("board/listView");
		}
		
		}catch (Exception e) {
			
			mv.addObject("msg",e.getMessage()).setViewName("/common/errorPage");
	
		
		}
		
		//쿼리문 select * from board_tbl where b_status = 'Y' and board_title like '%'||#{searchValue}||'%';
		
		return mv;
	}
  • int totalCount = bService.getTotalCount(searchCondition, searchValue);
    • 페이징을 위한 totalCont의 매개변수값이 변경되었다.

totalcountService

@Override
	public int getTotalCount(String searchCondition, String searchValue) {
		int count = bStore.selectTotalCount(session, searchCondition, searchValue);
		return count;
	}

totalcountStore

@Override
	public int selectTotalCount(SqlSessionTemplate session, String searchCondition, String searchValue) {
		HashMap<String, String> paramMap = new HashMap<String, String>();
		paramMap.put("searchCondition", searchCondition);
		paramMap.put("serchValue", searchValue);
		int count = session.selectOne("BoardMapper.selectBoardCount",paramMap);
		return count;
	}

Mapper

<!-- 숫자 반환할거니까 resultTypeuploadFile="_int" 기억할것! -->
	<select id="selectBoardCount" resultType="_int">
		select count(*) from board_tbl
		<where>
			<if test="searchCondition.toString() == 'title'">
			B_STATUS = 'Y' and BOARD_TITLE like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'writer'">
			B_STATUS = 'Y' and BOARD_WIRTER like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'contents'">
			B_STATUS = 'Y' and BOARD_CONTENTS like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == 'all'">
			B_STATUS = 'Y' and BOARD_CONTENTS like '%'|| #{serchValue} ||'%' or BOARD_WIRTER like '%'|| #{serchValue} ||'%' or BOARD_TITLE like '%'|| #{serchValue} ||'%'
			</if>
			<if test="searchCondition.toString() == ''">
			B_STATUS = 'Y'
			</if>
		</where>

	</select>

List.kh

/**
	 * 게시물 리스트
	 * @param mv
	 * @param page
	 * @param session
	 * @return
	 */
	@RequestMapping(value="/board/list.kh", method =RequestMethod.GET)
	public ModelAndView boardList(ModelAndView mv,
			@RequestParam(value="page", required=false) Integer page,
			HttpSession session) {
		//@RequestParam(value="page", required=false)의 값은 page이지만 
		// required=false 필수값은 아니라는 뜻
		

		session.removeAttribute("pageNow");
		int currentPage = (page != null) ? page: 1;
		//현재 페이지
		//만약 page값이 없으면 기본형 1로 출력할것, 아니면 받아온 page의 값을 준다.
		//삼항연상자 사용
		
		int totalCount = bService.getTotalCount("", "");
		int boardLimit = 10; //한 화면에 출력할 게시물 수
		int naviLimit = 5; //한 화면에 출력할 게시판 페이지 수
		int maxPage; //게시판의 총 페이지 수
		int startNavi; //한 화면에 출력되는 게시판 페이지의 처음 수
		int endNavi;//한 화면에 출력되는 게시판 페이지의 마지막 수
		
		maxPage =(int)((double)totalCount/boardLimit+0.9);
		startNavi = ((int)((double)currentPage/naviLimit+0.9)-1)*naviLimit+1;
		endNavi=startNavi+naviLimit-1;
		
		//endNavi가 maxNavi보다 커지는 오류방지
		if(maxPage<endNavi) {
			endNavi = maxPage;
		}
		
		
		List<Board> bList = bService.printAllBoard(currentPage, boardLimit);

		if(!bList.isEmpty()) {
			mv.addObject("startNavi",startNavi);
			mv.addObject("endNavi", endNavi);
			mv.addObject("maxPage",  maxPage);
			mv.addObject("bList", bList);
			
		}
		
		session.setAttribute("pageNow", page);
		mv.setViewName("/board/listView");
		
		return mv;
		
		
		
	}
  • int totalCount = bService.getTotalCount("", "");
    • 이렇게 Count를 구할때 “”를 넣어주어 빈 String값을 전송해주어야 한다.
    • 이때는 <if test="searchCondition.toString() == ''"B_STATUS = 'Y'</if> 이 if문을 사용한 쿼리문을 이용하게 되어 정상 출력된다.

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>
<link href="/resources/css/menubar-style.css" rel="stylesheet">
<meta charset="UTF-8">
<title>자유게시판</title>
</head>
<body>

	<header>
		<h1 align="center">Welcome Our WebSite!</h1>

		<!-- ${empty sessionScope.loginUser } -->
		<c:if test="${sessionScope.loginUser eq null}">
			<div class="login-area">
				<form action="/member/login.kh" method="post">
					<table align='right'>
						<tr>
							<td>아이디 :</td>
							<td><input type="text" name="memberId"></td>
							<td rowspan="2"><input type="submit" value="로그인"></td>
						</tr>
						<tr>
							<td>비밀번호 :</td>
							<td><input type="password" name="memberPw"></td>
							<td></td>
						</tr>
						<tr>
							<td colspan="3"><a href="/member/joinView.kh">회원가입</a></td>

						</tr>
					</table>

				</form>
			</div>
		</c:if>

		<!-- ${not empty sessionScope.loginUser } -->
		<c:if test="${sessionScope.loginUser ne null}">
			<div class="login-area">
				<table align="right">
					<tr>
						<td colspan="3" rowspan="2">${loginUser.memberName }님환영합니다</td>
					</tr>
					<tr>

					</tr>
					<tr>
						<td><a href="/member/myPage.kh">정보수정</a>
						<td><a href="/member/logout.kh">로그아웃</a></td>
					</tr>
				</table>
			</div>
		</c:if>

		<div class="nav-area">
			<div class="menu" onclick="location.href='/home.kh';">Home</div>
			<div class="menu" onclick="showNoticeList();">공지사항</div>
			<div class="menu" onclick="location.href='/board/list.kh';">자유게시판</div>
			<div class="menu" onclick="">사진게시판</div>
		</div>

		<script>
			function showNoticeList() {

			}
		</script>
	</header>

	<h1 align="center">게시글 목록</h1>
	<br>
	<br>
	<table align="center" border="1">
		<tr>
			<th>번호</th>
			<th>제목</th>
			<th>작성자</th>
			<th>날짜</th>
			<th>조회수</th>
			<th>첨부파일</th>
		</tr>

		<c:forEach items="${bList }" var="board" varStatus="i">
			<tr>
				<td>${i.count }</td>
				
				<c:if test="${searchValue eq null }">
				<td><a href="/board/detail.kh?boardNo=${board.boardNo }">${board.boardTitle }</td>
				</c:if>
				
				<c:if test="${searchValue ne null }">
				<td><a href="/board/detail.kh?boardNo=${board.boardNo }&searchCondition=${searchCondition }&searchValue=${searchValue}">${board.boardTitle }</td>
				</c:if>
				
				<td>${board.boardWirter }</td>
				<td>${board.bCreateDate }</td>
				<td>${board.boardCount }</td>
				<c:if test="${!empty board.boardFile }">
					<td>O</td>
				</c:if>
				<c:if test="${empty board.boardFile }">
					<td>X</td>
				</c:if>
			</tr>
		</c:forEach>

		<!-- 검색/ 일반 페이징 c:if -->

		<!--  일반 페이징 시작 -->
		<c:if test="${searchValue eq null }">
			<tr align="center" height="20">
				<td colspan="6">
					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
						test="${startNavi ne 1 && startNavi > 0}">
						<a href="/board/list.kh?page=${startNavi-1 }">이전</a>
					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
						var="p" begin="${startNavi }" end="${endNavi }">
						<c:if test="${pageNow == p  }">
							<b>${p }</b>
						</c:if>
						<c:if test="${pageNow ne p}">
							<a href="/board/list.kh?page=${p }">${p }</a>
						</c:if>
					</c:forEach> <!-- 	endNavi가 maxPage와 같지 않을때만 출력 --> <c:if
						test="${endNavi < maxPage }">
						<a href="/board/list.kh?page=${endNavi+1 }">다음</a>
					</c:if>

				</td>
			</tr>
		</c:if>

		<!--  검색 페이징 시작 -->
		<c:if test="${searchValue ne null }">
		<input type="hidden" name="searchCondition" value="${searchCondition }">
		<input type="hidden" name="searchValue" value="${searchValue}">
			<tr align="center" height="20">
				<td colspan="6">
					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
						test="${startNavi ne 1 && startNavi > 0}">
						<a
							href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${startNavi-1 }">이전</a>
					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
						var="p" begin="${startNavi }" end="${endNavi }">
						<c:if test="${pageNow == p  }">
							<b>${p }</b>
						</c:if>
						<c:if test="${pageNow ne p}">
							<a
								href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${p }">${p }</a>
						</c:if>
					</c:forEach> <!-- 	endNavi가 maxPage와 같지 않을때만 출력 --> <c:if
						test="${endNavi < maxPage }">
						<a
							href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${endNavi+1 }">다음</a>
					</c:if>

				</td>
			</tr>
		</c:if>

		<!--  일반/ 검색용 페이징 종료 -->

		<tr>
			<td colspan="4" align="center">
				<form action="/board/search.kh" method="get">
					<select name="searchCondition">
						<option value="all">전체</option>
						<option value="writer">작성자</option>
						<option value="title">제목</option>
						<option value="contents">내용</option>
					</select> <input type="text" size="25" name="searchValue" required="required"> <input
						type="submit" value="검색">
				</form>
			</td>
			<td colspan="2" align="center">
				<button onclick="location.href='/board/writeView.kh';">글쓰기</button>
			</td>
		</tr>
	</table>

</body>
</html>
  • 검색이나 일반 페이지나 같은 jsp에 접속하고있기때문에 검색으로 접속했을때와 일반적으로 접속했을때의 페이징을 c:if문으로 구분하였다.
		<!-- 검색/ 일반 페이징 c:if -->

		<!--  일반 페이징 시작 -->
		<c:if test="${searchValue eq null }">
			<tr align="center" height="20">
				<td colspan="6">
					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
						test="${startNavi ne 1 && startNavi > 0}">
						<a href="/board/list.kh?page=${startNavi-1 }">이전</a>
					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
						var="p" begin="${startNavi }" end="${endNavi }">
						<c:if test="${pageNow == p  }">
							<b>${p }</b>
						</c:if>
						<c:if test="${pageNow ne p}">
							<a href="/board/list.kh?page=${p }">${p }</a>
						</c:if>
					</c:forEach> <!-- 	endNavi가 maxPage와 같지 않을때만 출력 --> <c:if
						test="${endNavi < maxPage }">
						<a href="/board/list.kh?page=${endNavi+1 }">다음</a>
					</c:if>

				</td>
			</tr>
		</c:if>

		<!--  검색 페이징 시작 -->
		<c:if test="${searchValue ne null }">
		<input type="hidden" name="searchCondition" value="${searchCondition }">
		<input type="hidden" name="searchValue" value="${searchValue}">
			<tr align="center" height="20">
				<td colspan="6">
					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
						test="${startNavi ne 1 && startNavi > 0}">
						<a
							href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${startNavi-1 }">이전</a>
					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
						var="p" begin="${startNavi }" end="${endNavi }">
						<c:if test="${pageNow == p  }">
							<b>${p }</b>
						</c:if>
						<c:if test="${pageNow ne p}">
							<a
								href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${p }">${p }</a>
						</c:if>
					</c:forEach> <!-- 	endNavi가 maxPage와 같지 않을때만 출력 --> <c:if
						test="${endNavi < maxPage }">
						<a
							href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${endNavi+1 }">다음</a>
					</c:if>

				</td>
			</tr>
		</c:if>

		<!--  일반/ 검색용 페이징 종료 -->
  • 검색으로 넘어왔을때는 전달값을 searchValue받아올것이기때문에 <c:if test="${searchValue eq null }"> 를 이용하여 구분해주었다.
  • <a href="/board/search.kh?searchCondition=${searchCondition}&searchValue=${searchValue}&page=${p }">${p }</a>
    • 페이지를 연결하는 경로는 ?= 를 활용하여 searchConditionsearchValue 를 주면 아까 작성했던 serch.kh 컨트롤러에 의해 페이지값이 계산되어 원하는 페이지가 추력된다.

검색한 게시물을 클릭해서 상세페이지에서 목록누른후 검색페이지로 돌아가기

<%@ 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>${board.boardTitle }</title>
<link href="/resources/css/menubar-style.css" rel="stylesheet">

</head>
<body>
<header>
	<h1 align="center">Welcome Our WebSite!</h1>

	<!-- ${empty sessionScope.loginUser } -->
	<c:if test="${sessionScope.loginUser eq null}">
		<div class="login-area">
			<form action="/member/login.kh" method="post">
				<table align='right'>
					<tr>
						<td>아이디 :</td>
						<td><input type="text" name="memberId"></td>
						<td rowspan="2"><input type="submit" value="로그인"></td>
					</tr>
					<tr>
						<td>비밀번호 :</td>
						<td><input type="password" name="memberPw"></td>
						<td></td>
					</tr>
					<tr>
						<td colspan="3"><a href="/member/joinView.kh">회원가입</a></td>

					</tr>
				</table>

			</form>
		</div>
	</c:if>

	<!-- ${not empty sessionScope.loginUser } -->
	<c:if test="${sessionScope.loginUser ne null}">
		<div class="login-area">
			<table align="right">
				<tr>
					<td colspan="3" rowspan="2">${loginUser.memberName }님환영합니다</td>
				</tr>
				<tr>
					
				</tr>
				<tr>
				<td ><a href="/member/myPage.kh">정보수정</a>
					<td ><a href="/member/logout.kh">로그아웃</a></td>
				</tr>
			</table>
		</div>
	</c:if>

	<div class="nav-area">
		<div class="menu" onclick="location.href='/home.kh';">Home</div>
		<div class="menu" onclick="showNoticeList();">공지사항</div>
		<div class="menu" onclick="location.href='/board/list.kh';">자유게시판</div>
		<div class="menu" onclick="">사진게시판</div>
	</div>

	<script>
		function showNoticeList() {

		}
	</script>
	</header>
	
	
	
		<table align="center" border="1">
			<tr>
				<td>제목</td>
				<td>${board.boardTitle }</td>
			</tr>
			<tr>
				<td>작성자</td>
				<td>${board.boardWirter }</td>
				
	
			</tr>
			<tr>
				<td>작성일</td>
				<td>${board.bCreateDate }</td>
			</tr>
			<tr>
				<td>내용</td>

				<td>
						${board.boardContents }
						<br>
						
						<c:if test="${board.boardRename ne null}">
						<img alt="본문이미지" src="/resources/buploadFiles/${board.boardRename }">

						</c:if>
						</td>
			</tr>
		
			<tr>
				<td colspan="2"><input type="button" value="수정" onclick="location.href='/board/modifyView.kh?boardNo=${board.boardNo}';"> 
				
				
				<!--검색/일반의 경우 목록주소 -->
				<!-- 일반으로 상세 진입시 목록 -->
				<c:if test="${empty searchValue  }">
				<button type="button" onclick="location.href='/board/list.kh?page=${pageNow }';">목록</button>
				</c:if>
				<!-- 검색 으로 상세 진입시 -->
				<c:if test="${searchValue ne null }">
				<button type="button" onclick="location.href='/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${pageNow }';">목록</button>
				</c:if>
				<!-- 목록주소 태그 종료 -->
				
				<button type="button" onclick="remove()">삭제</button>
				</td>
			</tr>

		</table>

	</form>
	
	<script>
		function remove() {
			event.preventDefault(); // 하이퍼링크 이동방지
			if(window.confirm("게시물을 삭제하시겠습니까?")){
			location.href='/board/remove.kh';
						
			}
			
			
		}
	
	</script>
	

</body>
</html>
  • 목록으로 돌아갈 태그만 생각해보면된다
<!--검색/일반의 경우 목록주소 -->
				<!-- 일반으로 상세 진입시 목록 -->
				<c:if test="${empty searchValue  }">
				<button type="button" onclick="location.href='/board/list.kh?page=${pageNow }';">목록</button>
				</c:if>
				<!-- 검색 으로 상세 진입시 -->
				<c:if test="${searchValue ne null }">
				<button type="button" onclick="location.href='/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${pageNow }';">목록</button>
				</c:if>
				<!-- 목록주소 태그 종료 -->
  • serchValue를 받아오면 검색에서 진입 아니면 일반 진입이라고 구분한다.
  • 검색 List에서 searchCondition, searchValue값을 가지고 온 뒤 목록버튼에도 =?를 통해 똑같이 적용해주면된다.
  • 검색 List를 확인하면..
    <c:if test="${searchValue ne null }">
    		<input type="hidden" name="searchCondition" value="${searchCondition }">
    		<input type="hidden" name="searchValue" value="${searchValue}">
    			<tr align="center" height="20">
    				<td colspan="6">
    					<!-- 	startNavi가 1일이 아닐때만 출력 --> <c:if
    						test="${startNavi ne 1 && startNavi > 0}">
    						<a
    							href="/board/search.kh?searchCondition=${searchCondition }&searchValue=${searchValue}&page=${startNavi-1 }">이전</a>
    					</c:if> <!-- p는 기준을 삼을 임시변수 startNavi부터 시작해 endNavi까지 출력한다 --> <c:forEach
    						var="p" begin="${startNavi }" end="${endNavi }">
    						<c:if test="${pageNow == p  }">
    							<b>${p }</b>
    						</c:if>
    • hidden을 이용해 해당 값을 저장해 둔것을 확인할수있다.

      				<c:if test="${searchValue eq null }">
      				<td><a href="/board/detail.kh?boardNo=${board.boardNo }">${board.boardTitle }</td>
      				</c:if>
      				
      				<c:if test="${searchValue ne null }">
      				<td><a href="/board/detail.kh?boardNo=${board.boardNo }&searchCondition=${searchCondition }&searchValue=${searchValue}">${board.boardTitle }</td>
      				</c:if>
    • 게시물 상세페이지와 연결할 a태그에서도 검색에서 진입했다면 searchCondition, searchValue를 가지고 상세페이지로 이동할수있도록 하였다.

  • 상세게시물에서 내가 원래 있던 페이지로 이동하는 방법은 https://velog.io/@hana78786/64.-spring으로-게시물-삭제하기#다시-controller로 에서 확인할수있다.
profile
hello world

0개의 댓글