版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
这里先说一下大体的思路,只是简单的概述,后面会贴上代码,以及测试的结果,待会在另一篇文章中,我会写出一些我碰到的问题及解决方法。
1.封装一个泛型类PageBean,用来处理不同情况下接受到的不同类型的数据。
2.使用sql语句限制每个页面所查询的数据开始的位置以及每个页面显示的条数。
3.根据用户在jsp页面点击的数据,通过servlet创建一个PageBean对象,然后在service层根据Dao层从数据库返回的属性对PageBean对象进行封装,并且再返回给servlet,servlet存到域中,并在前端jsp页面中进行遍历。
4.通过JSP自定义标签TAG对JSP页面的代码就行封装,实现在不同页面不同数据之间进行分页。**
第一步
封装一个泛型类,用来接收不同类型的参数
package bean;
import java.util.List;
/**通用的分页bean
* @author wang7
*查询不同的数据时,对应封装为T类型
* @param <T>
*/
public class PageBean<T> {
private int pagesize = 3; //页面存放数据的条数
private int nowpage = 1; //当前页的页码 ----从页面来
private int total; //查询出的总记录数 ----从数据库查询
private int lastpage; //末尾页的页码 -----有了total能算出
private List<T> datas; //每页里数据对象的聚合 ----从数据库查询
private int first;//1显示2不显示 ----知道nowpage是几 如果是1不显示
private int last;//1显示2不显示 ---- 知道nowpage是几 如果是最后一页不显示
private int previous;//1显示2不显示 ----知道nowpage是几 如果是1不显示
private int next;//1显示2不显示 知道nowpage是几 如果是最后一页不显示
public PageBean() {
super();
// TODO Auto-generated constructor stub
}
public int getPagesize() {
return pagesize;
}
public void setPagesize(int pagesize) {
this.pagesize = pagesize;
}
public int getNowpage() {
return nowpage;
}
public void setNowpage(int nowpage) {
this.nowpage = nowpage;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
//根据总记录数和页面大小计算lastpage
this.lastpage = total%pagesize==0?total/pagesize:total/pagesize+1;
//首尾页及前后页可用的条件
this.first = this.nowpage>1?1:2;
this.last = this.nowpage<this.lastpage?1:2;
this.previous = this.nowpage>1?1:2;
this.next = this.nowpage<this.lastpage?1:2;
}
public int getLastpage() {
return lastpage;
}
public void setLastpage(int lastpage) {
this.lastpage = lastpage;
}
public List<T> getDatas() {
return datas;
}
public void setDatas(List<T> datas) {
this.datas = datas;
}
public int getFirst() {
return first;
}
public void setFirst(int first) {
this.first = first;
}
public int getLast() {
return last;
}
public void setLast(int last) {
this.last = last;
}
public int getPrevious() {
return previous;
}
public void setPrevious(int previous) {
this.previous = previous;
}
public int getNext() {
return next;
}
public void setNext(int next) {
this.next = next;
}
@Override
public String toString() {
return "PageBean [pagesize=" + pagesize + ",
nowpage=" + nowpage + ", total=" + total + ",
lastpage=" + lastpage+ ", datas=" + datas + ",
first=" + first + ", last=" + last + ", previous="
+ previous + ", next="
+ next + "]";
}
}
第二步
用户点击前端jsp,转入servlet,传来两个parameter,一个是调用的方法,另一个是nowpage当前页的代码,默认为1,在servlet中,船舰一个PageBean对象,并传入Service,Service中,通过Dao层对数据库中的数据进行查询,并且将查询的结果返回给Service,然后对PageBean对象进行封装返回给servlet,在Dao层,使用DButils工具进行数据的查询。
servlet中代码
private void userlistpage(HttpServletRequest request, HttpServletResponse response) {
//获取当前页码
int nowpage = Integer.parseInt(request.getParameter("nowpage"));
//创建一个PageBean对象
PageBean<User> pagebean = new PageBean<User>();
//设置初始值
pagebean.setNowpage(nowpage);
pagebean.setPagesize(3);
通过UserService 创建一个实现类
UserService us = new UserListServiceImpl();
在UserListServiceImpl类中对PageBean对象进行处理,并返回一
个新的PageBean对象
PageBean<User> sexypagebean = us.userlistpage(pagebean);
request.setAttribute("pagebean", sexypagebean);
try {
request.getRequestDispatcher("/WEBINF/admin/userlistpage.jsp").forward(request, response);
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
service实现类代码
package service.impl;
import java.util.List;
import bean.PageBean;
import bean.User;
import dao.UserDao;
import dao.impl.UserListDaoImpl;
import service.UserService;
public class UserListServiceImpl implements UserService {
UserDao ud = new UserListDaoImpl();
@Override
public PageBean<User> userlistpage(PageBean<User> pagebean) {
// TODO Auto-generated method stub
//查询总记录数
int total = ud.queryAll();
//查询每页的记录
List<User> datas = ud.querypagelimit(pagebean);
对PageBean对象进行封装,并返回给servlet
pagebean.setTotal(total);
pagebean.setDatas(datas);
return pagebean;
}
}
Dao层代码
使用DButil工具进行查询
package dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import bean.PageBean;
import bean.User;
import dao.UserDao;
import utils.PoolUtil;
public class UserListDaoImpl implements UserDao {
@Override
public int queryAll() {
String sql = "select count(uid) as cs from tuser";
Object[] obj =null;
QueryRunner qr = new QueryRunner(PoolUtil.getDataSource());
try {
Number number = qr.query(sql, new ScalarHandler<Number>("cs"), obj);
return number.intValue();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
@Override
public List<User> querypagelimit(PageBean<User> pagebean) {
String sql = "SELECT * FROM tuser limit ?,?";
//这里第一个占位符是 页面大小*(当前页码-1)
Object[] obj = {(pagebean.getNowpage()-1)*pagebean.getPagesize(),pagebean.getPagesize()};
QueryRunner qr = new QueryRunner(PoolUtil.getDataSource());
try {
List<User> datas = qr.query(sql, new BeanListHandler<User>(User.class), obj);
return datas;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
3.处理jsp页面
只是演示分页的功能其他的代码没有贴
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib tagdir="/WEB-INF/tags" prefix="page" %>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>基本模板</title>
<link href="${pageContext.request.contextPath }/img/favicon.png" rel="icon" />
<!-- Bootstrap css -->
<link href="${pageContext.request.contextPath }/css/bootstrap.css" rel="stylesheet">
<script src="${pageContext.request.contextPath }/js/jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
<script src="${pageContext.request.contextPath }/js/jquery-3.4.1.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<div class="container-fluid">
<div id="row" style="background-color: #E4B9B9;">
<form class="form-inline">
<div class="form-group">
<input type="text" class="form-control" id="mysearchtext" name="mysearchtext" placeholder="模糊搜索">
</div>
<button type="submit" class="btn btn-default">搜索</button>
</form>
</div>
<div id="row" style="margin-top: 10px; background-color: #C1E2B3;">
<table class="table table-bordered table-hover">
<tr>
<th>用户id</th>
<th>用户名</th>
<th>密码</th>
<th>昵称</th>
<th>性别</th>
<th>生日</th>
<th>邮箱</th>
<th>头像</th>
<th>状态</th>
<th>操作</th>
</tr>
<c:forEach items="${pagebean.datas }" var="user">
<tr>
<td>${user.uid }</td>
<td>${user.uname }</td>
<td>${user.upassword }</td>
<td>${user.unick }</td>
<td>${user.usexdisplay }</td>
<td>${user.ubirthday }</td>
<td>${user.uemail }</td>
<td>
<img width="40px" height="40px" src="http://localhost:9090/meitu/photo/${user.uphoto }">
</td>
<td>${user.ustatedisplay }</td>
<td>
<a href="后台" class="btn btn-warning">修改</a>
<a href="后台" class="btn btn-danger">删除</a>
</td>
</tr>
</c:forEach>
</table>
</div>
//这里是自定义的TAG标签
<page:paga actionpath="userlistservlet?method=userlistpage"></page:paga>
</div>
</body>
<script type="text/javascript" src="页面/js/jquery-3.4.1.js">
$("table tr th").hover(function(){
$(this).addClass("success");
},function(){
$(this).removeClass("success");
});
</script>
</html>
自定义的tag标签,导入到jsp页面。
这里有一些关键的实现逻辑
<%@ tag language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%-- 创建自定义的tag标签,type要使用全路径类名 --%>
<%@ attribute name="actionpath" required="true" type="java.lang.String" %>
<nav aria-label="Page navigation">
<ul class="pagination" style="padding-left:25%">
<%-- 如果是pagebean.first等于一--%>
<c:if test="${pagebean.first == 1 }">
<li><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=1"><span>首页</span></a></li>
</c:if>
<%-- 如果是pagebean.previous等于一--%>
<c:if test="${pagebean.previous == 1 }">
<li><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=${pagebean.nowpage-1}"><span>«</span></a></li>
</c:if>
<%-- 设置前后可见超链接个数--%>
<c:set var="start" value="${pagebean.nowpage - 2 }"></c:set>
<c:set var="ends" value="${pagebean.nowpage + 2 }"></c:set>
<%-- 用来控制超链接个数,始终显示五个超链接--%>
<c:if test="${ends >pagebean.lastpage }">
<c:set var="ends" value="${pagebean.lastpage }"></c:set>
<c:set var="start" value="${pagebean.nowpage-(pagebean.nowpage+2-pagebean.lastpage+2) }"></c:set>
</c:if>
<c:if test="${ends < 5 && pagebean.lastpage >5 }">
<c:set var="ends" value="5"></c:set>
</c:if>
<%-- 控制超链接的最大最小值一--%>
<c:if test="${start < 1 }">
<c:set var="start" value="1"></c:set>
</c:if>
<%-- 进行遍历--%>
<c:forEach begin="${start }" end="${ends }" step="1" var="v" varStatus="vs">
<c:if test="${pagebean.nowpage == v }">
<li class="active"><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=${v}">${v }</a></li>
</c:if>
<c:if test="${pagebean.nowpage != v }">
<li><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=${v}">${v }</a></li>
</c:if>
</c:forEach>
<%-- 如果是pagebean.next等于一--%>
<c:if test="${pagebean.next == 1 }">
<li><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=${pagebean.nowpage+1}"><span>»</span></a></li>
</c:if>
<%-- 如果是pagebean.last等于一--%>
<c:if test="${pagebean.last == 1 }">
<li><a href="${pageContext.request.contextPath }/${actionpath}&nowpage=${pagebean.lastpage}"><span>尾页</span></a></li>
</c:if>
<li><a><span>${pagebean.nowpage } / ${pagebean.lastpage }</span></a></li>
<li><a><span>总记录数:${pagebean.total }</span></a></li>
</ul>
</nav>