jsp分頁技術的實現
阿新 • • 發佈:2019-01-29
這是我們所要的效果
但是怎麼用程式碼實現呢,那摩讓我們先來分析一下吧!
第一步分析我們做分頁需要什麼資料:
我們從兩個方向來分析:1 頁面方向,2 servlet方向
一 ,頁面方向
1 當前頁 currPageCode
2 總 頁數 totalPage
3一頁中的記錄資料 datas
二,servlet方向
1 當前頁 currPageCode
2 總頁數 totalPage
3 每頁記錄數 pagesize
4 一共多少條記錄 totalRecord
5 一頁中的記錄資料 datas
6當前頁第一條記錄的行數 currPageBeginIndex
7 url
哦了
那摩我們來寫一個JavaBean吧
嗯,有了javabean了,那摩就先讓我們寫一下servlet吧!public class PageBean<T> { private int cp;//當前頁 private int pc;//可以通過每頁記錄數和共多少條記錄得到 (dt%md ==0 )?dt/md : dt/md+1 一共多少頁 private int md;//每頁記錄數 private List<T> pd;//頁中的記錄資料 private int dt;//一共多少條記錄 private int cd;//可以通過每頁記錄是*(當前頁數-1) + 1得到,當前頁第一條記錄的行數 private String url; //為了清楚起見,我就沒有粘上我的setget方法 }
public String findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /* * 1 通過頁面回傳的當前頁資訊設定當前頁 * 2 設定每頁所顯示的資料 * 3 呼叫servlce的findAll方法獲得一共多少條記錄及當前頁的資料 * */ PageBean<Customer> pb = new PageBean<Customer>(); if(request.getParameter("cp") != null && !request.getParameter("cp").trim().isEmpty()) { int cp = Integer.parseInt(request.getParameter("cp")); pb.setCp(cp); } else { pb.setCp(1); } pb.setMd(10); pb.setPd(service.findAll(pb.getCd(),pb.getMd())); pb.setDt(service.count()); String url = getUrl(request); pb.setUrl(url); request.setAttribute("pb",pb); return "f:list.jsp"; }
嗯,有了資料了,這個方法會轉發找list.jsp頁面中,我們來看該頁的技術點
<body>
<h3 align="center">客戶列表</h3>
<table border="1" width="70%" align="center">
<tr>
<th>客戶姓名</th>
<th>性別</th>
<th>生日</th>
<th>手機</th>
<th>郵箱</th>
<th>描述</th>
<th>操作</th>
</tr>
<!-- 第幾頁 current page cp
共幾頁 page count pc
一頁顯示多少資料 many date md
每頁所顯示的資料 page date pd
一共多少條記錄 date total dt
當前頁的第一條記錄的行數 current date cd -->
<!-- 1,這一點就不用多說了吧,我們把我們查詢的資料進行遍歷 -->
<c:forEach var="customer" items="${pb.pd}">
<tr>
<!-- private String cname;
private String gender;
private String birthday;
private String cellphone;
private String email;
private String description;
-->
<td>${customer.cname }</td>
<td>${customer.gender }</td>
<td>${customer.birthday}</td>
<td>${customer.cellphone }</td>
<td>${customer.email }</td>
<td>${customer.description }</td>
<td>
<a href="<c:url value='/customer2?method=forEdit&cid=${customer.cid }'/>">編輯</a>
<a href="<c:url value='/customer2?method=delete&cid=${customer.cid }'/>">刪除</a>
</td>
</tr>
</c:forEach>
</table>
<!-- 這是我們分頁技術頁面部分的實現; -->
<center>
第${requestScope.pb.cp }頁/共 ${pb.pc }頁
<a href="<c:url value="${pb.url }"/>">首頁</a> <!-- 因為首頁也是第一頁,所以我們沒有加當前頁碼引數,servlet會自動認為是第一頁 -->
<c:if test="${pb.cp > 1 }"> <!-- 如果當前頁面是第一頁德華,那摩就禁用上一頁 -->
<a href="<c:url value='${pb.url }&cp=${pb.cp - 1 }'/>">上一頁</a>
</c:if>
<%--
用來進行中間頁碼的顯示及使用超連結所帶來的的問題的解決方案
如何顯示頁碼呢,我們其實只需要兩個資料,begin和end就哦了,
我們常見的百度頁面有什麼特點呢,你可以去看看我就不多說了;下面我給出他的計算公式:
如果總頁數<=10(列表長度),那麼begin=1,end=總頁數
否則
使用公式計算;begin=pc-5, end=pc + 4;
兩種特殊情況:
頭溢位:當begin<1時,讓begin=1
尾溢位:當end>${tp}時,讓end=${tp}
--%>
<c:choose>
<c:when test="${pb.pc <= 10 }"> <!-- 判斷總頁數小於頁面大小嗎 -->
<c:set var="begin" value="1"/>
<c:set var="end" value="${pb.pc }"/>
</c:when>
<c:otherwise>
<c:set var="begin" value="${pb.cp-4 }"/>
<c:set var="end" value="${pb.cp+5 }"/>
<c:choose>
<c:when test="${begin < 1 }">
<c:set var="begin" value="1"/>
<c:set var="end" value="10"/>
</c:when>
<c:when test="${end > pb.pc }">
<c:set var="begin" value="${pb.pc-9 }"/>
<c:set var="end" value="${pb.pc }"/>
</c:when>
</c:choose>
</c:otherwise>
</c:choose>
<!-- 通過上面的操作我們可以得到正確的begin和end了下面我們就對其進行遍歷 -->
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<!-- 當前頁面顯示為普通文字 -->
<c:when test="${i == pb.cp }">${i }</c:when>
<!-- 其他頁面顯示為超連結 -->
<c:otherwise><a href="<c:url value='${pb.url }&cp=${i }'/>"> [${i }] </a></c:otherwise>
</c:choose>
</c:forEach>
<c:if test="${pb.cp < pb.pc }"> <!-- 如果當前頁面時最後一頁的話,我們就禁用下一頁 -->
<a href="<c:url value='${pb.url }&cp=${pb.cp + 1 }'/>">下一頁</a>
</c:if>
<a href="<c:url value='${pb.url }&cp=${pb.pc }'/>">尾頁</a>
</center>
</body>
哦了多餘的話我就不解釋了,我想你看過這段程式碼之後會明白的吧。
那摩接下來讓我們來寫一個service和dao就算完事了,service我就不說了我們直接來看dao吧
public List<Customer> findAll(int index,int length) {
String sql = "select * from t_customer limit ?,?";
List<Customer> l = null;
Object[] p = {index,length};
try {
l = queryRunner.query(sql, new BeanListHandler<Customer>(Customer.class),p);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return l;
}
public int count() {
String sql = "select count(*) from t_customer";
Number n = null;
try {
n = (Number)queryRunner.query(sql, new ScalarHandler());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return n.intValue();
}
是滴,全部查詢就是這摸簡單,只要還是得利用當前行數,和每頁記錄數
哦了
有人會問我getUrl()方法是什麼鬼,還有encoding()方法又是你媽什麼?
應為我們是使用get提交的所以會造成亂碼,嗯對,我們獲取的customer物件他爹都不認識他,我們的encoding方法就是用來進行解碼的
//這是其中的一個,其他的屬性也如同
if(c.getCname() != null && !c.getCname().trim().isEmpty()) {
byte[] b = null;
try {
b = c.getCname().getBytes("iso-8859-1");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String name=null;
try {
name = new String(b,"utf-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
c.setCname(name);
}
getUrl是用來獲取引數路徑並去除&cp引數的:
private String getUrl(HttpServletRequest request) {
//String c = request.getContextPath();
String q = request.getQueryString();
String s = request.getServletPath();
if(q != null && !q.trim().isEmpty()) {
if( q.contains("&cp=")) {
int i = q.indexOf("&cp=");
q = q.substring(0, i);
}
}
String url = s + "?" + q;
return url;
}
哦了,大致的技術點我們就雞巴說沒了,讓我們提升點難度,試試多條件查詢:
//多條件查詢的servlet方法
public String query(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Customer customer = new Customer();
try {
BeanUtils.populate(customer,request.getParameterMap());
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Customer c = encoding(customer);
PageBean<Customer> pb = new PageBean<Customer>();
if(request.getParameter("cp") != null && !request.getParameter("cp").trim().isEmpty()) {
int cp = Integer.parseInt(request.getParameter("cp"));
pb.setCp(cp);
}
else {
pb.setCp(1);
}
pb.setMd(10);
pb.setPd(service.query(customer,pb.getCd(),pb.getMd()));
pb.setDt(service.count());
String url = getUrl(request);
pb.setUrl(url);
request.setAttribute("pb",pb);
return "f:list.jsp";
}
多條件查詢的dao
public List<Customer> query(Customer customer ,int index,int length) {
//我們將其引數放入ArrayList中
List<Object> l = new ArrayList();
//我們使用StringBuffer連線我們所需要的條件
StringBuffer sql = new StringBuffer
("select * from t_customer where 1=1 ");
if(customer.getCname() != null && !customer.getCname().trim().isEmpty()) {
sql.append("and cname=? ");
l.add(customer.getCname());
}
if(customer.getBirthday() != null && !customer.getBirthday().trim().isEmpty()) {
sql.append("and birthday=? ");
l.add(customer.getBirthday());
}
if(customer.getCellphone() != null && !customer.getCellphone().trim().isEmpty()) {
sql.append("and cellphone=? ");
l.add(customer.getCellphone());
}
if(customer.getDescription() != null && !customer.getDescription().trim().isEmpty()) {
sql.append("and description=? ");
l.add(customer.getDescription());
}
if(customer.getEmail() != null && !customer.getEmail().trim().isEmpty()) {
sql.append("and email=? ");
l.add(customer.getEmail());
}
if(customer.getGender() != null && !customer.getGender().trim().isEmpty()) {
sql.append("and gender=? ");
l.add(customer.getGender());
}
sql.append("limit ?,?");
l.add(index);
l.add(length);
List<Customer> lc= null;
try {
lc = queryRunner.query(sql.toString(), new BeanListHandler<Customer>(Customer.class), l.toArray());
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return lc;
}