分页查询的实现(struts2+jsp+jstl+el)

文章目录

  • MySQL的分页查询语句
  • 如何设置《上一页》和《下一页》的有效性呢?
  • 示例代码

MySQL的分页查询语句

使用 MySQL 的分页查询语句 select * from project limit 5,5,打开表 project,获取全部记录,只要第 5 条记录后的 5 条记录,不包含第 5 条记录在内,记录编号从 1 开始;如果记录编号从 0 开始,那么则从第 5 条记录起,要 5 条记录,包含第 5 条记录在内。

在 DAO 中将 select * from project limit ?,? 这条SQL语句框架准备好,在设置参数的时候,第1个参数设置为 (page-1)*rowsPerPage
第 2 个参数设置为 rowsPerPagepage 就是你要查看第几页,rowsPerPage 就是每页显示多少行,如果你要查看第 5 页,每页显示 5 行,那么就应该扣除前面 4 页的 20 行,应该从 21 条开始查询 5 条记录,MySQL 是通过索引值来定位记录的位置,第 21 行记录的索引值为 20,而 (page-1)*rowsPerPage 这个表达式计算出来正好是 20,那么第 2 个参数则是 5,表示的含义就是从索引值为 20 的记录开始获取5条记录(含起始行),正好就是第 5 页要显示的数据了。

如何设置《上一页》和《下一页》的有效性呢?

查询的页数是第一页时,表示前面已经没有了,那么《上一页》按钮则不可以点击;查询的页数如果是最后一页时,表示后面已经没有了,那么《下一页》按钮则不可以点击。

这里使用 jstl 标签 <c:choose> 结合 el 表达式来实现。

 <c:choose><c:when test="${page gt 1}"><a href="projectlist.action?page=${page-1}">上一页</a></c:when><c:otherwise>上一页</c:otherwise>
</c:choose>

示例代码

DAO 的示例代码:

