jsp分页显示完整实例

下面就来详细讲解一下“jsp分页显示完整实例”的攻略。

什么是分页显示?

分页显示是指将大量数据分开展示,并通过页面的控件使用户可以翻页操作,进行查看。

为什么需要分页显示?

如果展示的数据量过大,会导致页面加载速度变慢,甚至使页面崩溃。另外,用户在查看数据时,如果没有分页功能,会使得他们无法方便地找到所需数据。

实现分页显示的方法

实现分页显示有多种方法,例如前端实现分页功能,后端实现分页功能等,这里我们主要介绍一种流行的方式——后端实现分页功能。

后端实现分页功能的流程如下:

  1. 从数据库中查询出需要分页展示的数据。

sql
SELECT * FROM table_name LIMIT 0, 10;

这里的LIMIT语句表示从数据库table_name中取出第1条到第10条数据。

  1. 将数据展示在页面上。

  2. 在页面上添加分页控件,使用户可以翻页操作。

  3. 用户操作分页控件后,重新从数据库获取数据,再将数据展示在页面上。

接下来,我们以一个实例来介绍如何使用jsp实现分页功能。

实例1:使用jsp分页显示员工列表

1. 实现分页的后端代码

  • JSP页面

```jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ page import="java.util." %>
<%@ page import="java.sql.
" %>



<span class="wpcom_tag_link"><a href="https://pythonjishu.com/tag/java/" title="Java" target="_blank">Java</a></span>Web Demo


<%@include file="header.jsp" %>
<% int page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page")); int pageSize = 10; int startRow = (page - 1) * pageSize; String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String username = "root"; String password = "123456"; String driver = "com.mysql.cj.jdbc.Driver"; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); String sql = "SELECT * FROM employee LIMIT ?, ?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, startRow); preparedStatement.setInt(2, pageSize); resultSet = preparedStatement.executeQuery(); List> resultList = new ArrayList<>();
while (resultSet.next()) {
Map map = new HashMap<>();
map.put("name", resultSet.getString("name"));
map.put("age", resultSet.getInt("age"));
map.put("salary", resultSet.getDouble("salary"));
resultList.add(map);
}

int rowCount = 0;
sql = "SELECT COUNT(*) FROM employee";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
rowCount = resultSet.getInt(1);
}

int pageCount = rowCount % pageSize == 0 ? rowCount / pageSize : rowCount / pageSize + 1;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
%>

<% for (Map map : resultList) { %>

<% } %>

姓名 年龄 薪资
<%= map.get("name") %> <%= map.get("age") %> <%= map.get("salary") %>


```

在页面上,我们使用了一个表格展示员工列表,同时,在页面底部添加了一个分页控件。

在JSP页面中,我们通过request.getParameter("page")获取到当前请求的页码,如果没有传入页码,则默认为第一页。

从数据库中获取数据的SQL语句为SELECT * FROM employee LIMIT ?, ?,在SQL语句中我们使用了LIMIT语句,表示从employee表中取出数据的起始行数和行数条数。

在获取到数据后,我们将它封装成一个List>集合对象,再通过循环将数据展示在页面上。

  • 控制器代码

```java
package com.demo.controller;

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 java.io.IOException;

@WebServlet("/employee")
public class EmployeeController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/employee.jsp").forward(req, resp);
}
}
```

控制器代码非常简单,就是将请求转发到JSP页面上。

2. 实现分页的前端代码

前端代码中,我们主要就是添加了一个分页控件。

前端代码如下:

<ul>
  <li><a href="?page=1">首页</a></li>
  <li><a href="?page=<%= page - 1 < 1 ? 1 : page - 1 %>">上一页</a></li>
  <%
      for (int i = 1; i <= pageCount; i++) {
          if (page == i) {
  %>
              <li><a href="?page=<%= i %>" style="color: red;"><%= i %></a></li>
          <% } else { %>
              <li><a href="?page=<%= i %>"><%= i %></a></li>
          <% } %>
      <% } %>
  <li><a href="?page=<%= page + 1 > pageCount ? pageCount : page + 1 %>">下一页</a></li>
  <li><a href="?page=<%= pageCount %>">末页</a></li>
</ul>

