1. 程式人生 > >Java Web開發jsp顯示高階分頁效果詳解

Java Web開發jsp顯示高階分頁效果詳解

     許多網站都文章或其他類內容的分頁效果,初學者對於分頁的開發有時只會用程式碼,而沒有深入瞭解程式碼編寫前的業務邏輯結構,掌握好這個,我想,任何的效果的分頁都能自己解決……

     1、確立jsp分頁的內部邏輯結構:

       現在就採用標準MVC模式下的分頁做簡單介紹。首先資料庫裡我們查詢了一大堆的資料,列出來一個for迴圈(或者直接使用標籤迭代輸出<logic:interate),可能資料是一行一行,在一個表格標籤中顯示(或許是div的巢狀),不管怎麼樣,拿出來的的資料要規定顯示多少行,超過了要分頁,我們點選下一頁,或者一個頁碼,將請求傳遞給servlet(action……)進行業務處理,將處理後得到的那幾行資料(也就是點選的要顯示的那一頁資料)在伺服器中轉發到那個檢視顯示:

 request.getRequestDispatcher("xxx.jsp").forward(request, response);

servlet接受http地址的引數,通過request接受,要傳遞的引數主要有查詢的表名,要得到的該頁的頁數(查詢的內容更細時應該傳遞更多的其它引數),這些引數用於構建sql語句查詢資料庫中該頁的內容,如下是這個處理查詢一頁的java類:這裡為了方便操作,在bean中也放入兩業務邏輯處理方法,實際應用時應該將他們打包在一個專門的java類中:

package com.xxx.bean;

import java.sql.*;
import java.util.Vector;

import com.xxx.util.DB;
/*
 * 肖力
 * 2012-7-7
 * 主要用於前臺顯示列表的分頁
 * */
