javaWeb原生后端条件分页查询

概要

条件分页查询,使用技术:mybatis,servlet,jsp

后端分页的整体流程

前端向后端提交请求,后端响应数据给前端,将数据展示在前端页面中

(1)前端页面

如图所示,我们需要的数据:

响应的数据:我们需要将后端传来的信息回显至前端页面中(需要一个List集合存储)

总记录数: 后台数据库查询后给出总记录数(需要变量记录总记录数)

总页码:可以根据总记录数以及每页显示的条数算出一共有多少个页码(需要变量计算总页码)

当前页:根据该页码让后台知道需要的数据

每页显示条数:可以设置下拉菜单让用户选择.

(2)后端实现

分页对象:由于前端需要接收后端传来的数据信息,我们可以根据前端页面的分析,集成一个分页对象,便于我们进行数据传输

@Data
public class PageBean<T> {
    /**当前页*/
    private Integer pageNo;
    /**每页显示数*/
    private Integer pageSize;
    /**总页数*/
    private Integer totalPage;
    /**每页显示的数据集合*/
    private List<T> pageData;
}

Controller控制器代码:

  1. 首先,需要获取前端传来的pageNo,pageSize的参数
  2. 判断前端传来的数据是否合理
  3. 若前端未传递数据,使用设置的默认值
  4. 获取条件查询的数据
  5. 使用hashMap将pageNo,pageSize,条件查询的数据封装起来
  6. 调用业务层,查询所需数据
  7. 查到数据后,将数据放置数据域中
  8. 请求转发到前端页面
/**设置初始pageNo,pageSize*/
@WebServlet(urlPatterns = "/queryPage",
        initParams = {@WebInitParam(name="pageNo",value="1"),
        @WebInitParam(name="pageSize",value="3")}
)
public class PageController extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取页码,每页显示的记录数
        String pageNo = req.getParameter("pageNo");
        String pageSize = req.getParameter("pageSize");

        //验证数据合理性
        if(isNull(pageNo)){
            pageNo=this.getServletConfig().getInitParameter("pageNo");
        }
        if(isNull(pageSize)){
            pageSize=this.getServletConfig().getInitParameter("pageSize");
        }
        //获取条件查询的数据
        String empName = req.getParameter("empName");

        HashMap<String,Object> paramMap=new HashMap<>();
        paramMap.put("pageNo",pageNo);
        paramMap.put("pageSize",pageSize);
        paramMap.put("empName",empName);

        EmpService empService=new EmpServiceImp();
        //调用业务类的方法完成业务控制
        PageBean<Employee> pageBean=empService.page(paramMap);
        //将分页对象放入到请求域中
        req.setAttribute("beanPage",pageBean);

        req.setAttribute("empName",empName);

        //转发
        req.getRequestDispatcher("/list.jsp").forward(req,resp);
    }

    private boolean isNull(String pageNo) {
        if(pageNo==null||"".equals(pageNo)){
            return true;
        }
        return false;
    }
}

Service业务层代码:

  1. pageNo(当前页)和pageSize(每页显示数)已经确定,
  2. 我们还需要的是totalPage(总页数)以及每页显示的数据集合,
  3. 总页数=总记录数/每页显示数,当不能整除时,总页数需要+1
  4. 并将其返回给controller也就是上面讲到的Controller流程的第六步。
 @Override
    public PageBean<Employee> page(HashMap<String, Object> paramMap) {
        //构建分页的Bean对象
        PageBean<Employee> pageBean = new PageBean<>();
        //获取当前页
        Integer pageNo=Integer.valueOf(paramMap.get("pageNo").toString());

        //封装每页显示的记录数
        pageBean.setPageSize(Integer.valueOf(paramMap.get("pageSize").toString()));
        
        //获取数据访问对象
        EmpDao empDao=SqlUtil.getMapper(EmpDao.class);

        //构建查询的参数
        HashMap<String,Object> conditionMap=new HashMap<>();
        //获取查询的条件
        conditionMap.put("empName",paramMap.get("empName"));
        
        //根据条件获取总记录数
        Integer count =empDao.selectCount(conditionMap);

        //计算总的页数
        //总页数=总记录数/每页显示条数
        //要通过%的方式判断是否能整除,不能整除要+1
        int totalPage=count%pageBean.getPageSize()==0?
                count/pageBean.getPageSize():count/pageBean.getPageSize()+1;
        
        if(pageNo<1){
            //如果传入的页码小于1,设置为第一页
            pageBean.setPageNo(1);
        }else if(pageNo>totalPage){
            //如果传入的页码大于总页数,设置为最后一页
            pageBean.setPageNo(totalPage);
        }else{
            //设置传入的页码数
            pageBean.setPageNo(pageNo);
        }

        //将总页数封装到pageBean上
        pageBean.setTotalPage(totalPage);
        
        //将查询的起始页码和每页显示数封装
        conditionMap.put("start",(pageBean.getPageNo()-1)*pageBean.getPageSize());
        conditionMap.put("size",pageBean.getPageSize());

        //调用数据访问层获取当前页的数据集合
        List<Employee> employeeList = empDao.selectByPage(conditionMap);
        //将数据集合封装到pageBean上
        pageBean.setPageData(employeeList);
        //断开数据库连接,返回数据集
        SqlUtil.realse();
        return pageBean;
    }

 dao层代码:


    /**查询表的总记录数*/
    Integer selectCount(HashMap<String,Object> conditionMap);

    /**分页查询*/
    List<Employee> selectByPage(HashMap<String,Object> conditionMap);

