java web複習 day15(jdbc,分頁技術詳解,過程)

        分頁挺難的,看了兩遍我都有點沒搞懂,這個邏輯過程挺複雜的,算是我學這個來最大的問題了。

        下面我們分步驟來詳細介紹分頁技術。

(剛纔準備分頁代碼的時候出現這麼一個錯誤:Connection fails with "Public Key Retrieval is not allowed" for native auth,明明昨天還是好好的,今天卻出現這麼一個問題,於是搜索一番後,得知這個錯誤的意思是:不允許公開密鑰檢索,好吧,我把配置文件中的url後加上了allowPublicKeyRetrieval=true這麼一個參數之後,立刻就好了。之後想看看錯誤,去掉這個參數之後居然又沒錯了,真是十分神奇,面向運氣編程,名不虛傳。)

        1.什麼是分頁?

        分頁,就是一種美觀展示大量數據的邏輯方法,在google上它是這樣的:

        

        在百度上,它是這樣的:

        

        但是我們今天做的,是這樣的:

        

       嘿嘿,有模有樣。閒話不多說,開始講:

        (1)設計一個保存數據的Page類: 

package cn.itcast.domain;

import java.util.List;

//封裝頁面數據
public class Page {
	
	private List list;
	private int totalpage;  //記住總頁數
	
	private int totalrecord; //頁面記錄總數
	private int pagesize = 1; //設置頁面大小
	
	
	private int pagenum;   //代表用戶想看的頁
	private int startindex;  //代表用戶想看的頁的數據從數據庫哪個地方開始取
	
	
	private int startPage;  //記住jsp頁面顯示的起始頁碼
	private int endPage;  //記往jsp頁面顯示的結束頁碼
	
	private String url;   //記住用於處理分頁的servlet
	
	//構造函數
	public Page(int totalrecord,int pagenum){
		this.totalrecord = totalrecord;
		
		if(this.totalrecord%this.pagesize==0){
			this.totalpage = this.totalrecord/this.pagesize;  //如果記錄總數剛好可以除盡頁面大小,頁面總數就是結果
		}else{
			this.totalpage = this.totalrecord/this.pagesize + 1;//如果記錄總數除不盡,頁面總數就是結果+1
		}
		
		this.pagenum = pagenum;  //1
		this.startindex = (this.pagenum-1)*this.pagesize; //在數據庫中開始的位置爲(用戶想看的頁-1)*頁面大小
		
		
		//根據用戶想看的頁pagenum,算出jsp頁面的起始和結束頁碼,這裏默認顯示10頁
		if(this.totalpage<=10){
			this.startPage = 1;
			this.endPage = this.totalpage;
		}else{
			//如果超過10頁,就調整頁碼,只顯示10頁
			this.startPage = this.pagenum -4;
			this.endPage = this.pagenum + 5;
			
			//如果經過上面計算之後開始頁碼小於1,則開始頁面設爲1
			if(this.startPage<1){
				this.startPage = 1;
				this.endPage = 10;
			}
			//如果進過上面的運算之後結束頁碼大於1,則結束頁面設爲總頁面,開始爲總頁面-1
			if(this.endPage > this.totalpage){
				this.endPage = this.totalpage;
				this.startPage = this.totalpage-9;
			}			
		}
	}
	
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}




	public int getStartPage() {
		return startPage;
	}



	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}



	public int getEndPage() {
		return endPage;
	}



	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}



	public List getList() {
		return list;
	}



	public void setList(List list) {
		this.list = list;
	}



	public int getTotalpage() {
		return totalpage;
	}



	public void setTotalpage(int totalpage) {
		this.totalpage = totalpage;
	}



	public int getTotalrecord() {
		return totalrecord;
	}



	public void setTotalrecord(int totalrecord) {
		this.totalrecord = totalrecord;
	}



	public int getPagesize() {
		return pagesize;
	}



	public void setPagesize(int pagesize) {
		this.pagesize = pagesize;
	}



	public int getPagenum() {
		return pagenum;
	}



	public void setPagenum(int pagenum) {
		this.pagenum = pagenum;
	}



	public int getStartindex() {
		return startindex;
	}



	public void setStartindex(int startindex) {
		this.startindex = startindex;
	}
	
}

(2)在dao中編寫對應方法

//獲取分頁數據
		public List<Customer> getPageData(int startindex,int pagesize){
			Connection conn = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			try{
				conn = JdbcUtils.getConnection();
				String sql = "select * from customer limit ?,?";
				st = conn.prepareStatement(sql);
				st.setInt(1, startindex);
				st.setInt(2, pagesize);
				
				rs = st.executeQuery();
				List list = new ArrayList();
				while(rs.next()){
					Customer c = new Customer();
					c.setBirthday(rs.getDate("birthday"));
					c.setCellphone(rs.getString("cellphone"));
					c.setDescription(rs.getString("description"));
					c.setEmail(rs.getString("email"));
					c.setGender(rs.getString("gender"));
					c.setId(rs.getString("id"));
					c.setName(rs.getString("name"));
					c.setPreference(rs.getString("preference"));
					c.setType(rs.getString("type"));
					list.add(c);
				}
				
				return list;
			}catch (Exception e) {
				throw new DaoException(e);
			}finally{
				JdbcUtils.release(conn, st, rs);
			}
		}
		
		//得到總記錄數
		public int getTotalrecord(){
			Connection conn = null;
			PreparedStatement st = null;
			ResultSet rs = null;
			try{
				conn = JdbcUtils.getConnection();
				String sql = "select count(*) from customer";
				st = conn.prepareStatement(sql);
				rs = st.executeQuery();
				if(rs.next()){
					return rs.getInt(1);
				}
				return 0;
			}catch (Exception e) {
				throw new DaoException(e);
			}finally{
				JdbcUtils.release(conn, st, rs);
			}
		}

