1分页显示
1.1准备数据
创建数据表
Create table User( Id int primary key auto_increment, Uname varchar(30) not null, Uage int ); |
创建项目,添加相关的工具类和jar文件。
编写测试类循环的添加128条数据:
public class TestInsertData {
@Test public void testInserData() throws SQLException { QueryRunner qr = new QueryRunner(JDBCUtils.getDateSource()); for(int i = 0;i<128;i++) qr.update("insert into user(uname,uage) values(?,?)","鸣人"+i,20); } } |
1.2 页面和项目的结构
添加页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>鸣人的列表</title> </head> <body> <table align="center" width="300" border="1"> <tr> <th>#</th> <th>姓名</th> <th>年龄</th> </tr> <c:forEach items="${users }" var="u"> <tr> <td>${u.id }</td> <td>${u.uname }</td> <td>${u.uage }</td> </tr> </c:forEach> </table> <p> 当前第89/128 <a href="">首页</a> <a href="">上一页</a> <a href="">下一页</a> <a href="">尾页</a> </p> </body> </html> |
添加dao和service
1.3底层实现
DOA层:
分页查询数据的方法 queryByPage(int size,int page);
查询总条数的方法 queryCount();
package com.igeek.dao;
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 com.igeek.pojo.User; import com.igeek.util.JDBCUtils;
public class UserDAO {
QueryRunner qr = new QueryRunner(JDBCUtils.getDateSource());
/** * 分页查询 * @param size 每页大小 * @param page 当前页码 * @return */ public List<User> queryByPage(int size,int page){ String sql = "select * from user limit ?,?"; try { return qr.query(sql,new BeanListHandler<User>(User.class), (page-1)*size,size); } catch (SQLException e) { e.printStackTrace(); } return null; }
public int queryCount() { try { return new Integer(qr.query("select count(*) from user", new ScalarHandler()).toString()); } catch (NumberFormatException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } return 0; } }
|
Service层:
package com.igeek.service;
import java.util.List;
import com.igeek.dao.UserDAO; import com.igeek.pojo.User;
public class UserService {
private UserDAO userDAO = new UserDAO(); /** * 分页查询 * @param size 每页大小 * @param page 当前页码 * @return */ public List<User> queryByPage(int size,int page){ return userDAO.queryByPage(size, page); }
public int queryCount() { return userDAO.queryCount(); } }
|
1.4servlet实现
package com.igeek.servlet;
import java.io.IOException; import java.util.List;
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
import com.igeek.pojo.User; import com.igeek.service.UserService;
/** * Servlet implementation class UserServlet */ public class UserServlet extends HttpServlet { private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 将查询的数据添加到request的作用域,转发到index.jsp int size = 10; int page = 1;// 默认第一页 // 获取请求中的页码 try { page = Integer.parseInt(request.getParameter("page")); } catch (NumberFormatException e) { } // 创建service对象 UserService service = new UserService(); // 计算最大页面 int total = service.queryCount(); //最大页码 int maxPageNum = (int)Math.ceil(total*1.0/size); //将最大页面也放入request request.setAttribute("maxPageNum", maxPageNum); List<User> users = service.queryByPage(size, page); request.setAttribute("users", users); // 将页码也放入request request.setAttribute("page", page); request.getRequestDispatcher("userList.jsp").forward(request, response); }
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
|
修改页面:添加分页的部分:
1.5分页显示数据的总结
①任何分页查询都需要查询数据,同时查询总条数。因为页面需要知道最大页码是多少,需要计算。
②分页显示数据,页面的上一页,下一页等等连接,请求的还是当前页面的url。
③从servlet到jsp需要将数据列表(users),当前的页码,最大页面,总条数等等相关的需要在页面使用的数据设置到request的作用域中。
④页面的连接请求servlet时需要传入对应的页码和其他需要的参数。