JSP分页显示功能实现方案及代码示例

ChatGPT4o 使用 ChatGPT 4o 回答

问题:

使用JSP组件进行编程,实现分页显示功能,要求提供每页显示的记录数量设置功能。 数据是第一次作业的数据文件,也可以自行使用数据库技术。

页面导航功能自行设计,可以直接显示页码的形式实现导航,例如显示从第一页到最后一页的页号显示。 也可以设计四个超链接,显示首页,上一页,下一页,尾页的形式。注意,如果已经在首页,那么首页的超链接不应该出现。 如果已经在尾页,不应该显示尾页的超链接,同样的要求,上一页,下一页也需要显示控制。 或者自行设计其他分页导航功能。

本次作业不需要提供查询条件的设置,进入到这个JSP页面,使用查询字符串(QueryString)的形式进入到某个页面。 在这个页面中除了显示的当前页的联系人表格,页面导航,还应该有输入域,设置页面显示的记录数。

分页功能的实现,建议单独做成Java类,类名为PageBean.java,该类封装了待分页的数据(List<Map<String,Object>> all), 当前页(int currentPage), 页面大小(int pageSize),获取当前页数据(List<Map<String,Object>> getCurrentPage())等等。 这个类可以自行设计,这里仅仅是建议。

页码的输入参数请使用超链接的形式,使用查询字符串的方式提交页码,例如: http://localhost:8080/page/s.jsp?pageid=2 使用pageid这个参数来决定显示第几页,例如pageid=2,显示第2页,页码从1开始计数。

默认每页显示3条记录,随后,可以通过s.jsp?pageid=2&pagesize=4,来进行修改。

测试数据请多准备一些。

本次的分页导航实现,前端技术使用<a>超链接形式,不允许使用按钮(<button>) 可以使用多个jsp,jsp组件之间转发,可以使用<jsp:forward page="a.jsp" />的形式。自己进行程序设计。 将JSP页面中的分页功能封装到自定义标记中,数据由Dataloader.java从students.csv中获取

回答:

为了实现您所描述的分页显示功能,我们将创建一个简单的JSP应用程序。这个应用程序将包括以下几个部分:

  1. 数据加载类 (Dataloader.java):从CSV文件中读取数据。
  2. 分页类 (PageBean.java):处理分页逻辑。
  3. JSP页面 (s.jsp):显示数据和分页导航。
  4. CSV文件:用于存储测试数据。

1. Dataloader.java

这个类将从students.csv文件中读取数据并返回一个列表。

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Dataloader {
    public List<Map<String, Object>> loadData(String filePath) {
        List<Map<String, Object>> dataList = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(",");
                Map<String, Object> dataMap = new HashMap<>();
                dataMap.put("id", values[0]);
                dataMap.put("name", values[1]);
                dataMap.put("age", values[2]);
                dataList.add(dataMap);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return dataList;
    }
}

2. PageBean.java

这个类将处理分页逻辑。

import java.util.List;
import java.util.Map;

public class PageBean {
    private List<Map<String, Object>> allData;
    private int currentPage;
    private int pageSize;

    public PageBean(List<Map<String, Object>> allData, int currentPage, int pageSize) {
        this.allData = allData;
        this.currentPage = currentPage;
        this.pageSize = pageSize;
    }

    public List<Map<String, Object>> getCurrentPage() {
        int start = (currentPage - 1) * pageSize;
        int end = Math.min(start + pageSize, allData.size());
        return allData.subList(start, end);
    }

    public int getTotalPages() {
        return (int) Math.ceil((double) allData.size() / pageSize);
    }

    public int getCurrentPage() {
        return currentPage;
    }

    public int getPageSize() {
        return pageSize;
    }
}

3. s.jsp

这个JSP页面将显示数据和分页导航。

<%@ page import="java.util.*, Dataloader, PageBean" %>
<%
    String filePath = application.getRealPath("/WEB-INF/students.csv");
    Dataloader dataLoader = new Dataloader();
    List<Map<String, Object>> allData = dataLoader.loadData(filePath);

    int currentPage = 1;
    int pageSize = 3;

    String pageidParam = request.getParameter("pageid");
    String pagesizeParam = request.getParameter("pagesize");

    if (pageidParam != null) {
        currentPage = Integer.parseInt(pageidParam);
    }
    if (pagesizeParam != null) {
        pageSize = Integer.parseInt(pagesizeParam);
    }

    PageBean pageBean = new PageBean(allData, currentPage, pageSize);
    List<Map<String, Object>> currentPageData = pageBean.getCurrentPage();
%>

<!DOCTYPE html>
<html>
<head>
    <title>分页显示</title>
</head>
<body>
    <h1>联系人列表</h1>
    <table border="1">
        <tr>
            <th>ID</th>
            <th>姓名</th>
            <th>年龄</th>
        </tr>
        <%
            for (Map<String, Object> data : currentPageData) {
        %>
        <tr>
            <td><%= data.get("id") %></td>
            <td><%= data.get("name") %></td>
            <td><%= data.get("age") %></td>
        </tr>
        <%
            }
        %>
    </table>

    <div>
        <h3>设置每页显示记录数:</h3>
        <form action="s.jsp" method="get">
            <input type="number" name="pagesize" value="<%= pageSize %>" min="1" />
            <input type="hidden" name="pageid" value="<%= currentPage %>" />
            <input type="submit" value="设置" />
        </form>
    </div>

    <div>
        <%
            int totalPages = pageBean.getTotalPages();
            if (currentPage > 1) {
        %>
        <a href="s.jsp?pageid=1&pagesize=<%= pageSize %>">首页</a>
        <a href="s.jsp?pageid=<%= currentPage - 1 %>&pagesize=<%= pageSize %>">上一页</a>
        <%
            }
            for (int i = 1; i <= totalPages; i++) {
        %>
        <a href="s.jsp?pageid=<%= i %>&pagesize=<%= pageSize %>"><%= i %></a>
        <%
            }
            if (currentPage < totalPages) {
        %>
        <a href="s.jsp?pageid=<%= currentPage + 1 %>&pagesize=<%= pageSize %>">下一页</a>
        <a href="s.jsp?pageid=<%= totalPages %>&pagesize=<%= pageSize %>">尾页</a>
        <%
            }
        %>
    </div>
</body>
</html>

4. students.csv

您需要创建一个名为students.csv的文件,放在WEB-INF目录下,内容可以是:

1,张三,20
2,李四,22
3,王五,21
4,赵六,23
5,钱七,24
6,孙八,25
7,周九,26
8,吴十,27

总结

以上代码实现了一个简单的分页功能,用户可以通过URL参数设置当前页和每页显示的记录数。您可以根据需要扩展和修改这些代码。确保在您的Web应用程序中正确配置JSP和Java类的路径。