상세보기 하고 다시 리스트 갈때 보던 화면으로 넘어가기 배운다.

<td><a href="/board/detail.kh?boardNo=${board.boardNo}&page=${currentPage }">${board.boardTitle }</a></td>

넘어갈때 검색할 no번호 옆에다가 현재페이지 정보도 같이 보낸다.

///board/list.kh?page=${currentPage } 현재 페이지를 화면에서 가져올때 받는 부분
		List<Board> bList = bService.printAllBoard(currentPage, limit); //
		if (!bList.isEmpty()) {
			mv.addObject("urlVal","list");//전체 리스트 출력할때 페이지란 것
			mv.addObject("currentPage", currentPage);
			mv.addObject("maxPage", maxPage);
			mv.addObject("startNavi", startNavi);
			mv.addObject("endNavi", endNavi);
			mv.addObject("bList", bList);
		}
		mv.setViewName("board/listView");
		return mv;

mv.addObject("urlVal","list");//전체 리스트 출력할때 페이지란 것
mv.addObject("currentPage", currentPage); ///보내준 정보를 사용하는 것

controller에서 리스트 출력할때 화면에 페이지 관련  주문을 urlVal로 했다.

	//검색값이 있을때와 없을때를 if문으로 구별했다.
				mv.addObject("urlVal","search");
				// 화면 페이지 진행할대 search값이라고 전달한다.
				mv.addObject("searchCondition", searchCondition);
				mv.addObject("searchValue", searchValue);
				//써치 조건에 대한 값의 페이지 구성여부도 알려준다.
				mv.addObject("maxPage", maxPage);
				mv.addObject("currentPage", currentPage);
				mv.addObject("startNavi", startNavi);
				mv.addObject("endNavi", endNavi);
				mv.setViewName("board/listView");

여기는 검색 controller부분이다.....이렇게 각마다 페이지 구성을 해줄수 있을듯하다.

	<c:if test="${startNavi !=1}">
						<a href="/board/{urlVal}.kh?page=${startNavi - 1 }">[이전]</a>
						<!--이전페이지가 0부터 계산되는 것을 막으려고..  -->
					</c:if>
						<c:forEach var="p" begin="${startNavi }" end="${endNavi }">
						<!--현재페이지 일경우 진한게 표시하기.  -->
							<c:if test="${currentPage eq p }">
								<b>${p }</b>
							</c:if>
							
							<c:if test="${currentPage ne p }">
								<a href="/board/${urlVal }.kh?page=${p }&searchCondition=${searchCondition}&searchValue=${searchValue}">
								${p }</a>
							</c:if>					
						</c:forEach>
					
					<c:if test="${maxPage > currentPage }">
						<a href="/board/${urlVal }.kh?page=${endNavi+1 }">[다음]</a>
					</c:if>

 

<a href="/board/${urlVal }.kh?page=${p }&searchCondition=${searchCondition}&searchValue=${searchValue}"

a태그 href주소부분을 보면 변경처리 확인된다. 저기서 mv에서 값을 받아오는 것을 쓰는것이다.

html주소 라인을 보면 정보가 확인된다.

jsp 화면에 if문을 넣는다.

<c:if test="${empty BList }">
		<c:forEach items="${bList }" var="board" varStatus="i">
			<tr>
				<td>${i.count }</td>
				<td><a href="/board/detail.kh?boardNo=${board.boardNo}">${board.boardTitle }</a></td>
				<td>${board.boardWriter }</td>
				<td>${board.bCreateDate }</td>				
				<td>${board.boardCount }</td>
				<td>${board.boardFilename }</td>
				<td>
					<c:if test="${!empty board.boardFilename }">
						O
					</c:if>
					<c:if test="${empty board.boardFilename }">
						X
					</c:if>
				</td>
			</tr>
		</c:forEach>
			<tr align="center" height="20">			
				<td colspan="7">
					<c:if test="${startNavi !=1}">
						<a href="/board/list.kh?page=${startNavi - 1 }">[이전]</a>
						<!--이전페이지가 0부터 계산되는 것을 막으려고..  -->
					</c:if>
						<c:forEach var="p" begin="${startNavi }" end="${endNavi }">
						<!--현재페이지 일경우 진한게 표시하기.  -->
							<c:if test="${currentPage eq p }">
								<b>${p }</b>
							</c:if>
							
							<c:if test="${currentPage ne p }">
								<a href="/board/list.kh?page=${p }">${p }</a>
							</c:if>					
						</c:forEach>
					<c:if test="${maxPage-1 > currentPage }">
						<a href="/board/list.kh?page=${endNavi+1 }">[다음]</a>
						<%-- <a href="/board/list.kh?page=${currentPage+5 }">[다음]</a>--%>
					</c:if>		
				</td>				
			</tr>
	
		</c:if>
		<!-- 검색list값이 없을경우  -->
		<c:if test="${!empty BList }">
			<tr>
				<td colspan="7" align="center">데이터가 존재하지 않습니다.</td>
			</tr>
		</c:if>

