원하는 데이터가 담긴 객체를 만들어서, 사용하면 편리함!
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;
}
}
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);
}
}
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);
}
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로 해준다.
...
<%
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
<%
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> // 굵게표기
<%
} else { //i가 cp와 다르다면, (내가 있는 페이지가 아니면)
%>
<%=i%></a> // 얇게표기
<%
}
}
%>
( TOTAL : <%=listResult.getTotalCount()%> ) // 총 게시글 수
페이지 싸이즈 : // 선택하게 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>