JSP&Servlet(10)——使用Servlet实现分页功能

效果展示

项目结构

代码

java

User.java

用户的实体类,一些实体对象的属性和set、get方法。

package bean;

import java.io.Serializable;

public class User implements Serializable {
    private int id;
    private String username;
    private String password;

    public User() {
    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User(int id, String username, String password) {
        this.id = id;
        this.username = username;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

UserDao.java

操作数据的接口

package dao;

import bean.User;

import java.util.List;

/**
 * 数据访问对象(DAO)接口
 * @author lck100
 */
public interface UserDao {

    /**
     * 根据页码和该页显示记录条数获取该页的所有记录
     *
     * @param pageIndex 页码
     * @param pageSize  记录条数
     * @return 返回查询到的结果集
     */
    List<User> selectByPage(int pageIndex, int pageSize);

    /**
     * 获取记录的总条数
     *
     * @return 返回记录的总条数
     */
    int getTotalRecords();

}

UserDaoImpl.java

接口的具体实现

package dao.impl;

import bean.User;
import dao.UserDao;
import utils.DBUtils;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * UserDao接口实现类
 *
 * @author lck100
 */
public class UserDaoImpl implements Serializable, UserDao {

    @Override
    public List<User> selectByPage(int pageIndex, int pageSize) {
        // 实例化List集合
        List<User> userList = new ArrayList<>();
        // 定义
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接
            conn = DBUtils.getConnection();
            // 获取分页开始的索引
            int startIndex = (pageIndex - 1) * pageSize;
            // SQL语句
            String sql = "select * from users limit ?,?";
            // 获取Statement对象
            ps = conn.prepareStatement(sql);
            // 对参数进行赋值
            ps.setInt(1, startIndex);
            ps.setInt(2, pageSize);
            // 获取结果集
            rs = ps.executeQuery();
            // 遍历结果集
            while (rs.next()) {
                User user = new User();
                user.setId(rs.getInt(1));
                user.setUsername(rs.getString(2));
                user.setPassword(rs.getString(3));
                userList.add(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.release(conn, ps, rs);
        }
        return userList;
    }

    @Override
    public int getTotalRecords() {
        // 定义总条数变量,初始值为0
        int count = 0;
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            // 获取数据库连接对象
            conn = DBUtils.getConnection();
            // SQL语句
            String sql = "select count(*) as total from users";
            // 得到Statement对象
            ps = conn.prepareStatement(sql);
            // 获取结果集对象
            rs = ps.executeQuery();
            // 得到记录总条数
            if (rs.next()) {
                count = rs.getInt(1);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            DBUtils.release(conn, ps, rs);
        }
        return count;
    }
}

UserService.java

服务接口,获取分页相关数据。

package service;

import utils.PageUtils;

/**
 * 服务层接口
 * @author lck100
 */
public interface UserService {
    /**
     * 获取分页的数据
     * @param pageIndex 页码
     * @param pageSize 每页显示记录条数
     * @return 返回PageUtils对象
     */
    PageUtils selectByPage(int pageIndex, int pageSize);
}

UserServiceImpl.java

服务接口的具体实现。

package service.impl;

import bean.User;
import dao.UserDao;
import dao.impl.UserDaoImpl;
import service.UserService;
import utils.PageUtils;

import java.util.List;

/**
 * 实现UserService接口
 *
 * @author lck100
 */
public class UserServiceImpl implements UserService {
    private UserDao userDao = new UserDaoImpl();

    @Override
    public PageUtils selectByPage(int pageIndex, int pageSize) {
        // 实例化PageUtils对象
        PageUtils pu = new PageUtils();
        // 获取查询结果集
        List<User> userList = userDao.selectByPage(pageIndex, pageSize);
        // 对PageUtils对象进行赋值
        pu.setList(userList);
        pu.setPageIndex(pageIndex);
        pu.setPageSize(pageSize);
        pu.setTotalRecords(userDao.getTotalRecords());
        // 返回PageUtils对象
        return pu;
    }
}

UserServlet.java

处理分页逻辑。

package servlet;

import service.UserService;
import service.impl.UserServiceImpl;
import utils.PageUtils;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class UserServlet extends HttpServlet {
    private int pageNo;
    private UserService userService = null;

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置请求的编码
        request.setCharacterEncoding("UTF-8");
        // 设置响应的编码
        response.setContentType("text/html;charset=UTF-8");
        // 获取action
        String action = request.getParameter("action");
        // 对action进行判断
        if (action.equals("pager")) {// 如果参数是pager则进行分页
            // 获取页码
            String pageIndex = request.getParameter("pageIndex");
            // 对页码进行非空判断
            if (pageIndex == null) {
                pageNo = 1;
            } else {
                pageNo = Integer.parseInt(pageIndex);
            }
            // 实例化服务对象
            userService = new UserServiceImpl();
            // 获取分页数据,设置页码和每页显示记录数为5条
            PageUtils pu = userService.selectByPage(pageNo, 5);
            // 将数据保存到session中
            request.getSession().setAttribute("pu", pu);
            // 跳转到user_list.jsp页面并将数据一并传送过去
            request.getRequestDispatcher("user_list.jsp").forward(request, response);
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
}

DBUtils.java

获取数据库连接及释放数据库资源。

package utils;

import java.sql.*;

public class DBUtils {
    /**
     * 获取数据库连接对象
     * @return 返回数据库连接对象
     */
    public static Connection getConnection(){
        Connection connection=null;
        try {
            // 加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            // 获取连接对象
            connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/servletdemo","root","admin");
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    /**
     * 释放数据库连接资源
     * @param connection 数据库连接对象
     * @param statement 数据库执行对象
     * @param resultSet 数据库结果集对象
     */
    public static void release(Connection connection, Statement statement, ResultSet resultSet){
        // 关闭resultSet
        if(resultSet!=null){
            try {
                resultSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 关闭statement
        if(statement!=null){
            try {
                statement.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        // 关闭connection
        if(connection!=null){
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

PageUtils.java

分页相关属性和方法。

package utils;

import java.util.List;

/**
 * 分页的相关属性和方法
 *
 * @author lck100
 */
public class PageUtils {
    // 所有数据结果集
    private List list;
    // 每页显示多少条数据
    private int pageSize;
    // 页码(第几页)
    private int pageIndex;
    // 记录总条数
    private int totalRecords;

    /**
     * 计算总的页面数
     *
     * @return 返回一共有多少页
     */
    public int getTotalPages() {
        if (totalRecords % pageSize == 0) {// 如果记录总条数对每页显示记录数取整等于0,则表示页面数刚好分完。
            return totalRecords / pageSize;
        } else {// 如果取不尽,那么就添加一页来放剩余的记录
            return totalRecords / pageSize + 1;
        }
    }

    /**
     * 获取首页的页码
     *
     * @return 返回首页的页码,即为1
     */
    public int getFirstPageIndex() {
        return 1;
    }

    /**
     * 获取上一页的页码
     *
     * @return 返回上一页的页码,即当前页码减去1
     */
    public int getPreviousPageIndex() {
        if (pageIndex <= 1) {
            return 1;
        }
        return pageIndex - 1;
    }

    /**
     * 获取下一页的页码
     *
     * @return 返回下一页的页码,即当前页码加上1
     */
    public int getNextPageIndex() {
        if (pageIndex >= getLastPageIndex()) {
            return getLastPageIndex();
        }
        return pageIndex + 1;
    }

    /**
     * 获取最后一页的页码
     *
     * @return 返回最后一页的页码,即总页数
     */
    public int getLastPageIndex() {
        return getTotalPages();
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }

    public int getPageSize() {
        return pageSize;
    }

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

    public int getPageIndex() {
        return pageIndex;
    }

    public void setPageIndex(int pageIndex) {
        this.pageIndex = pageIndex;
    }

    public int getTotalRecords() {
        return totalRecords;
    }

    public void setTotalRecords(int totalRecords) {
        this.totalRecords = totalRecords;
    }
}

web

web.xml

servlet注册。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--用户Servlet-->
    <servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>servlet.UserServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>
    <!--欢迎页面-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

index.jsp

主页面,通过链接进入分页界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
<a href="userServlet?action=pager">分页显示</a>
</body>
</html>

user_list.jsp

显示分页数据。

<%@ page import="bean.User" %>
<%@ page import="utils.PageUtils" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8"/>
    <!-- 新 Bootstrap 核心 CSS 文件 -->
    <link href="css/bootstrap.min.css" rel="stylesheet">

    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <script src="js/jquery.min.js"></script>

    <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
    <script src="js/bootstrap.min.js"></script>
    <title>显示所有用户</title>
</head>
<body>
<%
    PageUtils pu = (PageUtils) session.getAttribute("pu");
    List<User> userList = pu.getList();
%>
<table class="table table-hover table-bordered">
    <tr>
        <td>序号</td>
        <td>用户名</td>
        <td>密码</td>
        <td>操作</td>
    </tr>
    <%
        for (User user : userList) {
    %>
    <tr>
        <td>
            <%=user.getId()%>
        </td>
        <td>
            <%=user.getUsername()%>
        </td>
        <td>
            <%=user.getPassword()%>
        </td>
        <td>
            <a class="btn btn-info" href="userServlet?action=del&id=<%=user.getId()%>">删除</a>
            &nbsp;&nbsp;
            <a class="btn btn-danger" href="userServlet?action=edit&id=<%=user.getId()%>">编辑</a>
        </td>
    </tr>
    <%
        }
    %>
    <tr>
        <td colspan="4">
            共&nbsp;<%=pu.getTotalPages()%>&nbsp;页&nbsp;&nbsp;&nbsp;&nbsp;
            当前第&nbsp;<%=pu.getPageIndex()%>页&nbsp;&nbsp;&nbsp;&nbsp;
            <p class="pagination">
                <a href="userServlet?action=pager&pageIndex=<%=pu.getFirstPageIndex()%>">首页</a>
                <a href="userServlet?action=pager&pageIndex=<%=pu.getPreviousPageIndex()%>">上一页</a>
                <a href="userServlet?action=pager&pageIndex=<%=pu.getNextPageIndex()%>">下一页</a>
                <a href="userServlet?action=pager&pageIndex=<%=pu.getLastPageIndex()%>">尾页</a>
            </p>
        </td>
    </tr>
</table>
</body>
</html>

 

如果对完整源码感兴趣。

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【CSDN201910071035】可获取本节源码。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值