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(" <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(" |");
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 메서드 정의
}