鱼C论坛

 找回密码
 立即注册
查看: 285|回复: 5

为什么我的java web分页功能无法实现?

[复制链接]
发表于 2024-3-25 20:17:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我使用Servlet、Mybatis和JSP搭建了一个web项目,已经完成了查询功能的开发。现在想写一个分页查询功能,使用SQL的limite语句分页查询,初始化只查询前两个,之后通过点击前端的按钮来切换每页展示的信息。已知分页的selectByPage可以正常运行,但是点击了前端的按钮无法实现预期的分页功能。
package edu.zjku.controller;

import edu.zjku.bean.Blog;
import edu.zjku.service.BlogService;
import edu.zjku.service.BlogServiceImpl;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;

//这是查询所有博客的Servlet
@WebServlet("/selectServlet")
public class SelectServlet extends HttpServlet {
    private BlogService service = new BlogServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取分页信息
        String param = req.getParameter("pageNumber");
        String param2 = req.getParameter("linesPerPage");
        int pageNumber;
        int linesPerPage;
        try {
            pageNumber = Integer.parseInt(param);
            linesPerPage = Integer.parseInt(param2);
        } catch (NumberFormatException e) {
            pageNumber = 1;
            linesPerPage = 2;
        }
        //读取数据并封装
        List<Blog> blogs = null;
        blogs = service.selectByPage(pageNumber, linesPerPage);
        //存入会话域给看博客页面使用
        HttpSession session = req.getSession();
        session.setAttribute("blogs", blogs);
        //跳转到看博客页面
        resp.sendRedirect("/theBlog/read.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<%@ page import="java.util.List" %>
<%@ page import="edu.zjku.bean.Blog" %><%--
  Created by IntelliJ IDEA.
  User: xing
  Date: 2024/3/20
  Time: 20:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>看博客</title>
    <link rel="stylesheet" href="style/public.css">
    <style>
        .box p:nth-of-type(1) {
            text-align: center;
        }

        .box p:nth-of-type(2) {
            white-space: pre-wrap;
        }

        .box p:nth-of-type(3),
        .box p:nth-of-type(4) {
            text-align: right;
        }
    </style>
</head>
<body>
<jsp:include page="header.jsp"/>
<main>
    <%
        //从会话域获取所有博客
        List<Blog> blogs = (List<Blog>) session.getAttribute("blogs");
        //循环显示所有博客
        for (Blog blog : blogs) {%>
    <div class="box">
        <p><%=blog.getTitle()%>
        </p>
        <p><%=blog.getText()%>
        </p>
        <p><%=blog.getUser()%>
        </p>
        <p><%=blog.getTime()%>
        </p>
    </div>
    <%}%>
    <%--        这是控制分页的控件--%>
    <div class="page">
        <button class="prev">上一页</button>
        <button class="next">下一页</button>
    </div>
</main>
<jsp:include page="footer.jsp"/>
<script>
    //这是控制分页的JS
    //获取分页控件
    let prev = document.querySelector(".page .prev");
    let next = document.querySelector(".page .next");

    //传递分页信息
    let pageNumber = 1;
    let linesPerPage = 2;

    function prevPage() {
        pageNumber -= 1;
        let url = `/theBlog/selectServlet?pageNumber=${pageNumber}linesPerPage=${linesPerPage}`;
        axios.get(url)
            .then(function (response) {
                console.log(response);
            })
            .catch(function (error) {
                console.log(error);
            })
            .finally(function () {
                console.log("运行结束!");
            })
    }

    function nextPage() {
        pageNumber += 1;
        let url = `/theBlog/selectServlet?pageNumber=${pageNumber}linesPerPage=${linesPerPage}`;
        axios.get(url)
            .then(function (response) {
                console.log(response);
            })
            .catch(function (error) {
                console.log(error);
            })
            .finally(function () {
                console.log("运行结束!");
            })
    }

    //添加响应事件
    prev.addEventListener("click", prevPage);
    next.addEventListener("click", nextPage);
</script>
</body>
</html>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-3-25 20:17:48 | 显示全部楼层
在你提供的代码中,我注意到了一些问题。首先,你的分页链接缺少了一个“&”符号,导致无法正确传递两个参数(pageNumber和linesPerPage)。其次,你的Servlet只是重定向到了一个JSP页面,但是并没有将查询结果传递给JSP页面进行展示。因此,在点击前端按钮后,你并没有看到分页的效果。

为了解决这个问题,你可以按照以下步骤进行操作:

1. 修改分页链接:
在你的JS文件中,将分页链接的url修改为:
`let url = `/theBlog/selectServlet?pageNumber=${pageNumber}&linesPerPage=${linesPerPage}`;`

2. 修改Servlet:
在Servlet的doGet方法中,将查询结果封装成一个JSON对象,并传递给JSP页面。修改的代码如下:
//读取数据并封装
List<Blog> blogs = service.selectByPage(pageNumber, linesPerPage);
//将查询结果封装成JSON对象
JSONObject json = new JSONObject();
json.put("blogs", blogs);
json.put("pageNumber", pageNumber);
json.put("linesPerPage", linesPerPage);
//将JSON对象存入请求域中
req.setAttribute("result", json);
//跳转到看博客页面
req.getRequestDispatcher("/theBlog/read.jsp").forward(req, resp);

3. 修改JSP页面:
在read.jsp页面中,使用EL表达式获取请求域中的JSON对象,并根据需要展示分页的内容。修改的代码如下:
<%
    JSONObject result = (JSONObject) request.getAttribute("result");
    List<Blog> blogs = (List<Blog>) result.get("blogs");
    int pageNumber = (int) result.get("pageNumber");
    int linesPerPage = (int) result.get("linesPerPage");
%>
<!-- 在这里根据自己的需求展示分页内容,可以使用JSTL标签库进行循环遍历 -->

通过以上修改,你应该可以实现分页功能了。希望对你有所帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-25 20:42:36 | 显示全部楼层
idea提示没有JSONObject这个类啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-25 20:42:48 | 显示全部楼层
ZhihanXing 发表于 2024-03-25 20:42
idea提示没有JSONObject这个类啊


抱歉,对不起给你带来困扰。在Java中,使用JSON对象需要引入相应的库。您可以使用第三方库,比如JSON.jar或者Gson等。下面是使用Gson库来完成JSON对象封装的代码示例:
import com.google.gson.Gson;

// 读取数据并封装
List<Blog> blogs = service.selectByPage(pageNumber, linesPerPage);

// 将查询结果封装成JSON对象
Gson gson = new Gson();
String jsonResult = gson.toJson(blogs);

// 将JSON对象存入请求域中
req.setAttribute("result", jsonResult);

// 跳转到看博客页面
req.getRequestDispatcher("/theBlog/read.jsp").forward(req, resp);

然后,在JSP页面中通过EL表达式获取请求域中的JSON字符串,并将其转换为实际的对象:
<%
    String jsonResult = (String) request.getAttribute("result");
    Gson gson = new Gson();
    List<Blog> blogs = gson.fromJson(jsonResult, new TypeToken<List<Blog>>(){}.getType());
%>

<!-- 使用blogs进行展示 -->

请确保已经正确导入Gson库,你可以在Maven项目中在pom.xml文件中添加以下依赖:
<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.6</version>
</dependency>

希望这次能解决您的问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-25 20:43:38 | 显示全部楼层
我不能将其存入会话域然后在jsp读取吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-25 20:43:55 | 显示全部楼层
ZhihanXing 发表于 2024-03-25 20:43
我不能将其存入会话域然后在jsp读取吗?


当然可以将查询结果存入会话域中,然后在JSP页面中读取会话域的数据。以下是修改后的代码示例:在Servlet的doGet方法中,将查询结果存入会话域中://读取数据并封装List blogs = service.selectByPage(pageNumber, linesPerPage);//存入会话域给看博客页面使用HttpSession session = req.getSession();session.setAttribute("blogs", blogs);session.setAttribute("pageNumber", pageNumber);session.setAttribute("linesPerPage", linesPerPage);//跳转到看博客页面resp.sendRedirect("/theBlog/read.jsp");在JSP页面中,通过EL表达式读取会话域中的数据并进行展示: <%@ page language="java" contentType="text/html; charset=UTF-8"%><!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>博客列表</title> </head> <body> <h1>博客列表</h1> <table> <thead> <tr> <th>ID</th> <th>标题</th> <th>内容</th> </tr> </thead> <tbody> <c:forEach var="blog" items="${sessionScope.blogs}"> <tr> <td>${blog.id}</td> <td>${blog.title}</td> <td>${blog.content}</td> </tr> </c:forEach> </tbody> </table> <div class="page"> <button class="prev" onclick="prevPage()">上一页</button> <button class="next" onclick="nextPage()">下一页</button> </div> <script src="your_script.js"></script> </body> </html>通过以上修改,您应该可以在JSP页面中展示分页查询的结果了。希望对您有所帮助!如有任何疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 00:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表