#TIL, JSP 게시판, list 페이징

Yimy·2021년 1월 4일
0

Web

목록 보기
5/6

1. ListResult : Pojo, Java Bean

원하는 데이터가 담긴 객체를 만들어서, 사용하면 편리함!

public class ListResult {
	private int currentPage;
	private long totalCount;
	private int pageSize;s
	private List<Board> list;//보드 DB내용을 담아오는 리스트.
	private long totalPageCount;
	
	public ListResult() {} // 디폴트 생성자도 만들어두기(톰캣에서 사용할수있음)
	
	public ListResult(int currentPage, long totalCount, int pageSize, List<Board> list) {
       // 이 생성자 내용대로 만들면, 모든 내용이 담긴 객체가 됨. 
		this.currentPage = currentPage;
		this.totalCount = totalCount;
		this.pageSize = pageSize;
		this.list = list;
		this.totalPageCount = calTotalPageCount();
	}
	private long calTotalPageCount() {
		long tpc = totalCount/pageSize; 
		if(totalCount%pageSize != 0) tpc++;
		return tpc;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public long getTotalCount() {
		return totalCount;
	}
	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}
	public int getPageSize() {
		return pageSize;
	}
	public void setPageSize(int pageSize) {
		this.pageSize = pageSize;
	}
	public List<Board> getList() {
		return list;
	}
	public void setList(List<Board> list) {
		this.list = list;
	}
	public long getTotalPageCount() {
		return totalPageCount;
	}
	public void setTotalPageCount(long totalPageCount) {
		this.totalPageCount = totalPageCount;
	}
}

2. Controller.list() 메소드

private void list(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		           // 페이징에서는 session에 set, get으로 값을 설정.
                   
		// (1) Current Page : cp
		int cp = 1; //일단 cp를 1이라고 설정
		String cpStr = request.getParameter("cp");
		String psStr = request.getParameter("ps");
                   //get방식으로 넘어온 cp와 ps를 받아옴.
		//board.do?m=list&cp=?&ps=? 형태로 넘어옴.
		HttpSession session = request.getSession(true);//세션을 가져온다.
		if(cpStr == null) { // 따로 파라미터로 입력 들어온 값이 없으면,
			Object cpObj = session.getAttribute("cp");
                        // 원래 세션에 입력되어있던 cp값을 가져와서 cpObj 로 만듦.
			if(cpObj != null) cp=(Integer)cpObj;
                        // 그리고 cpObj에 값이 있으면, int로 형변환해서 cp에 대입함.
		}else {// cpStr에 입력된 값이 있으면,
			cpStr = cpStr.trim();// 공백을 제거해서
			cp = Integer.parseInt(cpStr);// int로 형변환해서 cp에 대입함.
		}
		session.setAttribute("cp", cp);
                // 이 과정을 거진 cp(현재페이지)를 세션으로 값으로 기록해둠.
		
        
        
		// (2) Page Size : ps 
		int ps = 1;// 
		if(psStr == null) {// 파라미터로 들어온 값이 없으면,
			Object psObj = session.getAttribute("ps"); 
                       // 세션에 있는 ps값을 가져와서 psObj로 값 넣음.
			if(psObj != null) ps=(Integer)psObj;// 이 값이 널이 아니면, 
                      // 인트로 형변환해서 ps에 대입
		}else {
			psStr = psStr.trim();// 공백을 제거해서 대입
			int psParam = Integer.parseInt(psStr);// 형변환해서 psParam으로 저장
			Object psObj = session.getAttribute("ps");
			if(psObj != null) { //세션에 기록된 값이 있다면,
				int psSession = (Integer)psObj;
                               // 그 값을 가져와서, int로 형변환 후 psSession에 대입
				if(psSession != psParam) { 
                               // 세션에 있던 값이, 파라미터로 넘어온 값과 다르면,
					cp = 1; // 현재 페이지를 1로 해주고,
					session.setAttribute("cp", cp); // 1페이지를 세션에 기록함.
				}
			}else {
				if(ps != psParam) {//파라미터로 넘어온값과 ps가 같지 않으면,
					cp = 1; // 현재 페이지를 1로 해주고,
					session.setAttribute("cp", cp); // 1페이지를 세션에 기록함.
				}
			}
			ps = psParam; //파라미터에서 넘어온 값으로 ps를 지정해줌.
		}
		session.setAttribute("ps", ps); // 지정된 ps값을 세션에 기록함.
		
		BoardService service = BoardService.getInstance();//서비스 객체 호출
		ListResult listResult = service.getListResult(cp, ps);
                // cp와ps로 새로운 겟리스트리절트객체 생성해줌 
		request.setAttribute("listResult", listResult); //생성된 객체를 request에 기록.
		if(listResult.getList().size() == 0 && cp>1) { 
                // 해당 페이지리스트가 비었고, 페이지가 1페이지 이상인 경우
			response.sendRedirect("board.do?m=list&cp="+(cp-1)); 
                        // (비었으므로) 이전 페이지로 이동
		}else { //해당 페이지가 정상적으로 존재한다면
			String view = "list.jsp"; //리스트로 이동(데이터를 가지고)
			RequestDispatcher rd = request.getRequestDispatcher(view);
			rd.forward(request, response);
		}
	}