페이징안쪽으로 if와 else에 해당하는 구문을 넣는다.

 

try {
			List<Board> bList = bService.printAllByValue(searchCondition, searchValue,currentPage, limit);
			if (!bList.isEmpty()) {
				mv.addObject("bList", bList);
			}else {
				mv.addObject("bList", null);
			}
				mv.addObject("maxPage", maxPage);
				mv.addObject("currentPage", currentPage);
				mv.addObject("startNavi", startNavi);
				mv.addObject("endNavi", endNavi);
				mv.setViewName("board/listView");

controller에도 리스트를 줄지 null을 전달할지 작성해준다.

<select name="searchCondition">
			 			<option value="all">전체</option>
			 			<option value="writer">작성자</option>
			 			<option value="title" selected>제목</option>
			 			<option value="contents">내용</option>
			 		</select>

option 에 기본값은 selected를 주면 된다....전체를 기본값줄려면 전체 칸으로 옮겨 주면 된다.

<form action="/board/search.kh" method="get">
		<select name="searchCondition">
			<option value="all" <c:if test=" test="${searchCondition eq 'all' }">selected</c:if>전체</option>
			<option value="writer">작성자</option>
			<option value="title">제목</option>
			<option value="contents">내용</option>
		</select>
		<input type="text" name="searchValue" value="${searchValue }>
		<button type="submit" value="검색">검색</button>
</form>

검색칸에 내가 진행한 데이터가 남아 있게 할때...

option 칸마다 if문을 넣으면 된다.

조건문으로 DB를 검색해야한다....

<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" name="searchValue">
			 		<button type="submit" value="검색">검색</button>
			 	</form>

먼저lselct값의 분류 값과 input에서  입력값을 같이 매핑시 전달해야하는데

클래스를 계속만들면 복잡하니깐 hashMap을 사용해서 한번에 그냥 전달했다....

그다음 조건문!

STORELOGIC에서 먼저 했다.물론controller에서 해도 된다.

	@Override
	public List<Board> selectAllByValue(SqlSessionTemplate session, String searchCondition, String searchValue,int currentPage, int limit) {
		int offset=(currentPage-1)*limit;
		RowBounds rowBounds = new RowBounds(offset, limit);
		HashMap<String, String > paramMap=new HashMap<String, String>();
		//검색시 데이터가 2개인데 같이 전송할수가 없다.
		//해시맵을 사용해 2개를 한개로 묶는다. 아니면 클래스 사용해서 진행해야함 mybatis에서 했음
		paramMap.put("searchCondition",searchCondition);
		paramMap.put("searchValue",searchValue);
		String mapping=null;
		 switch(searchCondition){
		 case "writer":
			mapping="BoardMapper.selectAllByWriter";
			break;
		 case "title":
			 mapping="BoardMapper.selectAllByTitle";
				break;
		 case "contents":
				mapping="BoardMapper.selectAllByContents";
				break;
			default:
				mapping="BoardMapper.selectAllByContents";
				break;
			 
		}
		
		List<Board> bList=session.selectList(mapping, paramMap,rowBounds);
		return bList;
	}

2번째는 매핑이다. 조건문을 하고 나니 출력할 데이터의 페이징이 문제가 되었다.

			<select id="selectAllByValue" resultMap="boardResultMap">
SELECT * FROM BOARD_TBL
<where>
<if test="searchCondition.toString() == 'title'"> BOARD_TITLE LIKE '%'||#{searchValue}||'%' </if>
<if test="searchCondition.toString() == 'contents'"> BOARD_CONTENTS LIKE '%'||#{searchValue}||'%' </if>
<if test="searchCondition.toString() == 'writer'"> BOARD_WRITER LIKE '%'||#{searchValue}||'%' </if>
<if test="searchCondition.toString() == 'all'"> BOARD_TITLE LIKE '%'||#{searchValue}||'%' OR BOARD_CONTENTS LIKE '%'||#{searchValue}||'%' OR BOARD_WRITER LIKE '%'||#{searchValue}||'%' </if>
AND B_STATUS = 'Y'
</where>
</select>

반영한 controller

	@RequestMapping(value = "/board/search.kh", method = RequestMethod.GET)
	public ModelAndView boardSearchList(ModelAndView mv
			, @RequestParam("searchCondition") String searchCondition // select
			, @RequestParam("searchValue") String searchValue  // input
			, @RequestParam(value = "page", required = false) Integer page) {


		int currentPage = (page != null) ? page : 1;		
		int totalCount = bService.getTotalCount(searchCondition, searchValue); 
        // 분류전체게시물의 갯수가 필요함.
		int limit = 10; // 한페이지당 보여주고 싶은 게시물의 갯수 //이것은 프론트에서 Param에서 받아올수 있다.
		int naviLimit = 5; // 몇개의 페이지씩 표기할것인가.....[이전]1 2 3 4 5[다음]
		int maxPage;
		int startNavi;
		int endNavi;
		// 23/5 = 4.8+0.9=5(.7)=5 페이지 갯수구하는 것 무조건 올림해야한다.
		maxPage = (int) ((double) totalCount / limit + 0.9);
		startNavi = ((int) ((double) currentPage / naviLimit + 0.9) - 1) * naviLimit + 1;
		endNavi = startNavi + naviLimit - 1; // 처음과 끝만 알면 나머지는 FOR문이 한다.
		if (maxPage < endNavi) {
			endNavi = maxPage;
		}
        //페이징 부분
		try {
			List<Board> bList = bService.printAllByValue(searchCondition, searchValue,currentPage, limit);
			if (!bList.isEmpty()) {
				mv.addObject("bList", bList);
				mv.addObject("maxPage", maxPage);
				mv.addObject("currentPage", currentPage);
				mv.addObject("startNavi", startNavi);
				mv.addObject("endNavi", endNavi);
				mv.setViewName("board/listView");
			}
		} catch (Exception e) {
			mv.addObject("msg", e.toString()).setViewName("common/errorPage");
		}
		return mv;
	}

 

 

<tr align="center" height="20">
			<td colspan="6">
				<c:if test="${currentPage != 1 }">
					<a href="/board/list.kh?page=${currentPage - 1 }">[이전]</a>
				</c:if>
				<c:forEach var="p" begin="${startNavi }" end="${endNavi }">
					<c:if test="${currentPage eq p }">
						<b>${p }</b>
					</c:if>
					<c:if test="${currentPage ne p }">
						<a href="/board/list.kh?page=${p }">${p }</a>
					</c:if>
				</c:forEach>
				<c:if test="${maxPage > currentPage }">
					<a href="/board/list.kh?page=${currentPage + 1 }">[다음]</a>
				</c:if>
			</td>
		</tr>

지금 니가 보는것이 몇페이진가..........ㅋㅋ

내가 보고 있는 페이지가 진하게 표시된다.

 

<body>
	<h1 align="center">${board.boardNo }번 게시글 수정하기</h1>
	<br><br>
	<form action="/board/modify.kh" method="post" enctype="multipart/form-data">
		<input type="hidden" name="boardNo" value="${board.boardNo }">
		<input type="hidden" name="boardFilename" value="${board.boardFilename }"> 
		<input type="hidden" name="boardFileRename" value="${board.boardFileRename }">
		
		<table align="center" border="1">
			<tr>			
				<td>제목</td>
				<td><input type="text" name="boardTitle" value="${board.boardTitle }"></td>
			</tr>
			<tr>			
				<td>작성자</td>
				<td><input type="text" name="boardWriter" value="${board.boardWriter }" readonly></td>
			</tr>
			<tr>			
				<td>내용</td>
				<td><textarea  cols="30" rows="7" name="boardContents" >${board.boardContents }</textarea></td>
				<!--textarea는 value이 없어서 태그사이에 값으로 넣어준것임.  -->
			</tr>
			<tr>			
				<td>첨부파일</td>  <!--첨부파일에는 value값이 없다  -->
				<td><input type="file" name="reloadFile" >
					<a href="#">${board.boardFilename }</a>
				</td>
			</tr>
			<tr>			
				<td colspan="2">
					<input type="submit" value="수정">
					<a href="/board/list.kh">목록으로</a>
					<a>이전 페이지로</a>
				</td>
			</tr>
		</table>
	</form>

</body>​

게시글 수정하기....그중 포인트는 첨부파일이다.

처음 등록할때 name이 uploadFile이였는데 수정안해서 오류 발생했다....

	public ModelAndView boardModify(@ModelAttribute Board board
			,ModelAndView mv
			, @RequestParam(value="reloadFile",required=false)MultipartFile reloadFile //위에서 upload였는데 여기선 reloadFile로 변경
			, HttpServletRequest request) {
		try {
			String boardFilename=reloadFile.getOriginalFilename();
			if(reloadFile !=null && !boardFilename.equals("")) {
				//파일 이 있거나, 파일명이 있을때
				// 수정방법 = 1, 대체 2, 삭제 후 저장  ==>삭제후 저장이 오히려 편함
				//파일 경로를 알아야 한다. 리케스트 필요 httpHttpServletRequest request
				//파일 삭제
				String root=request.getSession().getServletContext().getRealPath("resources");
				String savedPath = root + "\\buploadFiles";
				// 파일이름을 갖고 오고자 db로 갈필요는 없음. 이 jsp에 board 자료가 있음
				
				File file= new File(savedPath+"\\"+board.getBoardFileRename());//file.io 
				if(file.exists()) { //파일이 정말 있는지 확인
					file.delete(); //파일 지움
				}
				//삭제 했으니깐 다시 저장
				SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
				String boardFileRename=sdf.format(new Date(System.currentTimeMillis()))+"."
						+boardFilename.substring(boardFilename.lastIndexOf(".")+1); 
				//substring 때문에 1을 더한것임
				//lastIndexOf(".")은 파일.뒤의 확장자 구하는 것이다.
				String boardFilepath=savedPath+"\\"+boardFileRename;
				reloadFile.transferTo(new File(boardFilepath));
		

				board.setBoardFilename(boardFilename);				
				board.setBoardFileRename(boardFileRename);
				board.setBoardFilepath(boardFilepath);
			}
			int result=bService.modifyBoard(board);
			mv.setViewName("redirect:/board/list.kh");
		}catch(Exception e) {
			mv.addObject("msg", e.toString()).setViewName("common/errorPage");
		}
		return mv;

param으로 첨부파일 가져올때 명칭 조심!

파일삭제할때 위치한 폴더는 getRealPath("resources")인가보다....타이핑 치다보면 계속 놓친다.

파일 저장은 위에서 복사 넣기 인데  여기서 필요 없는 부분도 많으니깐 잘 보고 가져오기!!!

<update id="updateBoard">
		UPDATE BOARD_TBL SET BOARD_TITLE=#{boardTitle}, BOARD_CONTENTS=#{boardContents},
        BOARD_FILENAME=#{boardFilename},BOARD_RENAME=#{boardFileRename}, 
        BOARD_FLIEPATH=#{boardFilepath} , B_UPDATE_DATE=DEFAULT WHERE BOARD_NO=#{boardNo}
	</update>

매핑 할때 오타와 기호 조심///////, 빼먹었더니........난리다 난리....

이렇게 첨부파일 수정하였음

이전 /다음 /처리 

 

 

<tr align="center" height="20">
<td colspan="6">
<c:if test="${startNavi !=1}">
<a href="/board/list.kh?page=${startNavi - 1 }">[이전]</a>

</c:if>
    <c:forEach var="p" begin="${startNavi }" end="${endNavi }">
    <a href="/board/list.kh?page=${p }">${p }</a>
    </c:forEach>
<c:if test="${maxPage-1 > currentPage }">
<a href="/board/list.kh?page=${endNavi+1 }">[다음]</a>
<%-- <a href="/board/list.kh?page=${currentPage+5 }">[다음]</a>--%>
</c:if>
</td>

 

 

if 문으로 가능하다.

 

이날 한게 많은데...넘많아서...못올린다..

이미지를 td안에 넣었더니 처음 주었던 300px에 오바가 되서 엄청 크게 나온다.

style값을 주었다.

줄어 들었다.^^

'CSS' 카테고리의 다른 글

flex박스...화면정렬 정리  (0) 2022.08.27
마우스 커서 이벤트  (0) 2022.08.25
로그인폼 만들기  (0) 2022.08.25
메뉴바 반응 관련  (0) 2022.08.25
포지션 관련 문제. 화면에 위치 잡는것  (0) 2022.08.25

배웠는데 너무 새로운 페이징.....jsp스쳐지나갔다.....

스프링으로 새롭게...

이제 실제 적용 시....게시판 리스트를 출력하자....

리스트 데이터를 받아서 출력하는 부분과 페이징 부분을 출력하는 부분......

CONTROLLER 페이징 처리와 리스트 가져오는 것을 동시에 함.

SERVICE에서 SESSION 가져오는 건 생략함......

중요한것은 STORE에서  RowBounds 자동처리 하는 것 으로 이렇게하면 단순 전체리스트 가져오는 쿼리 매핑 부분에는 변함없이 그냥 자동으로 처리해준다.

 

자동으로 막올라간다......ㅋㅋㅋㅋ

1. 앞선 진행한 null값 ..화면에서 value 없을때 null로 처리 할수 있는 방법. 자동으로 DB에 NULL로 입력된다....완전 편해지는 거지....

 

2. 폴더의 위치가 길어지면 코드가 지저분해짐으로 별칭을 정해서 별칭만 입력하면 되므로 편해진다.

이렇게 단축시쳐줌....이걸할때 한가지 더했는데

Member라는 객체가 파라미터 값으로 올꺼라구 선안내 해준것이다 String이면 String 으로 작성하면 되는데,,,,int값일 경우에는 기재하는 방법은 위에 기재했으로 꼭 참고 해야한다^^

 

+ Recent posts