ZhihanXing 发表于 2024-3-25 20:17:32

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

我使用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>

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

ZhihanXing 发表于 2024-3-25 20:42:36

idea提示没有JSONObject这个类啊

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

ZhihanXing 发表于 2024-3-25 20:43:38

我不能将其存入会话域然后在jsp读取吗?

FishC 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 为什么我的java web分页功能无法实现?