java 分页查询_JavaWeb之分页查询

本文介绍了在JavaWeb中实现分页查询的详细步骤,包括分页的优点、分页数据的组成、数据的传递以及分页在各层的处理。讲解了如何创建分页Bean(PageBean)用于存储分页信息,并展示了在Servlet、Dao和服务层中如何处理分页查询。同时,讨论了如何显示分页页码列表和在超链接中保留请求参数,确保多条件查询时不会丢失原有条件。
摘要由CSDN通过智能技术生成

时间:2016-12-11 01:41

1、分页的优点:

只查询一页,不需要查询所有数据,能够提高效率。

2、分页数据

页面的数据都是由Servlet传递的

*   当前页:pageCode

>   如果页面没有向Servlet传递页码,那么Servlet默认为第一页,否则按照传递页码为准。

*   总页数:totalPages

>   总记录数 / 每页记录数

*   总记录数:totalRecord

>   Dao来获取,select count(*) from customer

*   每页记录数:称为业务数据或系统数据。

*   当前页数据:beanList

*   URL

3、数据的传递

这些分页数据总要在各层之间来回传递,可以把这些分页数据封装到一个JavaBean中,它就叫分页Bean,例如:PageBean。

import java.util.List;

public class PageBean {

// 当前页码pageCode

private int pageCode;

/*

* 总页数

* 通过计算得出,不允许外界设置值

* 因为只能get,所以不需要成员变量,通过计算即可得出

*/

// private int totalPages;

// 总记录数

private int totalRecord;

// 每页记录数

private int pageSize;

// 当前页的记录

private List beanList;

public int getPageCode() {

return pageCode;

}

public void setPageCode(int pageCode) {

this.pageCode = pageCode;

}

public int getTotalPages() {

/*

* 计算总页数

* 通过总记录数和每页记录数来计算总页数,当存在余数时,总页数 + 1

*/

int totalPages = totalRecord / pageSize;

return totalRecord % pageSize == 0 ? totalPages : totalPages + 1;

}

// public void setTotalPages(int totalPages) {

// this.totalPages = totalPages;

// }

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 List getBeanList() {

return beanList;

}

public void setBeanList(List beanList) {

this.beanList = beanList;

}

@Override

public String toString() {

return "PageBean [pageCode=" + pageCode + ", totalPages=" + ", totalRecord=" + totalRecord + ", pageSize=" + pageSize + ", beanList=" + beanList + "]";

}

public PageBean(int pageCode, int totalRecord, int pageSize, List beanList) {

super();

this.pageCode = pageCode;

this.totalRecord = totalRecord;

this.pageSize = pageSize;

this.beanList = beanList;

}

public PageBean() {

super();

}

}

4、分页在各层中的处理

*   页面:给出分页相关的链接。

>   页面需要给Servlet传递当前页码。

*   Servlet:创建PageBean对象, 给PageBean对象所有的属性赋值,然后传递给页面。

>   给Dao传递当前页码和每页记录数。

*   Service:略

*   Dao

>   负责获取:totalRecord,select count(*) from customer

>   负责获取:BeanList,select * from customer limit x, y,从x行开始,查询y行。

>   limit计算公式:(当前页-1) * 每页记录数,得出的就是起始行

b67fd7d32c83fa6103be5b1319452cbf.png

5、显示分页页码列表

1 2 3 4 5 6 7 8 9 10

*   最多显示多少个页码?

>   暂定10个

*   当前页在页码列表中的位置?

>   暂定为6

只需要pageCode就可以完成页码列表,需要使用pageCode来推算出起始页码(begin)和结束页码(end)

计算公式:

*   如果总页数 <= 10(列表长度),那么begin = 1,end = 总页数

*   如果总页数 > 10,使用公式计算

>   begin = pageCode - 5

>   end = pageCode + 4

>   begin溢出:当begin小于1时,让begin = 1

>   end溢出:当end > totalPages时,让end = totalPages

6、在超链接中保留请求参数

当使用多条件查询时,如果点击其它超链接,会丢失原超链接中的参数,也就是丢失请求条件,所以需要在页面的所有超链接中都要保留参数。

可以把?后的全部参数用一个字符串保存到PageBean的URL属性中,这个任务交给Servlet。

然后在页面中使用${pageBean.url }来设置超链接。

——项目代码

114d4921a825d3d568c80e7b0d42ff4f.png

===============================================================================

com.wyc.cstm.dao.CustomerDao

import java.util.ArrayList;

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.wyc.cstm.domain.Customer;

import com.wyc.cstm.domain.PageBean;

import com.wyc.jdbc.TxQueryRunner;

/**

* 持久层 通过QueryRunner来操作数据库

*

* @author 31067

*

*/

public class CustomerDao {

private QueryRunner qr = new TxQueryRunner();

// /*

// * 查询全部客户信息

// */

// public List findAll() {

以下是JavaWeb中的简单分页完整代码,使用JSP和Servlet实现: 1. 在JSP页面中,使用表格展示数据并添加分页导航: ```jsp <%@ 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> <h1>分页示例</h1> <table border="1"> <tr> <th>ID</th> <th>姓名</th> <th>年龄</th> </tr> <c:forEach items="${list}" var="user"> <tr> <td>${user.id}</td> <td>${user.name}</td> <td>${user.age}</td> </tr> </c:forEach> </table> <br> <c:if test="${page > 1}"> <a href="list?page=${page - 1}">上一页</a> </c:if> <c:if test="${page < pageCount}"> <a href="list?page=${page + 1}">下一页</a> </c:if> </body> </html> ``` 2. 在Servlet中查询数据库并设置分页相关参数: ```java package com.example.servlet; import java.io.IOException; import java.util.List; 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 com.example.dao.UserDao; import com.example.entity.User; @WebServlet("/list") public class UserListServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int pageSize = 10; // 每页显示的记录数 int page = Integer.parseInt(request.getParameter("page")); // 当前页码 int offset = (page - 1) * pageSize; // 当前页第一条记录的偏移量 UserDao dao = new UserDao(); List<User> list = dao.list(offset, pageSize); // 查询当前页的数据 int totalCount = dao.count(); // 总记录数 int pageCount = (int) Math.ceil(totalCount * 1.0 / pageSize); // 总页数 request.setAttribute("list", list); request.setAttribute("page", page); request.setAttribute("pageCount", pageCount); request.getRequestDispatcher("list.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } ``` 3. 在DAO中查询数据库并返回数据: ```java package com.example.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.util.ArrayList; import java.util.List; import com.example.entity.User; public class UserDao { private String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"; private String username = "root"; private String password = "123456"; public List<User> list(int offset, int pageSize) { List<User> list = new ArrayList<>(); try (Connection conn = DriverManager.getConnection(url, username, password)) { String sql = "SELECT * FROM user LIMIT ?, ?"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setInt(1, offset); stmt.setInt(2, pageSize); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setAge(rs.getInt("age")); list.add(user); } } } } catch (Exception e) { e.printStackTrace(); } return list; } public int count() { int count = 0; try (Connection conn = DriverManager.getConnection(url, username, password)) { String sql = "SELECT COUNT(*) FROM user"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { count = rs.getInt(1); } } } } catch (Exception e) { e.printStackTrace(); } return count; } } ``` 可以根据需求自行修改代码,例如更改每页显示的记录数、更改查询语句等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值