先创建一个PageBean:
public class PageBean<T> {
private int pc;//记录当前页码
private int tr;//总记录数
private int ps;//每页记录数
//请求路径和参数,例如:/BookServlet?...
private String url;
private List<T> beanList;
// 计算总页数
public int getTp() {
int tp = tr / ps;
return tr % ps == 0 ? tp : tp + 1;
}
public int getPc() {
return pc;
}
public void setPc(int pc) {
this.pc = pc;
}
public int getTr() {
return tr;
}
public void setTr(int tr) {
this.tr = tr;
}
public int getPs() {
return ps;
}
public void setPs(int ps) {
this.ps = ps;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public List<T> getBeanList() {
return beanList;
}
public void setBeanList(List<T> beanList) {
this.beanList = beanList;
}
创建一个page.jsp(pb是PageBean对象,在Servlet中存放到request中):
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<link rel="stylesheet" type="text/css" href="css/pager.css">
<script type="text/javascript">
function _go() {
var pc = $("#pageCode").val(); //获取文本框中的当前页码
if(!/^[1-9]\d*$/.test(pc)) { //对当前页码进行整数校验
alert('请输入正确的页码!');
return;
}
if(pc > "${pb.tp}") { //判断当前页码是否大于最大页
alert('请输入正确的页码!');
return;
}
location = "${pb.url}&pc=" + pc;
}
</script>
<div class="divBody">
<div class="divContent">
<!--上一页 当前页如果是第一页,那么就不能点击“上一页”。-->
<c:choose>
<c:when test="${pb.pc == 0 }"><span class="spanBtnDisabled">上一页</span></c:when>
<c:when test="${pb.pc eq 1 }"><span class="spanBtnDisabled">上一页</span></c:when>
<c:when test="${pb.pc ne 0 && pb.pc ne 1 }"><a href="${pb.url }&pc=${pb.pc-1}" class="aBtn bold">上一页</a></c:when>
</c:choose>
<!--计算页码列表的开始和结束位置,即两个变量begin和end
计算它们需要通过当前页码!
1. 总页数不足3页 begin=1, end=最大页
2. 设置begin和end,begin=当前页-1,end=当前页+3
3. 如果begin<1,那么让begin=1,end=6
4. 如果end>tp, 让begin=tp-5, end=tp
5. pb指的是servlet中根据数据库查询结果封装的PageBean对象,通过request传送
-->
<c:choose>
<c:when test="${pb.tp <= 3}">
<c:set var="begin" value="1"/>
<c:set var="end" value="${pb.tp }"/>
</c:when>
<c:when test="${pb.tp > 3}">
<c:set var="begin" value="${pb.pc-1 }"/>
<c:set var="end" value="${pb.pc + 2}"/>
<c:choose>
<c:when test="${begin<1}">
<c:set var="begin" value="1"/>
<c:set var="end" value="3"/>
</c:when>
<c:when test="${end>pb.tp}">
<c:set var="begin" value="${pb.tp-2 }"/>
<c:set var="end" value="${pb.tp}"/>
</c:when>
</c:choose>
</c:when>
</c:choose>
<c:if test = "${pb.tp ne 0}">
<c:forEach begin="${begin }" end="${end }" var="i">
<c:choose>
<c:when test="${i eq pb.pc }">
<span class="spanBtnSelect">${i}</span>
</c:when>
<c:when test="${i ne pb.pc && i ne 0}">
<a href="${pb.url }&pc=${i}" class="aBtn">${i }</a>
</c:when>
</c:choose>
</c:forEach>
<!-- 计算begin和end -->
<!-- 如果总页数<=3,那么显示所有页码,即begin=1 end=${pb.tp} -->
<!-- 设置begin=当前页码-2,end=当前页码+3 -->
<!-- 如果begin<1,那么让begin=1 end=3 -->
<!-- 如果begin==end,那么不显示 -->
<!-- 如果end>最大页,那么begin=最大页-2 end=最大页 -->
</c:if>
<!-- 显示点点点 -->
<c:if test="${end < pb.tp }">
<span class="spanApostrophe">...</span>
</c:if>
<!--下一页 -->
<c:choose>
<c:when test="${pb.pc eq pb.tp }"><span class="spanBtnDisabled">下一页</span></c:when>
<c:when test="${pb.tp eq 0 }"><span class="spanBtnDisabled">下一页</span></c:when>
<c:when test="${pb.pc ne pb.tp && pb.tp ne 0 }"><a href="${pb.url }&pc=${pb.pc+1}" class="aBtn bold">下一页</a></c:when>
</c:choose>
<%-- 共N页 到M页 --%>
<span>共<span style="size: 10px">${pb.tp }</span>页</span>
<span>到</span>
<c:choose>
<c:when test ="${pb.tp == 0 }">
</c:when>
<c:when test ="${pb.tp > 0 }">
<input type="text" class="inputPageCode" id="pageCode" value="${pb.pc }"/>
</c:when>
</c:choose>
<span>页</span>
<a href="javascript:_go();" class="aSubmit">确定</a>
</div>
</div>
创建一个servlet与jsp进行交互获取pageBean对象,通过request请求转发到jsp页面,通过遍历pb.beanList来显示需分页显示的内容:
private static final long serialVersionUID = 1L;
/*
* 获取当前页码
*/
private int getPageCode(HttpServletRequest req) {
String pageCode = req.getParameter("pc");
if(pageCode == null) return 1;
if(Integer.parseInt(pageCode) <= 0) return 1;
try {
return Integer.parseInt(pageCode);
} catch(Exception e) {
return 1;
}
}
/**
* 获取pageBean的url,req.getRequestURI()获得请求的地址(?前的一串),要去掉&pc= ,因为点击第几页时要动态的为地址拼装上&pc= ,以达到分页的效果
* @param request
* @param response
*/
private String getUrl(HttpServletRequest req){
String url = req.getRequestURI() + "?" + req.getQueryString();
int fromIndex = url.lastIndexOf("&pc=");
if(fromIndex == -1){
return url;
}
int toIndex = url.indexOf("&", fromIndex + 1);
if(toIndex == -1){
return url.substring(0, fromIndex);
}
return url.substring(0, fromIndex) + url.substring(toIndex);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
/**
* 1. 获取当前页码
*/
int pc = getPageCode(request);
/**
* 2. 使用BookService查询,得到PageBean
*/
String type = request.getParameter("type");//jsp跳进servlet的方式通过<a href="/bookshop/BookServlet?type= ">获得
BookService bookService = new BookService();
PageBean<ShowInfo> pb = bookService.findByType(type, pc);//按书的种类和当前页码进行查询,其中type作为查询的限制条件,页面作为数据库查询时limit的起始查询位置
/**
* 3. 获取url,设置给PageBean
*/
String url = getUrl(request);
pb.setUrl(url);
/**
* 4. 把PageBean保存到request中,请求转发
*/
request.setAttribute("pb", pb);
request.getRequestDispatcher("/home/home.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
创建service:
public PageBean<Book> findByType(String type, int pc) {
try {
BookDao bookDao = new BookDao();
return bookDao.findByType(type, pc);
} catch (SQLException e) {
throw new RuntimeException(e);
}
}创建dao:
public PageBean<Book> findByType(String type, int pc) throws SQLException {
Connection conn = null;
ResultSet rs = null;
List<Book> bookList = null;
try{
bookList = new ArrayList<Book>();
int ps = PageConstants.BOOK_PAGE_SIZE;//PageConstants.BOOK_PAGE_SIZE静态属性定义了每页显示的数据量,也是PageBean中的ps属性
String sql = "select * from book where type = ' " + type +" ' limit "+ps * (pc-1) + "," + ps;
//获取总记录数
String sql1 = "select count(*) from book where type = '" + type +" ' ";
conn = DBTools.getConnection();
st = conn.createStatement();
rs = st.executeQuery(sql);
while(rs.next()){
Book book = new Book();
book.setAuthor(rs.getString("author"));
book.setB_no(rs.getString("b_no"));
book.setBook_info(rs.getString("book_info"));
book.setType(rs.getString("type"));
bookList.add(showInfo);
}
rs1 = st.executeQuery(sql1);
int tr = 0;
while(rs1.next()){
tr = rs1.getInt(1); //获取总记录数
}
PageBean<Book> pb = new PageBean<ShowInfo>();
pb.setBeanList(BookList);
pb.setPs(ps);
pb.setPc(pc);
pb.setTr(tr);
return pb;
}catch(Exception e){
e.printStackTrace();
}finally{
DBTools.close(conn);
DBTools.close(st);
DBTools.close(rs);
}
return null;
浙公网安备 33010602011771号