天天看點

S2SH項目實作分頁功能

      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.頁面顯示效果

S2SH項目實作分頁功能