在分页控件中,我们使用了一个for循环,循环次数为pageCount,表示总页数。在循环中,我们判断当前循环的页码是否等于当前所显示的页码,如果相等就为该页码添加style="color: red;"属性,表示当前页;否则就展示为普通的超链接。

示例2:JSP实现使用自定义标签分页显示

除了在页面中写代码实现分页功能外,还可以使用JSP自定义标签来实现分页显示。

1. 实现分页的后端代码

  • JSP页面

```jsp
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="custom" uri="/taglib/page" %>



JavaWeb Demo


<%@include file="header.jsp" %>
<% int page = request.getParameter("page") == null ? 1 : Integer.parseInt(request.getParameter("page")); int pageSize = 10; int startRow = (page - 1) * pageSize; String url = "jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8"; String username = "root"; String password = "123456"; String driver = "com.mysql.cj.jdbc.Driver"; Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { Class.forName(driver); connection = DriverManager.getConnection(url, username, password); String sql = "SELECT * FROM employee LIMIT ?, ?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, startRow); preparedStatement.setInt(2, pageSize); resultSet = preparedStatement.executeQuery(); List> resultList = new ArrayList<>();
while (resultSet.next()) {
Map map = new HashMap<>();
map.put("name", resultSet.getString("name"));
map.put("age", resultSet.getInt("age"));
map.put("salary", resultSet.getDouble("salary"));
resultList.add(map);
}

int rowCount = 0;
sql = "SELECT COUNT(*) FROM employee";
preparedStatement = connection.prepareStatement(sql);
resultSet = preparedStatement.executeQuery();
if (resultSet.next()) {
rowCount = resultSet.getInt(1);
}

int pageCount = rowCount % pageSize == 0 ? rowCount / pageSize : rowCount / pageSize + 1;

request.setAttribute("pageCount", pageCount);
request.setAttribute("page", page);
request.setAttribute("resultList", resultList);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
%>

<% for (Map map : resultList) { %>

<% } %>

姓名 年龄 薪资
<%= map.get("name") %> <%= map.get("age") %> <%= map.get("salary") %>



```

在JSP页面中,我们引用了一个自定义标签custom:page,这个标签的具体实现可以在后面的代码中看到。

在获取到数据后,我们将它封装成一个List>集合对象,同样使用循环将数据展示在页面上。

  • 控制器代码同示例1。

2. 实现分页的标签代码

  • 标签处理类

```java
package com.demo.taglib;

import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.SimpleTagSupport;
import java.io.IOException;

public class PageTag extends SimpleTagSupport {
// 每页记录数
private int pageSize;
// 总页数
private int pageCount;
// 当前页
private int currentPage;

  public void setPageSize(int pageSize) {
      this.pageSize = pageSize;
  }

  public void setPageCount(int pageCount) {
      this.pageCount = pageCount;
  }

  public void setCurrentPage(int currentPage) {
      this.currentPage = currentPage;
  }

  @Override
  public void doTag() throws IOException {
      JspWriter out = getJspContext().getOut();
      out.print("<div>");
      out.print("<ul>");

      if (currentPage == 1) {
          out.print("<li><a href=\"javascript:void(0);\" style=\"color: gray;\">上一页</a></li>");
      } else {
          out.print("<li><a href=\"?page=" + (currentPage - 1) + "\">上一页</a></li>");
      }

      for (int i = 1; i <= pageCount; i++) {
          if (currentPage == i) {
              out.print("<li><a href=\"javascript:void(0);\" style=\"color: red;\">" + i + "</a></li>");
          } else {
              out.print("<li><a href=\"?page=" + i + "\">" + i + "</a></li>");
          }
      }

      if (currentPage == pageCount) {
          out.print("<li><a href=\"javascript:void(0);\" style=\"color: gray;\">下一页</a></li>");
      } else {
          out.print("<li><a href=\"?page=" + (currentPage + 1) + "\">下一页</a></li>");
      }

      out.print("</ul>");
      out.print("</div>");
  }

}
```

自定义标签custom:page的代码实现在这里。

在标签中,我们获取到页面传来的pageSizepageCountcurrentPage,根据这些参数生成HTML分页控件,并将其打印在页面上。

  • 标签库描述文件