package priv.lwx.struts2.dao;import priv.lwx.struts2.entity.Project;
import priv.lwx.struts2.util.ConnectionUtils;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;/*** description** @author liaowenxiong* @date 2022/2/7 13:18*/public class ProjectDAO {private static final String findAll = "select id,name,start_date,end_date from t_project";private static final String findAll2 = "select id,name,start_date,end_date from t_project limit ?, ?";private static final String totalRows = "select count(*) from t_project";/*** 获取所有项目的集合* @return*/public List<Project> findAll() {Connection conn;PreparedStatement pstmt;ResultSet rs;List<Project> list = new ArrayList<>();try {conn = ConnectionUtils.getConnection();pstmt = conn.prepareStatement(findAll);rs = pstmt.executeQuery();while (rs.next()) {Project project = new Project();project.setId(rs.getInt("id"));project.setName(rs.getString("name"));project.setStartDate(rs.getDate("start_date"));project.setEndDate(rs.getDate("end_date"));list.add(project);}} catch (SQLException e) {e.printStackTrace();}return list;}/*** 根据提供的页码和每页显示的行数获取工程集合** @param page* @param rowsPerPage* @return 工程的集合*/public List<Project> findAll(int page, int rowsPerPage) {Connection conn = ConnectionUtils.getConnection();PreparedStatement pstmt;ResultSet rs;List<Project> list = new ArrayList<>();try {pstmt = conn.prepareStatement(findAll2);pstmt.setInt(1, (page - 1) * rowsPerPage);pstmt.setInt(2, rowsPerPage);rs = pstmt.executeQuery();while (rs.next()) {Project project = new Project();project.setId(rs.getInt(1));project.setName(rs.getString(2));project.setStartDate(rs.getDate(3));project.setEndDate(rs.getDate(4));list.add(project);}} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}return list;}/*** 获取总的页数* @param rowsPerPage 传入每页显示的行数* @return 返回总的页数*/public int getTotalPages(int rowsPerPage) {Connection conn;PreparedStatement pstmt;ResultSet rs;conn = ConnectionUtils.getConnection();try {pstmt = conn.prepareStatement(totalRows);rs = pstmt.executeQuery();rs.next();int totalRows = rs.getInt(1);if (totalRows % rowsPerPage == 0) {return totalRows / rowsPerPage;} else {return totalRows / rowsPerPage + 1;}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}

Action 的示例代码:

package priv.lwx.struts2;import priv.lwx.struts2.dao.ProjectDAO;
import priv.lwx.struts2.entity.Project;import java.util.List;/*** description** @author liaowenxiong* @date 2022/2/7 15:19*/public class ProjectListAction {// inputprivate int page = 1;private int rowsPerPage = 3;// outputprivate List<Project> projects;private int totalPages;public int getTotalPages() {return totalPages;}public void setTotalPages(int totalPages) {this.totalPages = totalPages;}public String execute() {ProjectDAO pdao = new ProjectDAO();// projects = pdao.findAll();projects = pdao.findAll(page, rowsPerPage);totalPages = pdao.getTotalPages(rowsPerPage);return "success";}public List<Project> getProjects() {return projects;}public void setProjects(List<Project> projects) {this.projects = projects;}public int getPage() {return page;}public void setPage(int page) {this.page = page;}public int getRowsPerPage() {return rowsPerPage;}public void setRowsPerPage(int rowsPerPage) {this.rowsPerPage = rowsPerPage;}
}

jsp 示例代码:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<h1>Project List
</h1>
<h2><c:choose><c:when test="${page gt 1}"><a href="projectlist.action?page=${page-1}">上一页</a></c:when><c:otherwise>上一页</c:otherwise></c:choose>|第${page}页|<c:choose><c:when test="${page lt totalPages}"><a href="projectlist.action?page=${page+1}">下一页</a></c:when><c:otherwise>下一页</c:otherwise></c:choose>
</h2>
<table width="90%" border="2"><tr><td>ID</td><td>NAME</td><td>Start Date</td><td>End Date</td></tr><c:forEach items="${projects}" var="project"><tr><td>${project.id}</td><td>${project.name}</td><td>${project.startDate}</td><td>${project.endDate}</td></tr></c:forEach>
</table>
</body>
</html>

以上的方式是通过 jstl 标签库和 el 表达式相结合来实现的,当然我们也可以通过 Java 代码来实现,就是在 jsp 中添加如下的 Java 代码片段:

<%
String strPage = request.getParameter("page");
int Page = Integer.parseInt(strPage);
if(page!= 1){
page = page-1;
out.print("<a href='projectlist.action?page="+page+"'>上一页</a>");
}else{
out.print("上一页");
}%>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

junit 测试执行顺序_JUnit 5中的测试执行顺序

junit 测试执行顺序一般实践认为&#xff0c;自动化测试应能够独立运行且无特定顺序&#xff0c;并且测试结果不应依赖于先前测试的结果。 但是在某些情况下&#xff0c;可以证明特定的测试执行顺序是正确的&#xff0c;尤其是在集成或端到端测试中。 默认情况下&#xff0c;在…

python的起源和发展_Python入门第一课——Python的起源、发展与前景!

我们在做任何一件事情之前&#xff0c;我们都会通过各种渠道去搜集事情的信息&#xff0c;了解事情的来龙去脉&#xff0c;学习一门编程语言也是如此&#xff0c;只有知根知底&#xff0c;我们才能有明确的方向和目标&#xff0c;以及底气去完成这件事情&#xff0c;今天我带大…

MySQL分页查询语句

单表分页查询语句&#xff1a; select * from tbl_name limit start_index, rows_per_page&#xff1b;start_index&#xff1a;每页数据的起始行的索引值&#xff0c;行的索引值从 0 开始 rows_per_page&#xff1a;每页显示的行数 page_num&#xff1a;查询的页码 关系式&a…

spring依赖注入_Spring依赖注入

spring依赖注入介绍&#xff1a; 在设计良好的Java应用程序中&#xff0c;这些类应尽可能独立。 这样的设计提高了组件的可重用性。 它还使对各个组件进行单元测试变得更加容易。 依赖注入的概念促进了Java对象之间的松散耦合。 在本教程中&#xff0c;我们将讨论Spring框架中…

excel 时间戳_我没有Excel基础,可以学Power BI吗

当然可以&#xff01;没有Excel基础一样可以熟练掌握Power BI !Excel基础可以略微影响Power BI的上手速度&#xff0c;却不能决定最终对Power BI的运用能力。如果有Excel基础学习Power BI在最初阶段会更快&#xff0c;但经过实践证明&#xff0c;Excel基础对于PBI的学习进度影响…

Windows下查看wifi密码的命令

netsh wlan show profiles namewifi名称 keyclear

lemon geci_创建一个Java :: Geci生成器

lemon geci几天前&#xff0c;我写了有关Java :: Geci架构&#xff0c;代码生成原理以及生成Java源代码的可能不同方式的文章。 在本文中&#xff0c;我将讨论在Java :: Geci中创建生成器有多么简单。 您好&#xff0c;Wold生成器 HelloWorld1 最简单的生成器是Hello, World…

安卓 图像清晰度识别_OCR文字识别的功能及注意事项

首先OCR文字识别是指电子设备检查纸上打印的字符&#xff0c;然后用OCR文字识别技术翻译成计算机文字的过程&#xff1b;就是对文本资料进行扫描&#xff0c;然后对图像文件进行分析处理&#xff0c;获取文字及版面信息的过程。那么在日常生活中有很多公司有文字识别这方面需求…

薪资/薪水/金额的数据类型

MySQL 数据库中&#xff0c;金额字段使用的数据类型和长度建议为&#xff1a;decimal(11,2) 而对应的实体类的成员变量的数据类型建议为&#xff1a;BigDecimal

java中list去除空值_Java –从列表中删除所有空值

java中list去除空值介绍&#xff1a; 在本文中&#xff0c;我们将学习如何使用普通的Java&#xff0c;Java 8 lambda表达式和某些第三方库从Java 列表中删除空值 。 所以&#xff0c;让我们开始吧&#xff01; 从Java中的 让我们探索从Java 列表中删除null的不同方法&#xf…

URI is not registered (Settings | Languages Frameworks | Schemas and DTDs)

参考&#xff1a; https://www.cnblogs.com/ttflove/p/6341469.html https://blog.csdn.net/c_learner_/article/details/107228678

无法识别的属性“targetframework”。请注意属性名称区分大小写。_神奇!你思考过计算机是怎么识别玻璃和透明物体的吗?...

真实场景中的镜面/玻璃检测和语义分割Charmve | English | Chinesehttps://github.com/Charmve/Mirror-Glass-Detection在这个项目中&#xff0c;我正在学习反射镜和玻璃检测/分段技术。镜子是反射表面&#xff0c;可以反射前面的场景&#xff0c;而玻璃是透明表面&#xff0c;…

Java中的out.write()和out.print()的区别

out 就是 PrintWriter 对象。 out.print() 有处理空值&#xff0c;如果传入的字符串为 null&#xff0c;则会转换为"null"字符串&#xff0c;print() 后续还是调用的 write() 方法&#xff0c;write() 传入的字符串不能为空。这个可以通过 PrintWriter 的源码中看到…

python if else用法_python列表推导式中使用if-else

今天在处理自动化邮件数据时碰到数据行中包含字符串后&#xff0c;从hive中拿到的整数型数据自动转化成了浮点数&#xff0c;严重影响美观性。因此想到了用列表推导式来做转化&#xff0c;将其中的数字型数据全部转化为整型&#xff0c;而字符型数据保留原样。 列表推导式总共有…

java使用:: 表达式_Java 12:开关表达式

java使用:: 表达式在Java 12中&#xff0c;对switch语句进行了增强&#xff0c;以便可以将其用作表达式。 现在也可以在一种情况下打开多个常量&#xff0c;从而使代码更简洁易读。 这些增强功能是一种预览语言功能 &#xff0c;这意味着必须使用--enable-preview标志在Java编译…

jsp中request.getAttributeNames()报红

缺少 servlet-api 依赖&#xff1a; <dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency>

fluent瞬态_Java中的瞬态关键字及其使用

fluent瞬态最近&#xff0c;我在一个朋友的一个研究项目中遇到了一个十字架&#xff0c;他们正在学习Java编程的基础知识&#xff0c;其中一些被遗忘的敏感信息打印在文本文件中&#xff0c;并记住了Java中的瞬时关键字。 Java中的瞬时关键字在安全性方面起着重要作用&#xf…

jsp中out.println()报红

需要引入 jsp-api&#xff1a; <dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.2.1-b03</version> </dependency>

graphql 有必要吗_您准备好观看GraphQL了吗?

graphql 有必要吗在上一篇文章中&#xff0c;我们讨论了GraphQL与REST相比的优势。 在本文中&#xff0c;我们将看到GraphQL的实际应用。 我创建了一个示例应用程序来展示REST和GraphQL之间的差异。 首先&#xff0c;我们将看到简单产品细节端点的REST实现。 我已经使用Spring …

报错java.lang.NoClassDefFoundError: ognl/DefaultMemberAccess

不要使用新版的 ognl&#xff0c;从 3.2 开始&#xff0c;会报各种乱七八糟的错误。建议使用 3.1.x 版本的&#xff0c;例如下面的版本&#xff1a; <dependency><groupId>ognl</groupId><artifactId>ognl</artifactId><version>3.1.15&l…