3. Service 객체에서의 List & ListResult,

listresult 객체 안에 list를 담아버렸다.

 public ListResult getListResult(int cp, int ps) {
		return new ListResult(cp, total(), ps, listS(cp, ps));
	}
	public ArrayList<Board> listS(int cp, int ps){
		return dao.list(cp, ps);
	}

4. List의 달라진 SQL

static final String LIST = "select * from (select ROWNUM rnum, aa.* from
(select * from BOARD order by SEQ desc) aa ) where rnum>? and rnum<=?";

: rownum을 포함한 모든 컬럼값을 가져오기! 간단하게 짜기 위해서 서브쿼리로 해주고,
Current page 와 Page size는 바뀔 것이므로, ? 표시해서 PreparedStatement로 해준다.


5. List.jsp

...
<%
	ListResult listResult = (ListResult)request.getAttribute("listResult");
	// request에 넣어두었던, ListResult 객체를 뽑아내서 listResult라는 이름으로 대입
	int cp = listResult.getCurrentPage();
	int ps = listResult.getPageSize();
	long tpc = listResult.getTotalPageCount();
	ArrayList<Board> list = (ArrayList)listResult.getList();
	// listResult의 값들을 미리 빼놓고 사용할 준비를 한다.
	if(list.size()!=0){ // list에 데이터가 존재하면,
		for(Board dto : list){ // list안에있는 값들을 하나씩 꺼내서 dto에 넣음.
%>
				<TR>
                  // dto에 담긴 데이터들을 뿌려줌.
					<TD align='center'><%=dto.getSeq()%></TD> 
					<TD align='center'><%=dto.getWriter()%></TD>
					<TD align='center'><%=dto.getEmail()%></TD>
					<TD align='center'><a href='board.do?m=content&seq=
                                           <%=dto.getSeq()%>'><%=dto.getSubject()%></a></TD>
					<TD align='center'><%=dto.getRdate()%></TD>
				</TR>
<%
		} //for문 닫기
	}else{ // list안에 데이터가 없다면? ( == DB에 데이터가 없음)
%>
				<TR><td align='center' colspan='5'>데이터가 없습니다.</td></TR>
<%
	}//else문 닫기
%>
		</TABLE>
		<hr width='600' size='2' color='gray' noshade>
		<font color='gray' size='3' face='휴먼편지체'>
	    (총페이지수 : <%=tpc%> ) // tpc : totalPageCount, 총 게시물 / 3,5,10
	    &nbsp;&nbsp;&nbsp;    
<%
	for(int i=1; i<=tpc; i++){
%>
<a href="board.do? m=list & cp=<%=i%> & ps=<%=ps%>">
<%
			if(i==cp){// i 가 cp와 같다면, (내가 있는 페이지라면)
%>
<strong><%=i%></strong></a>&nbsp; // 굵게표기
<%
			} else { //i가 cp와 다르다면, (내가 있는 페이지가 아니면)
%>
<%=i%></a>&nbsp; // 얇게표기
<%
			}
		}
%>          
	    ( TOTAL : <%=listResult.getTotalCount()%> ) // 총 게시글 수
	    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
	       페이지 싸이즈 : // 선택하게 select 태그로 달아줌.
	    <select id="psId" name="ps" onchange="f(this)">
	    		   <option value="3" selected>3</option>
			       <option value="5">5</option>
			       <option value="10">10</option>    	
	    </select>
	    <script language="javascript">
	       function f(select){
	           var el = document.getElementById("psId");
	           var ps = select.value;
	           alert("ps : " + ps); // 무엇을 선택했는지 보여줌.
	           location.href="board.do?m=list&ps="+ps; // 보여준 후 이동.
	       }
	    </script>
	</font>
	<hr width='600' size='2' color='gray' noshade>
	</center>
	</body>
</html>
profile
Better version

0개의 댓글