JSP实现分页查询

分页查询

1. 分页查询准备工作

采用物理查询:页面查询一页,就从数据库里查询一页数量的数据。
优:减少单次查询数据库的时间
缺:增加了操作数据库的次数

所需的关于 页数 的数据:
请求:当前页数 currentPage
响应:PageBean 类封装
● 当前页数 currentPage
● 总页数 totalPage
● 总记录数 totalSize
● 每页记录数 pageSize
● 当前页数据 pageList

总页数 = (总记录数 % 每页记录数 == 0) ? (总记录数 / 每页记录数) : (总记录数 / 每页记录数 + 1);
当前页数据 list = query( select * from limit 每页记录数*(当前页数-1), 每页记录数 );

2. 分页查询逻辑实现

效果图:
分页查询效果图

数据层封装 Employee.java(属性+生成即可) 和 PageBean.java

public class PageBean<T> {
    private Integer currentPage; // 当前页数
    private Integer totalPage; // 总页数
    private Integer totalSize; // 总记录数
    private Integer pageSize; // 每页记录数
    private List<T> list; // 当前页数据 <T> 针对哪种数据
    ...
}

显示层:userList.jsp

<table border="1" cellspacing="0px" cellpadding="5px" width="900px">
    <tr>
        <th>ID</th>
        <th></th>
        <th></th>
        <th>Email</th>
        <th>电话</th>
        <th>入职日期</th>
        <th>工号</th>
        <th>工资</th>
        <th>上级ID</th>
        <th>部门ID</th>
    </tr>
    <c:forEach items="${pageBean.list}" var="employee">
        <tr>
            <td>${employee.EMPLOYEE_ID}</td>
            <td>${employee.FIRST_NAME}</td>
            <td>${employee.LAST_NAME}</td>
            <td>${employee.EMAIL}</td>
            <td>${employee.PHONE_NUMBER}</td>
            <td>${employee.HIRE_DATE}</td>
            <td>${employee.JOB_ID}</td>
            <td>${employee.SALARY}</td>
            <td>${employee.MANAGER_ID}</td>
            <td>${employee.DEPARTMENT_ID}</td>
        </tr>
    </c:forEach>
    <tr>
        <td colspan="10" align="center">
            第${pageBean.currentPage}/${pageBean.totalPage}页
            总记录数:${pageBean.totalSize}条
            每页${pageBean.pageSize}条
            <c:if test="${pageBean.currentPage != 1}">
                <a href="${pageContext.request.contextPath}/user?methodName=selectUserListByPage&currentPage=1">
                    [首页]
                </a>
                <a href="${pageContext.request.contextPath}/user?methodName=selectUserListByPage&currentPage=${pageBean.currentPage-1}">
                    [上一页]
                </a>
            </c:if>
            <c:if test="${pageBean.currentPage != pageBean.totalPage}">
                <a href="${pageContext.request.contextPath}/user?methodName=selectUserListByPage&currentPage=${pageBean.currentPage+1}">
                    [下一页]
                </a>
                <a href="${pageContext.request.contextPath}/user?methodName=selectUserListByPage&currentPage=${pageBean.totalPage}">
                    [尾页]
                </a>
            </c:if>
        </td>
    </tr>
</table>

通用 BaseServlet 和 对应 UserServlet 资源逻辑:

@WebServlet(name = "UserServlet", urlPatterns = "/user")
public class UserServlet extends BaseServlet {
    private EmployeeService employeeService = new EmployeeServiceImpl();

    public Integer getCurrentPage(String currentPagestr) {
        if (null == currentPagestr) {
            currentPagestr = "1";
        }
        return Integer.valueOf(currentPagestr);
    }

    public String selectUserListByPage(HttpServletRequest request, HttpServletResponse response) {
        String currentPageStr = request.getParameter("currentPage");
        Integer currentPageNum = getCurrentPage(currentPageStr);

        PageBean<Employee> pageBean = null;
        try {
            pageBean = employeeService.selectUserListByPage(currentPageNum);
            request.setAttribute("pageBean", pageBean);
            return "/userList.jsp";
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return "/index.jsp";
    }
}
@WebServlet(name = "BaseServlet", urlPatterns = "/base")
public class BaseServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String methodName = request.getParameter("methodName");
        System.out.println("BaseServlet methodName=" + methodName);
        try {
            Method method = this.getClass().getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            String returnValue = (String) Objects.requireNonNull(method).invoke(this, request, response);
            if (null != returnValue) {
                // 资源跳转
                int index = returnValue.lastIndexOf(":");
                if (-1 == index) {
                    // 没有":" 转发
                    request.getRequestDispatcher(returnValue).forward(request, response);
                } else {
                    // 有":"
                    String path = returnValue.substring(index + 1);
                    if (returnValue.startsWith("redirect")) {
                        response.sendRedirect(request.getContextPath() + path);
                    } else if (returnValue.startsWith("forward")) {
                        request.getRequestDispatcher(path).forward(request, response);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

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

业务层:EmployeeServiceImpl.java

public class EmployeeServiceImpl implements EmployeeService {
    private EmployeeDao employeeDao = new EmployeeDaoImpl();

    @Override
    public PageBean<Employee> selectUserListByPage(Integer currentPage) throws SQLException {
        PageBean<Employee> pageBean = new PageBean<>();
        // 当前页数
        pageBean.setCurrentPage(currentPage);
        // 总记录数
        Integer totalSize = employeeDao.getTotalSize();
        pageBean.setTotalSize(totalSize);
        // 每页记录数
        Integer pageSize = 10;
        pageBean.setPageSize(pageSize);
        // 总页数(没余数为整页,有余数页数+1)
        Integer totalPages = (totalSize%pageSize==0) ? (totalSize/pageSize) : (totalSize/pageSize+1);
        pageBean.setTotalPage(totalPages);
        // 当前页数据
        List<Employee> list = employeeDao.queryAllByLimit(pageSize*(currentPage-1), pageSize);
        pageBean.setList(list);
        return pageBean;
    }
}

持久层:EmployeeDaoImpl.java

public class EmployeeDaoImpl implements EmployeeDao {
    private QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());

    @Override
    public List<Employee> queryAllByLimit(int offset, int limit) throws SQLException {
        return queryRunner.query(
                "select * from t_employees limit " + offset + "," + limit,
                new BeanListHandler<>(Employee.class)
        );
    }

    @Override
    public Integer getTotalSize() throws SQLException {
        return queryRunner.query(
                "select count(*) from t_employees",
                new ScalarHandler<Long>()
        ).intValue();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

姜源Jerry

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值