java-SSH2实现数据库和界面的分页

yizhihongxing

下面是“java-SSH2实现数据库和界面的分页”的完整攻略:

准备工作

  1. 创建一个Web工程,并配置好SSH2框架。
  2. 在项目中引入MySQL的JDBC驱动包。
  3. 编写JSP页面,用于展示分页数据。

实现分页查询功能

第一步:编写DAO层代码

  1. DAO层是负责与数据库进行交互的层级,我们将在该层实现查询数据的功能。
  2. 在DAO层中,首先要编写一个查询总记录数的方法,用于确定分页的总页数。
  3. 其次,编写查询具体数据的方法,需要传入分页的起始位置和每页展示的记录数。
  4. 代码示例:
public interface UserDao {
    // 查询总记录数
    int getTotalCount();

    // 分页查询数据
    List<User> getUserList(int startIndex, int pageSize);
}

public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
    // 查询总记录数
    public int getTotalCount() {
        String hql = "select count(*) from User";
        Number count = (Number) getSession().createQuery(hql).uniqueResult();
        return count.intValue();
    }

    // 分页查询数据
    public List<User> getUserList(int startIndex, int pageSize) {
        String hql = "from User";
        Query query = getSession().createQuery(hql);
        query.setFirstResult(startIndex);
        query.setMaxResults(pageSize);
        return query.list();
    }
}

第二步:编写Service层代码

  1. Service层是负责业务逻辑的层级,我们将在该层调用DAO层的方法,并完成数据的分页处理。
  2. 首先,编写查询分页数据的方法,需要传入当前页数和每页展示的记录数,同时需要调用DAO层的获取总记录数和查询具体数据的方法,计算出分页的总页数,并将计算结果放入Pager对象中返回给Controller层。
  3. 代码示例:
public interface UserService {
    // 查询分页数据
    Pager<User> getUserPager(int currentPage, int pageSize);
}

public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {
    private UserDao userDao;

    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    // 查询分页数据
    public Pager<User> getUserPager(int currentPage, int pageSize) {
        //获取总条数
        int totalCount = userDao.getTotalCount();

        //计算总页数
        int totalPages = (totalCount + pageSize - 1) / pageSize;

        //计算分页起始位置
        int startIndex = (currentPage - 1) * pageSize;

        //调用DAO层查询分页数据
        List<User> userList = userDao.getUserList(startIndex, pageSize);

        //将查询结果封装到Pager对象中
        Pager<User> pager = new Pager<>();
        pager.setCurrentPage(currentPage);
        pager.setPageSize(pageSize);
        pager.setTotalRecord(totalCount);
        pager.setTotalPage(totalPages);
        pager.setList(userList);

        return pager;
    }
}

第三步:编写Controller层代码

  1. Controller层是负责与视图层进行交互的层级,我们将在该层调用Service层的方法,并将分页数据封装到ModelAndView对象中返回给JSP页面。
  2. 首先,编写展示分页数据的方法,在该方法中需要接收当前页数pageNum和每页展示的记录数pageSize的参数,并将其传入Service层中的查询分页数据的方法中,同时需要将查询结果封装到ModelAndView对象中并返回给JSP页面。
  3. 其次,在JSP页面中展示数据并添加分页展示的功能。
  4. 代码示例:
public class UserController {
    private UserService userService;

