分页挺难的,看了两遍我都有点没搞懂,这个逻辑过程挺复杂的,算是我学这个来最大的问题了。
下面我们分步骤来详细介绍分页技术。
(刚才准备分页代码的时候出现这么一个错误: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;
}
}
这就是分页技术详细过程啦,随便转载!(逃