JavaWeb实现简单的分页功能


参考博文👀:一个基础的SpringBoot项目该包含哪些

一、创建分页对象

1.1 PageDTO

public class PageDTO<T extends PageDTO<?>> {

    /**
     * 当前页码
     */
    private Integer currPage;
    /**
     * 每页显示数据的数量
     */
    private Integer pageSize;
    /**
     * 查询分页数据的关键词
     */
    private String pageDataKey;

    public PageDTO() {
    }

    public PageDTO(Integer currPage, Integer pageSize, String pageDataKey) {
        this.currPage = currPage;
        this.pageSize = pageSize;
        this.pageDataKey = pageDataKey;
    }

    public PageDTO(Integer currPage, Integer pageSize) {
        this.currPage = currPage;
        this.pageSize = pageSize;
    }

    /**
     * 修改当前页码为当前页的起始页码,方便数据库查询
     *  - 将this强转成泛型T会产生警告,添加@SuppressWarning注解可以抑制编译器产生警告
     */
    @SuppressWarnings("unchecked")
    public T calcCurrPage() {
        // 起始页码 = (当前页码 - 1) * 每页数据数量
        currPage = (currPage - 1) * pageSize;
        // 直接返回泛型对应的对象
        return (T) this;
    }

    public Integer getCurrPage() {
        return currPage;
    }

    public void setCurrPage(Integer currPage) {
        this.currPage = currPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

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

    public String getPageDataKey() {
        return pageDataKey;
    }

    public void setPageDataKey(String pageDataKey) {
        this.pageDataKey = pageDataKey;
    }

    @Override
    public String toString() {
        return "PageDTO{" +
                "currPage=" + currPage +
                ", pageSize=" + pageSize +
                ", pageDataKey='" + pageDataKey + '\'' +
                '}';
    }
}

1.2 PageVO

@JsonInclude(JsonInclude.Include.NON_NULL)
public class PageVO<T> {

    /**
     * 当前页码
     */
    private Integer currPage;

    /**
     * 每页显示数量
     */
    private Integer pageSize;

    /**
     * 总页码
     */
    private Integer totalPage;

    /**
     * 总记录数
     */
    private Integer totalCount;

    /**
     * 每页显示的数据
     */
    private List<T> pageDataList;

    public PageVO() {
    }

    /**
     * 通过分页dto设置vo的当前页码和每页数量
     */
    public PageVO<T> setCurrAndSize(PageDTO<?> pageDTO) {

        // 将dto中当前页码和每页数量设置为vo对对应成员变量,也可以使用BeanUtils实现
        this.setCurrPage(pageDTO.getCurrPage());
        this.setPageSize(pageDTO.getPageSize());
        return this;
    }

    /**
     * 根据总记录数设置总记录数,同时计算出总页码并设置
     */
    public void setTotalPageAndCount(Integer totalCount) {
        // 计算总页码
        int totalPage = totalCount / pageSize + (totalCount % pageSize == 0 ? 0 : 1);

        // 设置总页码和总记录数
        this.setTotalCount(totalCount);
        this.setTotalPage(totalPage);
    }

    public Integer getCurPage() {
        return currPage;
    }

    public void setCurrPage(Integer currPage) {
        this.currPage = currPage;
    }

    public Integer getPageSize() {
        return pageSize;
    }

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

    public Integer getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }

    public Integer getTotalCount() {
        return totalCount;
    }

    public void setTotalCount(Integer totalCount) {
        this.totalCount = totalCount;
    }

    public List<T> getPageDataList() {
        return pageDataList;
    }

    public void setPageDataList(List<T> pageDataList) {
        this.pageDataList = pageDataList;
    }

    @Override
    public String toString() {
        return "PageVO{" +
                "curPage=" + currPage +
                ", pageSize=" + pageSize +
                ", totalPage=" + totalPage +
                ", totalCount=" + totalCount +
                ", pageDataList=" + pageDataList +
                '}';
    }
}

二、创建测试对象

2.1 user表

/* 建表 */
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
	`user_id` INT UNSIGNED NOT NULL UNIQUE AUTO_INCREMENT COMMENT '用户编号-主键',
	`user_name` VARCHAR(20) NOT NULL COMMENT '用户名',
	`gender` TINYINT UNSIGNED DEFAULT 1 COMMENT '性别,1-男;0-女',
	`phone` VARCHAR(12) NOT NULL UNIQUE COMMENT '手机号',
	PRIMARY KEY(`user_id`)
)ENGINE = INNODB DEFAULT CHARSET = utf8 AUTO_INCREMENT = 101 COMMENT '用户表';

/* 插入数据 */
INSERT INTO `user`(`user_name`, `gender`, `phone`)
VALUES('张三', 1, '12345678901'),
	('李四', 0, '14345678901'),
	('王五', 1, '15345678901'),
	('赵六', 0, '17345678901');

2.2 User实体类

public class User {

    private Integer userId;
    private String userName;
    private Integer gender;
    private String phone;

    public User() {
    }

    public User(Integer userId, String userName, Integer gender, String phone) {
        this.userId = userId;
        this.userName = userName;
        this.gender = gender;
        this.phone = phone;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getGender() {
        return gender;
    }

    public void setGender(Integer gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", gender=" + gender +
                ", phone='" + phone + '\'' +
                '}';
    }
}

2.3 UserDTO

public class UserDTO extends PageDTO<UserDTO> {

    private Integer userId;
    private String phone;

    public UserDTO() {
    }

    public UserDTO(Integer userId, String phone) {
        this.userId = userId;
        this.phone = phone;
    }