此处使用mybatis进行数据库的查询

<!--查询表的总记录数-->
    <select id="selectCount" resultType="java.lang.Integer" parameterType="hashmap">
      select count(*) from emp
      <where>
          <if test="name!=null">
            emp.name like "%"#{name}"%"
          </if>
      </where>
    </select>

    <!--查询每页的数据-->
    <select id="selectByPage" resultMap="resultEmp" parameterType="hashmap">
      select emp.*,dept.name  as deptName from emp
        left join dept
        on emp.deptId=dept.id
        <where>
            <if test="empName!=null">
                emp.name like "%"#{empName}"%"
            </if>
        </where>
        limit #{start},#{size}
    </select>

(3)前端实现:

前端使用jsp

  1. 使用表单控件将pageSize和pageNo,查询条件empName提交到控制器
  2. 点击上一页,将pageNo-1,获取每页显示数pageSize,以及查询条件,跳转至servlet,将请求交给分页查询控制器处理
  3. 点击下页也同理
  4. 使用循环遍历每一页,点击第n页,将获取第n也的pageNo,pageSize,以及查询条件提交请求,返回第n页的数据
  5. 每页显示条数,设置下拉菜单,点击每页显示条数后,将触发changeSize方法
  6. changeSize方法获取当前每页显示数以及查询条件,提交请求并返回数据

数据显示代码:

   <%--条件查询表单--%>
    <form action="queryPage" method="get">
        <input type="hidden" name="method" value="queryPage"/>
        <input type="hidden" name="pageSize" value="${beanPage.pageSize}"/>
        <input type="hidden" name="pageNo" value="1" />
        <input type="text" name="empName" placeholder="请输入员工姓名关键词" value="${empName}"/>
        <input type="submit" value="搜索"/>
    </form>
    <table cellpadding="0" cellspacing="0" border="1">
        <tr>
            <th>雇员编号</th>
            <th>雇员名字</th>
            <th>雇员工资</th>
            <th>雇员部门</th>
            <th>删除操作</th>
            <th>修改操作</th>
        </tr>
        <%--数据域中没有数据--%>
        <c:if test="${empty beanPage.pageData}">
            <tr>
                <td colspan="6">列表中没有数据,请添加数据后进行查看</td>
            </tr>
        </c:if>
        <%--数据域中数据不为空--%>
        <c:if test="${not empty beanPage.pageData}">
            <%--遍历获取数据--%>
            <c:forEach items="${beanPage.pageData}" var="e">
                <tr>
                    <td>${e.id}</td>
                    <td>${e.name}</td>
                    <td>${e.salary}</td>
                    <td>${e.dept.name}</td>
                    <td><a href="javascript:;" onclick="delBtn(${e.id})">删除</a></td>
                    <td><a href="javascript:;" onclick="updateBtn(${e.id})">修改</a></td>
                </tr>
            </c:forEach>
        </c:if>
    </table>

分页代码

 <a href="${pageContext.request.contextPath}/queryPage?pageNo=${beanPage.pageNo+1}&pageSize=${beanPage.pageSize}&empName=${empName}">上一页</a>
    <%--循环总页数,显示每一页--%>
    <c:forEach begin="1" end="${beanPage.totalPage}" varStatus="statue">
        <a href="${pageContext.request.contextPath}/queryPage?pageNo=${statue.count}"&pageSize="${beanPage.pageSize}&empName=${empName}" class="menuUI"
                <c:if test="${statue.count==beanPage.pageNo}">style="background-color: white"</c:if>>
        ${statue.count}</a>

    </c:forEach>
    <a href="${pageContext.request.contextPath}/queryPage?pageNo=${beanPage.pageNo+1}&pageSize=${beanPage.pageSize}&empName=${empName}">下一页</a>
    每页显示
    <select onchange="changeSize(this)">
        <option value="1" <c:if test="${beanPage.pageSize == 1}">selected</c:if>>1</option>
        <option value="2" <c:if test="${beanPage.pageSize == 2}">selected</c:if>>2</option>
        <option value="3" <c:if test="${beanPage.pageSize == 3}">selected</c:if>>3</option>
    </select>
    条
 function changeSize(obj){
        window.location.href="http://localhost:8080<%=request.getContextPath()%>/queryPage?pageNo=${beanPage.pageNo}&empName=${empName}&pageSize="+obj.value
    }

小结

分页查询到这就结束了,该文参考了知乎分页查询的入门打开方式(JavaWeb) - 二境志的文章 - 知乎 https://zhuanlan.zhihu.com/p/104049461,不过后端的实现以及前端实现方式与原作者不同。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值