javaWEB項目實作分頁的方法很多,網上也有很多列子,最近工作中S2SH架構項目中需要一個分頁的功能,檢視了很多用一下方式實作,功能思路很清晰,覺得是很好的一種實作方法,記錄下便多學習。
剛開始得到分頁循環頁數,但增加了跳轉功能時,在select下拉框中總是重複循環最大頁,通過檢視代碼修改,最終終于實作。解決思路就是需要增加一個跳轉分頁的javaBean,目的是封裝成一個list,在得到頁數後,在頁面可以直接通過list的屬性擷取遞增循環頁數。
1.javaBean:
pageBean(分頁類)
public class PageBean {
private List<實體類類名> list1; //傳回某一頁的記錄清單
private List<實體類類名> list2; //傳回某一頁的記錄清單
private int allRow; //總記錄數
private int pageSize; //每頁記錄數
private int totalPage; //總頁數
private int currentPage; //目前頁數
private boolean isFirstPage; //是否為第一頁
private boolean isLastPage; //是否為最後一頁
private boolean hasPreviousPage; //是否有上一頁
private boolean hasNextPage; //是否有下一頁
/**
* 初始化分頁資訊
*/
public void init(){
this.isFirstPage=isFirstPage();
this.isLastPage=isLastPage();
this.hasPreviousPage=isHasPreviousPage();
this.hasNextPage=isHasNextPage();
}
/**
* 判斷分頁資訊,隻需getter方法
*/
public boolean isFirstPage(){
return currentPage==1;
}
public boolean isLastPage(){
return currentPage==totalPage;
}
public boolean isHasPreviousPage(){
return currentPage!=1;
}
public boolean isHasNextPage(){
return currentPage!=totalPage;
}
/**
* 計算總頁數,靜态方法,供外部直接通過類名調用
* @param pageSize 每頁記錄數
* @param allRow 總記錄數
* @return 總頁數
*/
public static int countTotalPage(final int pageSize,final int allRow){
int totalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize+1;
return totalPage;
}
/**
* 計算目前頁開始記錄
* @parampageSize每頁記錄數
* @paramcurrentPage目前第幾頁
* @return目前頁開始記錄号
*/
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize*(currentPage-1);
return offset;
}
/**
* 計算目前頁,若為0或者請求的URL中沒有"?page=",則用1代替
* @param page 傳入的參數(可能為空,即0,則傳回1)
* @return 目前頁
*/
public static int countCurrentPage(int page){
final int curPage = (page==0?1:page);
return curPage;
}
public List<實體類類名> getList1() {
return list1;
}
public void setList1(List<實體類類名> list1) {
this.list1 = list1;
}
public List<實體類類名> getList2() {
return list2;
}
public void setList2(List<實體類類名> list2) {
this.list2 = list2;
}
public int getAllRow() {
return allRow;
}
public void setAllRow(int allRow) {
this.allRow = allRow;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
}
pageNo(跳轉時用到list屬性封裝類)
public class PageNo {
private int pageNumber; //跳轉到第幾頁
public int getPageNumber() {
return pageNumber;
}
public void setPageNumber(int pageNumber) {
this.pageNumber = pageNumber;
}
}
2.action
@SuppressWarnings("serial")
public class XxxAction extends ActionSupport implements Serializable {
protected HttpSession getSession() {
return ServletActionContext.getRequest().getSession();
}
private XxxService xxxService;
public XxxService getXxxService() {
return xxxService;
}
public void setXxxService(XxxService xxxService) {
this.xxxService = xxxService;
}
private int page=1; //第幾頁
private PageBean pageBean;
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
private List<PageNo> numberList;
private PageNo pageNo;
public PageNo getPageNo() {
return pageNo;
}
public void setPageNo(PageNo pageNo) {
this.pageNo = pageNo;
}
/**
* 清單并分頁
* @return
*/
public String getListAndPage(){
pageBean=xxxService.queryForPage(this,10,page);
numberList=new ArrayList<PageNo>();
if(pageBean.getTotalPage()>0){
for(int i=0;i<pageBean.getTotalPage();i++){
pageNo=new PageNo();
pageNo.setPageNumber(i+1);
numberList.add(i, pageNo);
}
}
getSession().setAttribute("numberList", numberList);
return "success";
}
}
3.service,serviceImpl,dao略
4.daoImpl
public class XxxDaoImpl extends BaseDAO implements XxxDao {
/**
* 清單并分頁
*/
@SuppressWarnings("unchecked")
public PageBean queryForPage(XxxAction version,int pageSize,int page) {
Session session=getSession();
try{
String sql=" from Entity as entity where 1=1 ";
Query query1=session.createQuery(sql);
Query query2=session.createQuery(sql);
List list1 = query1.list();
int allRow=list1.size(); //總記錄數
int totalPage=PageBean.countTotalPage(pageSize, allRow); //總頁數
final int length=pageSize; //每頁記錄數
final int currentPage=PageBean.countCurrentPage(page); //目前頁,不要為0或url為空
final int offset=PageBean.countOffset(pageSize, page);
query2.setFirstResult(offset);
query2.setMaxResults(length);
List<PaiPubVersion> list2=query2.list();
//把分頁資訊儲存到Bean中
PageBean pageBean = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList2(list2);
pageBean.init();
return pageBean;
}catch(RuntimeException re){
throw re;
}finally{
if(session!=null){
session.close();
}
}
}
}
5.jsp頁面
<td colspan="6">
共<s:property value="pageBean.allRow"/> 條記錄
共<s:property value="pageBean.totalPage"/> 頁
目前第<s:property value="pageBean.currentPage"/>頁
<s:if test="%{pageBean.currentPage == 1}">
<input type="button" value="第一頁" disabled="disabled" />
<input type="button" value="上一頁" disabled="disabled" />
</s:if>
<s:else>
<input type="button" value="第一頁" οnclick="pageNo('1')"/>
<input type="button" value="上一頁" οnclick="pageNo('<s:property value="%{pageBean.currentPage-1}"/>')"/>
</s:else>
<s:if test="%{pageBean.currentPage != pageBean.totalPage}">
<input type="button" value="下一頁" οnclick="pageNo('<s:property value="%{pageBean.currentPage+1}"/>')"/>
<input type="button" value="最後一頁" οnclick="pageNo('<s:property value="%{pageBean.totalPage}"/>')"/>
</s:if>
<s:else>
<input type="button" value="下一頁" disabled="disabled" />
<input type="button" value="最後一頁" disabled="disabled" />
</s:else>
跳轉到:
<select id="gotoNo" name="gotoNo" οnchange="onTiao()">
<s:iterator value="#session.numberList">
<s:if test="pageBean.currentPage eq pageNumber">
<option value="<s:property value="pageNumber"/>" selected="selected" ><s:property value="pageNumber"/></option>
</s:if>
<s:else>
<option value="<s:property value="pageNumber"/>"><s:property value="pageNumber"/></option>
</s:else>
</s:iterator>
</select>
頁
</td>
6.js
function pageNo(fenye){
document.pageform.action="getListAndPage.action?page="+fenye;
document.pageform.submit();
}
function onTiao(){
var gotoNo = document.getElementById('gotoNo').value;
document.pageform.action="getListAndPage.action?page="+gotoNo;
document.pageform.submit();
}
7.頁面顯示效果