    public UserDTO(Integer currPage, Integer pageSize, String pageDataKey, Integer userId, String phone) {
        super(currPage, pageSize, pageDataKey);
        this.userId = userId;
        this.phone = phone;
    }

    public UserDTO(Integer currPage, Integer pageSize, Integer userId, String phone) {
        super(currPage, pageSize);
        this.userId = userId;
        this.phone = phone;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "UserDTO{" +
                "userId=" + userId +
                ", phone='" + phone + '\'' +
                '}';
    }
}

2.4 UserVO

public class UserVO {

    private Integer userId;
    private String userName;
    private String gender;
    private String phone;

    public UserVO() {
    }

    public UserVO(Integer userId, String userName, String gender, String phone) {
        this.userId = userId;
        this.userName = userName;
        this.gender = gender;
        this.phone = phone;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "UserVO{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", gender='" + gender + '\'' +
                ", phone='" + phone + '\'' +
                '}';
    }
}

三、测试

PS:持久层略

3.1 业务层

public class UserServiceImpl implements UserService {

    private final UserDao userDao = new UserDaoImpl();

    /**
     * 分页查询用户信息
     */
    @Override
    public PageVO<UserVO> listPageUsersInfo(UserDTO userDTO) {
        // 创建一个分页VO,同时设置当前页码和每页数量
        PageVO<UserVO> pageVO = new PageVO<UserVO>().setCurrAndSize(userDTO);

        // 更新当前页码,方便数据库查询
        userDTO = userDTO.calcCurrPage();

        // 查询分页数据
        List<User> users = userDao.listPageUsers(userDTO.getCurrPage(), userDTO.getPageSize());

        // 判断是否获取成功
        if (null == users) {
            return null;
        }

        // 存储vo集合
        List<UserVO> userVOList = new ArrayList<>();

        // 将实体集合转成VO集合
        for (User u : users) {
            UserVO userVO = new UserVO();

            // 也可以使用BeanUtils工具类
            userVO.setUserId(u.getUserId());
            userVO.setUserName(u.getUserName());
            userVO.setGender(u.getGender() == 1 ? "男" : "女");
            userVO.setPhone(u.getPhone());

            // 存入集合
            userVOList.add(userVO);
        }

        // 设置分页数据
        pageVO.setPageDataList(userVOList);

        // 查询总记录数
        int totalCount = userDao.countAll();
        // 设置总记录数和总页码
        pageVO.setTotalPageAndCount(totalCount);

        return pageVO;
    }
}

3.2 控制器(Servlet)

@WebServlet("/user/pageUsers")
public class UserServlet extends HttpServlet {

    private final UserService userService = new UserServiceImpl();

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

        // 设置请求编码方式
        req.setCharacterEncoding("utf-8");
        // 设置响应数据格式和编码方式
        resp.setContentType("application/json;charset=utf-8");

        // 根据请求对象request中请求体转成对象
        UserDTO userDTO = JsonUtils.getObjectFromReqBody(req, UserDTO.class);

        // 调用service方法,获取分页对象
        PageVO<UserVO> pageVO = userService.listPageUsersInfo(userDTO);

        // 创建响应对象
        ResultInfo<PageVO<UserVO>> resultInfo =
                new ResultInfo<>(200, "请求成功", pageVO);

        // 将对象转成json字符串
        String resJson = JsonUtils.getJsonFromObject(resultInfo);

        // 判断是否转化成功
        if (null != resJson) {
            // 响应数据
            resp.getWriter().write(resJson);
        }
    }

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

3.3 测试数据和结果

  • 测试数据
    在这里插入图片描述

    PS: 这里的用户id和手机号没用到,就随便写了

  • 测试结果/响应结果
    在这里插入图片描述

测试源码地址

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb实现分页功能通常需要以下步骤: 1. 在页面中添加分页控件,例如页码导航条或下拉列表等。 2. 在后台代码中获取分页相关的参数,包括当前页码、每页显示的记录数等。 3. 根据获取的参数,查询数据库获取当前页需要显示的数据,并计算出总记录数和总页数。 4. 将查询到的数据和分页相关的信息传递到页面中,供分页控件使用。 5. 在页面中根据分页信息渲染分页控件,并显示当前页的数据。 以下是一个简单的示例代码,实现了基本的分页功能: ```java // 获取当前页码和每页显示的记录数 int currentPage = Integer.parseInt(request.getParameter("page")); int pageSize = Integer.parseInt(request.getParameter("pageSize")); // 计算总记录数和总页数 int totalCount = dao.getTotalCount(); int totalPage = (totalCount + pageSize - 1) / pageSize; // 查询当前页需要显示的数据 List<Data> dataList = dao.getDataList(currentPage, pageSize); // 将分页信息和数据传递到页面 request.setAttribute("currentPage", currentPage); request.setAttribute("pageSize", pageSize); request.setAttribute("totalPage", totalPage); request.setAttribute("totalCount", totalCount); request.setAttribute("dataList", dataList); ``` 在页面中,可以使用JSP或Thymeleaf等模板引擎渲染分页控件和数据,例如: ```html <!-- 渲染页码导航条 --> <nav> <ul class="pagination"> <% for (int i = 1; i <= totalPage; i++) { %> <li class="<%= i == currentPage ? "active" : "" %>"> <a href="?page=<%= i %>&pageSize=<%= pageSize %>"><%= i %></a> </li> <% } %> </ul> </nav> <!-- 渲染当前页的数据 --> <table> <thead> <tr> <th>ID</th> <th>Name</th> <th>Value</th> </tr> </thead> <tbody> <% for (Data data : dataList) { %> <tr> <td><%= data.getId() %></td> <td><%= data.getName() %></td> <td><%= data.getValue() %></td> </tr> <% } %> </tbody> </table> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值