public class Lists {
	private static Connection con=null;//宣告Connection引用
	private static Statement stat=null;//宣告Statement引用
	private static ResultSet rs=null;//宣告ResultSet引用
	private static int span=6;  //span每頁顯示多少行記錄
	private int curPage = 1;   //當前頁
	private String msgsql;      //
	private int totalPage; 
	private int total;
	
	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}

	public int getCurPage()
	{//得到使用者當前頁
		return this.curPage;
	}
	
	public void setCurPage(int curPage)
	{//記錄使用者當前頁
		this.curPage = curPage;
	}
	
	public void setSql(String sql)
	{
		this.msgsql = sql;
	}
	
	public String getSql()
	{
		return this.msgsql;
	}

	public int getTotalPage()
	{
		return this.totalPage;
	}
	
	public void setTotalPage(int totalPage)
	{
		this.totalPage = totalPage;
	}
	
	public static int getSpan() {
		return span;
	}
	public static  void setSpan(int i) {
		span = i;
	}
	
	//獲取要分頁處理的總頁數
	public static int getTotalPages(String sql){
		int totalPage=1;
		try{
			con=DB.getCon();
			stat=con.createStatement();
			rs=stat.executeQuery(sql); 
			rs.next();
			int rows=rs.getInt(1);
			//System.out.println(rows);
			totalPage= rows/span;
            if(rows%span!=0)
            {
            	totalPage++;
            }
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				DB.closeCon();
				con.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return totalPage;
	}
	
	
	//查詢指定SQL中結果的指定頁的結果集
	public  static Vector<String[]> getPageContent(int page,String sql)
	{
		Vector<String[]> vcon = new Vector<String[]>();
		try{
			con=DB.getCon();
			stat=con.createStatement();
			//執行語句得到結果集
            rs = stat.executeQuery(sql);
            //獲取結果集的元資料
            ResultSetMetaData rsmt = rs.getMetaData();
            //得到結果集中的總列數
            int count = rsmt.getColumnCount();
            int start = (page-1)*span;
            if(start!=0)
            {
            	rs.absolute(start);
            }
			int temp=0;
            while(rs.next()&&temp<span)
            {
            	temp++;
            	String[] str = new String[count];
            	for(int i=0;i<str.length;i++)
            	{
            		str[i] = rs.getString(i+1);
            	}
            	vcon.add(str);
            }
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}finally{
			try{
				DB.closeCon();
				rs.close();
	            stat.close();
	            con.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		return vcon;
	}
	
}

以上的bean中儲存了這個查詢的總頁數,當前頁碼,每頁顯示的數目等等屬性,另外的兩個操作方法是靜態方法,例項化該物件時可以物件直接呼叫,其中的資料庫代理類DB這裡就不寫了。
2、servlet處理客服端的查詢頁面請求並且迴應

     大概步驟:接受引數;例項化List物件;構造sql語句並查詢;轉發結果集到前臺顯示;

      以下是示例程式碼:

			String table=request.getParameter("table");
			String ftable=request.getParameter("ftable");
			int curPage =Integer.parseInt(request.getParameter("curPage")); 
			//得到該欄目的數目
			String sql="";
			//得到該類的總頁數
			String sqlpage = "";
			sql="select * from  "+table+" where Attribute='"+ftable+"' order by ID desc";
			sqlpage = "select count(*) from "+table+" where Attribute='"+ftable+"'";
			//獲取總頁數和總條數
			int totalpage =Lists.getTotalPages(sqlpage);
			int total=ProDB.getCounts(sqlpage);
			if(curPage==0||curPage>totalpage)
			{
				curPage=1;//當上下頁頁數不符合規定時將當前頁碼數置為1
			}
			//將得到的頁數和當前頁碼存到Bean中
			Lists list=new Lists();//例項化分頁類
			list.setCurPage(curPage);
			list.setTotalPage(totalpage);
			list.setTotal(total);
			//得到該頁的內容
			Vector<String[]> vlist=Lists.getPageContent(curPage,sql);
			if(vlist.size()==0){
				//沒有搜尋到該類問題的文章				String msg= "還沒有該類的列表專案!!!";
				request.setAttribute("msg",msg);
			}
			request.setAttribute("vlist",vlist);
			request.setAttribute("list",list);
			request.setAttribute("ftable", ftable);
			request.setAttribute("table",table);
			request.getRequestDispatcher("list.jsp").forward(
					request, response);

這裡將查詢的結果集轉發到了list.jsp頁面顯示:以下展示list頁面分頁圖示特殊效果。

3、關於前臺分頁點選效果展示

  大部分網站上的分頁點選效果都是隻有上一頁、下一頁、尾頁、末頁、或者加入一個提交文字框編寫頁碼展示,那就是如下的示例程式碼了:

                  <a href="ShowServlet?action=listly&curPage=1&jsp=liuyan_list" class="aaa" title="首頁">首頁</a> 
	  	<a href="ShowServlet?action=listly&curPage=<%=curPage-1%>&jsp=liuyan_list" class="aaa" title="上一頁">上一頁</a> 
	  	<a href="ShowServlet?action=listly&curPage=<%=curPage+1%>&jsp=liuyan_list"  class="aaa" title="下一頁">下一頁</a> 
	  	<a href="ShowServlet?action=listly&curPage=<%=totalpage%>&jsp=liuyan_list" class="aaa" title="末頁">末頁</a> 

至於顯示頁碼,並且頁碼隨著頁數變化而變化,就要處理一段較為複雜的業務邏輯結構,下面就此用許多scripted程式碼在jsp頁面顯示吧:

<%
      		if (totalpage <= 4) {
      			for (int i = 1; i <= totalpage; i++) {
      				if (i == curPage) {
      	%>	
				<b><u><%=i%></u>. </b>
		<%
			} else {
		%>
				<a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list" title="第<%=i %>頁"><%=i%></a>. 
		<%
			}
				}
		%>
			 (第<%=curPage%>/<%=totalpage%>頁)
		<%
				} else {
					for (int i = curPage; i < curPage + 4; i++) {
						if (curPage == 1) {
							if (i == curPage) {
			%>
							<b><u>1</u>. </b>
		<%
			} else {
		%>
					    <a href="ShowServlet?action=listly&curPage=<%=i%>&jsp=liuyan_list"  title="第<%=i %>頁"><%=i%></a>. 
		<%
			}
					} else if (curPage > 1 && curPage < (totalpage - 1)) {
						if (i - 1 == curPage) {
		%>
						 <b><u><%=i - 1%></u>. </b>
		<%
			} else {
		%>
					   <a href="ShowServlet?action=listly&curPage=<%=i - 1%>&jsp=liuyan_list"  title="第<%=i-1 %>頁"><%=i - 1%></a>. 
		<%
			}
					} else if (curPage > 1 && curPage == totalpage - 1) {
						if (i - 2 == curPage) {
		%>
						 <b><u><%=i - 2%></u>. </b>
		<%
			} else {
		%>
					   <a href="ShowServlet?action=listly&curPage=<%=i - 2%>&jsp=liuyan_list"  title="第<%=i-2 %>頁"><%=i - 2%></a>. 
		<%
			}
					} else if (curPage == totalpage) {
						if (i - 3 == curPage) {
		%>
						 <b><u><%=i - 3%></u>. </b>
		<%
			} else {
		%>
					   <a href="ShowServlet?action=listly&curPage=<%=i - 3%>&jsp=liuyan_list"  title="第<%=i-3 %>頁"><%=i - 3%></a>. 
		<%
			}
					}
				}
		%>
			       (第<%=curPage%>/<%=totalpage%>頁)
		<%
			      	}
	   %>
	         共 <%=total %> 條記錄 
	   </td>
	  </tr>


只顯示四個圖示,可以更改程式碼實現更多。以上程式碼在jsp頁面中,違背了MVC標準模式開發,有必要將它們封裝,這裡不詳細講述了。

效果圖如下:



 謝謝參觀。