(3)在service中調用該方法:

public Page getPageData(String pagenum,String url){
		
		int totalrecord = dao.getTotalrecord();
		
		if(pagenum==null){
			//代表用戶想看第一頁的數據
			Page page = new Page(totalrecord,1);  //算出了總頁數,以及用戶想看的頁從數據庫哪個地方開始取
			List list = dao.getPageData(page.getStartindex(), page.getPagesize());
			page.setList(list);
			page.setUrl(url);
			return page;
		}else{
			//代表用戶想看指定的頁
			Page page = new Page(totalrecord,Integer.parseInt(pagenum)); 
			List list = dao.getPageData(page.getStartindex(), page.getPagesize());
			page.setList(list);
			page.setUrl(url);
			return page;
		}
	}

(4)做出UIservlet轉發到jsp

package cn.itcast.web.controller;

import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cn.itcast.domain.Page;
import cn.itcast.service.impl.BusinessService;

/**
 * Servlet implementation class ListCustomerServlet
 */
@WebServlet(urlPatterns="/servlet/ListCustomerServlet")
public class ListCustomerServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public ListCustomerServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		try{
			String pagenum = request.getParameter("pagenum");
			BusinessService service = new BusinessService();
			//獲取servlet名稱,切分
			String[] servletNames = this.getServletName().split("\\.");
			//製作url
			Page page = service.getPageData(pagenum,request.getContextPath() + "/servlet/" + servletNames[4]);
			request.setAttribute("page", page);
			request.getRequestDispatcher("/WEB-INF/jsp/listcustomer.jsp").forward(request, response);
			
		}catch (Exception e) {
			e.printStackTrace();
			request.setAttribute("message", "查詢失敗!!!");
			request.getRequestDispatcher("/message.jsp").forward(request, response);
			
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

(5)做出Jsp展示數據:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>
<%@taglib uri="/WEB-INF/itcast.tld" prefix="itcast" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>顯示所有用戶</title>
  </head>
  
  <body style="text-align: center;">
 
    <table border="1"   width="90%" frame="border">
    	<tr>
    		<td>客戶姓名</td>
    		<td>性別</td>
    		<td>生日</td>
    		<td>手機號碼</td>
    		<td>郵箱</td>
    		<td>愛好</td>
    		<td>類型</td>
    		<td>備註</td>
    		<td>操作</td>
    	</tr>
    	
    	<c:forEach var="c" items="${page.list}">
    		<tr>
	    		<td><c:out value="${c.name }" escapeXml="true"/></td>
	    		<td><c:out value="${c.gender }" escapeXml="true"/></td>
	    		<td><c:out value="${c.birthday }" escapeXml="true"/></td>
	    		<td><c:out value="${c.cellphone }" escapeXml="true"/></td>
	    		<td><c:out value="${c.email }" escapeXml="true"/></td>
	    		<td><c:out value="${itcast:subString(c.preference,10)}" escapeXml="true"/></td>
	    		<td><c:out value="${c.type }" escapeXml="true"/></td>
	    		<td><c:out value="${itcast:subString(c.description,10)}" escapeXml="true"/></td>
	    		
	    		<td>
	    			<a href="${pageContext.request.contextPath }/servlet/UpdateCustomerUIServlet?id=${c.id }">修改</a>
	    			<a href="javascript:dodelete('${c.id }')">刪除</a>
	    			
	    			
	    		</td>
    		</tr>
    	</c:forEach>
    
    </table>
    
     <br/>
   	<%@include file="/public/page.jsp" %>
   	
    <script type="text/javascript">
  	function dodelete(id)
  	{
  		var b = window.confirm("您確認刪除嗎??");
  		if(b){
  			window.location.href="${pageContext.request.contextPath }/servlet/DeleteCustomerServlet?id=" + id;
  		}
  	}
  </script>
  </body>
</html>

其中,${itcast:subString(String,int)}爲一個自定義函數,用於將過長的文本省略展示,以造成頁面的美觀,展示效果爲:


tld文件爲:

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
    
    <description>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>/itcast</uri>
    
    <function>
        <name>subString</name>
		<function-class>cn.itcast.web.el.ElUtils</function-class>
		<function-signature>java.lang.String subString( java.lang.String,java.lang.Integer )</function-signature>
    </function>
</taglib>

ELUtils設計爲:

package cn.itcast.web.el;

public class ElUtils {
	
	public static String subString(String source,Integer length){
		
		if(source.length()>length){
			return source.substring(0,length) + ".......";
		}
		return source;
	}
	
}
這就是分頁技術詳細過程啦,隨便轉載!(逃
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章