    public UserService getUserService() {
        return userService;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    //展示分页数据
    public ModelAndView showUserList(int pageNum, int pageSize) {
        Pager<User> pager = userService.getUserPager(pageNum, pageSize);
        ModelAndView mv = new ModelAndView("userList");
        mv.addObject("pager", pager);
        return mv;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <th>ID</th>
                <th>用户名</th>
                <th>密码</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${pager.list}" var="user">
                <tr>
                    <td>${user.id}</td>
                    <td>${user.username}</td>
                    <td>${user.password}</td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
    <c:if test="${pager.totalPage > 1}">
        <div>
            <c:if test="${pager.currentPage > 1}">
                <a href="?pageNum=${pager.currentPage - 1}&amp;pageSize=${pager.pageSize}">上一页</a>
            </c:if>
            <c:forEach var="i" begin="1" end="${pager.totalPage}">
                <c:choose>
                    <c:when test="${pager.currentPage == i}">
                        <span>${i}</span>
                    </c:when>
                    <c:otherwise>
                        <a href="?pageNum=${i}&amp;pageSize=${pager.pageSize}">${i}</a>
                    </c:otherwise>
                </c:choose>
            </c:forEach>
            <c:if test="${pager.currentPage < pager.totalPage}">
                <a href="?pageNum=${pager.currentPage + 1}&amp;pageSize=${pager.pageSize}">下一页</a>
            </c:if>
        </div>
    </c:if>
</body>
</html>

示例展示

这里给出两个示例:

示例一

假设我们需要展示第3页,每页展示10条数据,并且在DAO层中查询到的数据如下:

[
  {id: 1, username: "张三", password: "123456"},
  {id: 2, username: "李四", password: "123456"},
  {id: 3, username: "王五", password: "123456"},
  {id: 4, username: "赵六", password: "123456"},
  {id: 5, username: "钱七", password: "123456"},
  {id: 6, username: "孙八", password: "123456"},
  {id: 7, username: "周九", password: "123456"},
  {id: 8, username: "吴十", password: "123456"},
  {id: 9, username: "郑十一", password: "123456"},
  {id: 10, username: "马十二", password: "123456"},
  {id: 11, username: "陈十三", password: "123456"},
  {id: 12, username: "黄十四", password: "123456"},
  {id: 13, username: "林十五", password: "123456"}
]

则分页查询结果应为:

[
  {id: 21, username: "陈二十一", password: "123456"},
  {id: 22, username: "黄二十二", password: "123456"},
  {id: 23, username: "林二十三", password: "123456"},
  {id: 24, username: "张二十四", password: "123456"},
  {id: 25, username: "李二十五", password: "123456"},
  {id: 26, username: "王二十六", password: "123456"},
  {id: 27, username: "赵二十七", password: "123456"},
  {id: 28, username: "钱二十八", password: "123456"},
  {id: 29, username: "孙二十九", password: "123456"},
  {id: 30, username: "周三十", password: "123456"}
]

示例二

假设我们需要展示每页展示5条数据,而在DAO层中查询到的数据总共有15条,其中分别是1、2、3……15号数据。

则分页查询结果应为:

第1页,展示1、2、3、4、5号数据。

第2页,展示6、7、8、9、10号数据。

第3页,展示11、12、13、14、15号数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java-SSH2实现数据库和界面的分页 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java对象方法的调用执行过程详解

    下面是“Java对象方法的调用执行过程详解”的完整攻略: 1. 对象方法的定义 在 Java 中,我们可以通过在类中定义方法来实现对类的操作。方法是类中定义实现某种操作的代码块,它可以带有参数,也可以返回值。定义方法的语法如下: 修饰符 返回类型 方法名(参数列表) { // 方法体 } 修饰符可以是 public、private 或 protected 等…

    Java 2023年5月26日
    00
  • 深入了解Java语言中的并发性选项有何不同

    深入了解Java语言中的并发性选项有何不同 什么是Java并发性选项 Java作为一种面向对象、跨平台的编程语言,具有强大的并发性能,这意味着它可以同时处理多个线程。Java中的并发性选项是指Java提供的一套用来处理并发编程的API,包括线程、锁、线程池、信号量等工具。 Java并发性选项的不同之处 Java提供了多种并发性选项,它们各有特点,适用于不同的…

    Java 2023年5月26日
    00
  • java读取文件字符集示例方法

    针对“java读取文件字符集示例方法”的完整攻略,我将提供以下过程和两个示例: 一、文件字符集的概念和了解 在学习如何读取文件字符集之前,先了解以下文件字符集的概念。文件字符集可以理解为一个字符集编码方式,它规定了计算机语言在计算机内表示字符或者数字时所采用的编码方式。在不同的操作系统或者软件中,对于字符集的选择会不同。如果我们读取了一个文件,但是文件中的字…

    Java 2023年5月19日
    00
  • Java实现监听文件变化的三种方案详解

    Java实现监听文件变化的三种方案详解 在Java编程中,经常需要对文件进行监听,以便在文件发生更新时及时做出相应的处理。下面将介绍三种实现文件监听的方案,分别是Java 7的WatchService、commons-io库、以及第三方库jnotify。 1. Java 7的WatchService Java 7引入了WatchService API,它可以…

    Java 2023年5月20日
    00
  • Java8新特性之线程安全日期类

    Java8新特性之线程安全日期类 Java8中加入的线程安全日期类提供了一种替代旧的日期类的方式,同时线程安全和可读性提升了不少。 LocalDate LocalDate类表示一个不可变的日期对象。它使我们能够以一种简单而明确的方式操纵日期。例如,我们可以使用LocalDate.now()获取当前日期,或者使用LocalDate.of()创建特定的日期。这些…

    Java 2023年5月20日
    00
  • java实现登录之后抓取数据

    下面是Java实现登录之后抓取数据的完整攻略: 一、概述 当我们需要抓取某个网站上的数据时,通常需要先登录该网站,这样才能访问该网站的受保护资源。本篇攻略将会讲解如何使用Java实现模拟登录,并抓取登录后的页面数据。 二、准备 为了实现模拟登录,我们需要用到Java的HttpClient和Jsoup库。HttpClient用于发送HTTP请求,而Jsoup用…

    Java 2023年5月19日
    00
  • Java实现验证码具体代码

    Java实现验证码需要以下步骤: 1. 生成随机字符串 我们可以使用Java的Random类来生成随机数,并将随机数转换为字符串。以下是示例代码: Random random = new Random(); StringBuffer codeBuffer = new StringBuffer(); for (int i = 0; i < 4; i++)…

    Java 2023年5月20日
    00
  • java之使用stream对日期排序方式

    下面是对Java中使用Stream对日期排序的攻略。 1. 准备数据 在讲解如何使用Stream对日期排序之前,我们需要准备一些数据。假设我们有一个List集合,其中包含多个日期对象。如下所示: List<LocalDate> dates = Arrays.asList( LocalDate.of(2021, 8, 1), LocalDate.o…

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