```xml


1.0
/taglib/page

  <tag>
      <name>page</name>
      <tag-class>com.demo.taglib.PageTag</tag-class>
      <body-content>empty</body-content>
      <attribute>
          <name>pageSize</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
          <name>pageCount</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
          <name>currentPage</name>
          <required>true</required>
          <rtexprvalue>true</rtexprvalue>
      </attribute>
  </tag>


```

这里是标签库描述文件,定义了自定义标签的名称,实现类和相关属性。我们通过JSP页面中声明的URI来引用标签库中的自定义标签。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:jsp分页显示完整实例 - Python技术站

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • JDBCTM 指南:入门3 – DriverManager

    下面是详细讲解“JDBCTM 指南:入门3 – DriverManager”的完整攻略。 JDBCTM 指南:入门3 – DriverManager 在本文中,我们将介绍JDBC中的DriverManager类,它是Java SQL API的一个基本组件,用于管理数据库驱动程序。 什么是 DriverManager DriverManager是Java提供的…

    Java 2023年6月16日
    00
  • Java中数组的常见操作合集

    Java中数组的常见操作合集 Java中数组是最常见、最基础的数据类型之一。本文将会介绍Java中数组的常见操作,包括数组的声明与初始化、数组的遍历、数组的求和等操作。 数组的声明与初始化 在Java中声明一个数组需要指定数组的类型和数组的长度。数组的类型可以是任何一个Java数据类型,如整型、浮点型、布尔型等。数组的长度必须是一个正整数。 下面是一个声明整…

    Java 2023年5月26日
    00
  • 详解Spring框架—IOC装配Bean

    来看看详解Spring框架—IOC装配Bean的完整攻略吧! 1. 什么是IOC IOC是Inversion Of Control的缩写,中文翻译为控制反转。简单来说,控制权不再由调用者来决定,而是由容器来决定。在Spring框架中,可以通过IOC实现Bean的装配。 2. Bean的定义 在Spring中,Bean即为Spring容器中管理的对象。Be…

    Java 2023年5月19日
    00
  • JAVA8 lambda表达式权威教程

    JAVA8 lambda表达式权威教程攻略 什么是lambda表达式 Lambda表达式是一种在JDK8中引入的函数式编程语法,用于简化代码中的匿名内部类的使用。它可以在不需要实现某个接口的情况下,直接创建出一个函数式接口的实例。 Lambda表达式的基本语法 (parameter) -> expression (parameter) -> { …

    Java 2023年5月26日
    00
  • java使用http实现文件下载学习示例

    Java使用HTTP实现文件下载学习示例 什么是HTTP? HTTP是一种应用层协议,用于在网络中传输超文本数据。HTTP是Web的基础,它使Web能够进行交互式连接。 Java如何使用HTTP实现文件下载? Java提供了多种方式可以使用HTTP进行文件下载,这里介绍两种常用的方式。 使用HttpURLConnection类 HttpURLConnecti…

    Java 2023年5月19日
    00
  • 10个经典的Java main方法面试题

    1.题目分析 这是一篇关于10个经典的Java main方法面试题的攻略,主要包括以下内容: Java main方法的特点; 10个常见的Java main方法面试题; 每道题目的详细分析和解答; 示例说明。 2.Java main方法的特点 Java main方法是一个程序的入口点,是程序运行的起点。它的定义格式如下: public static void…

    Java 2023年5月19日
    00
  • java连接SQL Server数据库的超详细教程

    Java连接SQL Server数据库的超详细教程 简介 本文主要介绍使用Java连接SQL Server数据库的方法和步骤。SQL Server是一种常见的关系型数据库,常用于企业级应用开发。Java作为一种流行的编程语言,也支持在程序中连接SQL Server数据库。在本文中,我们将使用Java的JDBC API连接SQL Server数据库,并进行简单…

    Java 2023年5月19日
    00
  • 用简单的代码来实现文件上传

    让我来详细讲解一下“用简单的代码来实现文件上传”的完整攻略。 什么是文件上传? 在网站开发中,文件上传就是指用户将本地的文件通过网站上传到服务器中。 实现文件上传的原理 实现文件上传,需要配合HTTP协议,主要分为以下几步: 用户通过网页上传文件,前端通过HTML5的FormData对象将文件数据以二进制流的形式传递到后端。 后端接收到上传的文件数据后,将文…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部