分頁挺難的,看了兩遍我都有點沒搞懂,這個邏輯過程挺複雜的,算是我學這個來最大的問題了。
下面我們分步驟來詳細介紹分頁技術。
(剛纔準備分頁代碼的時候出現這麼一個錯誤: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;
}
}
這就是分頁技術詳細過程啦,隨便轉載!(逃