struts 2008. 7. 30. 16:19

struts2] struts2 + ibatis 활용한 게시판1-2

            struts2 + ibatis 를 활용한 게시판

* DB로 부터 글 목록불러오기 및 페이징처리 part

*ListAction.java
        - execute()메서드에  ibatis에 정의된  Bbs bbs = (Bbs)DaoService.getDao(Bbs.class)를 명시할시
          ListAction클래스가 불려지면서 ibatis와 연동을 시킬수가 있다.
        - execute()메서드안에 db로부터 가져온 결과를 가지고 게시판을 구축하면된다.
        - Paging클래스를 따로 작성해서
         

package action;

import java.util.*;

import page.Paging;
import vo.BbsVO;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import dao.Bbs;
import dao.DaoService;

public class ListAction extends ActionSupport{
  /*
   * pojo기반으로 사용하게되면 session처리하기가 곤란하다.
   * 따라서 ActionSupport를 상속받아 처리한다.
   * */
 
 private ArrayList<BbsVO> arr_list; //모든 게시물
 private List<BbsVO> list;  //현재 페이지에서 보여질 게시물
 private int nowPage = 1;
 private int rowTotal;   // 전체 게시물의 수
 private int blockList;    // 한 페이지당 보여질 게시물의 수
 private int blockPage; // 한번에 보여지는 페이지수
 private String pagingCode;
 private Paging page ; // 페이지 기법을 구현하는 클래스
 
 @Override
 public String execute() throws Exception {
 
  /*
   * 세션객체 구하기
   * 이것은 나중에 게시물 보기시 히트 수를 증가해 주기 위한것으로 이미 한번 읽은것은
   * 히트 수를 증가하지 않도록 하는데 있어 필요하다.
   * */
  Map<String, BbsVO> map = ActionContext.getContext().getSession(); //세션객체를 맵으로 리턴
  map.clear();  //session 청소
 
  /* ibatis를 통한 게시물 받기 위해서는 우선 Dao객체가 필요하다. */
  /*
   * dao.xml에 Bbs라는것이 선언되어있어야하며<dao>에 선언된 interface 호출시 구현된 객체가 생성된다.
   * 리턴받을시 interface 타입의 받기 때문에 BbsImple로 받는것이 아니라 반드시 Bbs로 받아서 캐스팅을 해줘야한다.
   * */
  Bbs bbs = (Bbs)DaoService.getDao(Bbs.class);
  arr_list = bbs.getAllBbs(); //전체 게시물을 불러옴
 
  rowTotal = arr_list.size();
  blockList = 7;
  blockPage = 5;
 
  /*페이징 기법에 의한 현재 보여질 게시물들 결정*/
  page = new Paging(nowPage,rowTotal,blockList,blockPage);
  pagingCode = page.getSb().toString(); //페이징 기법의 HTML문장
 
  /* 현재 페이지에서 보여질 게시물들 선별*/
  int to = rowTotal;
 
  if(page.getEndRow()<rowTotal)
   to = page.getEndRow()+1;
 
  list = arr_list.subList(page.getStartRow(), to);
 
  return SUCCESS;
 }
 //  그외에 일반적으로 필드에 선언된 setter/getter 메서드 정의

}
*Paging.java
        - paging처리하는 클래스

package page;

public class Paging {
 
  private boolean isPrevPage,isNextPage;
  private int nowPage,rowTotal,blockList,blockPage,totalPage,startPage,endPage,startRow,endRow;
 
  private StringBuffer sb;

  //페이징 기법을 총괄해서 계산하는 생성자
  public Paging(int nowPage, int rowTotal, int blockList, int blockPage) {
   /* 각종 플래그를 초기화*/   
   isPrevPage = false;
   isNextPage = false;
   
   /* 입력된 전체 게시물의 수를 통하여 전체 페이지 수를 구한다.*/

   /* 아래 코드와 ceil을 이용한 전체페이지수를 구하는것은 같은 코드이다.   
   totalPage = rowTotal/blockList;
   if(rowTotal%blockList !=0)
    totalPage++;
   */
   
   /* Math.ceil메서드는 인자의 수를 가지고 가장 가까운 값으로 올림을 한다. */
   totalPage = (int)Math.ceil((double)rowTotal/(double)blockList);
   
   
   /* 현재 페이지가 전체페이지수 보다 클경우 전체페이지 수로 할당 */
   if(nowPage > totalPage)
     nowPage = totalPage;
   
   /* 현재 페이지에 따른 시작 행의 정보와 끝 행의 정보 */

   startRow = (nowPage -1)*blockList;
   endRow = startRow + blockList -1;
   
   /* 시작 페이지와 마지막 페이지 값을 구한다.*/
   startPage = (int)((nowPage -1) / blockPage)*blockPage+1 ;
   endPage = startPage + blockPage -1 ;
   
   /* 마지막 페이지 값이 전체 페이지 수보다 클 경우*/
   if(endPage > totalPage)
    endPage = totalPage;
   
   /* 시작 페이지가 1보다 클 경우 이전 페이징 기능을 활성화 있도록 flag 설정*/
   if(startPage>1)
     isPrevPage = true;
   
   /* 마지막 페이가 전체 페이지 수보다 작을 경우 다음 페이징 기능을 활성화*/
   if(endPage<totalPage)
     isNextPage = true;
   
   /*멤버 변수에 값 저장*/
   this.nowPage = nowPage;
   this.rowTotal = rowTotal;
   this.blockList = blockList;
   this.blockPage = blockPage;
   
   /*HTML문장 만들기*/
   sb = new StringBuffer();
   if(startPage < blockPage)
     sb.append("<img src='images/button/but_prev.gif' width='30' height='9'>");
   else{
     sb.append("<img src='images/button/but_prev.gif' width='30' height='9' ");
     sb.append("onclick='location.href=\"list.action?nowPage=");
     sb.append(nowPage-blockPage);
     sb.append("\"' style='cursor:hand'>");
   }
   
   sb.append("|");
   for(int i = startPage; i<=endPage ; i++){
    if( i < totalPage)
     break;
    if(i == nowPage){
     sb.append("&nbsp;<b><font color='#91B7EF'>");
     sb.append(i);
     sb.append("</font></b>");        
    }else{
     sb.append("%nbsp;<a href='list.action?nowPage=");
     sb.append(i);
     sb.append("'>");
     sb.append(i);
     sb.append("</a>");    
    }
   }
   sb.append("&nbsp;|");
   
  if(startPage < totalPage)
    sb.append("<img src='images/button/but_next.gif' width='30' height='9'>");
  else{
    sb.append("<img src='images/button/but_next.gif' width='30' height='9' ");
    sb.append("onclick='location.href=\"list.action?nowPage=");
    sb.append(nowPage+blockPage);
    sb.append("\"' style='cursor:hand'>");
   }
}
 //  그외에 일반적으로 필드에 선언된 setter/getter 메서드 정의
}