分页+搜索功能的实现

分页+搜索应该是页面上一直在用的功能了。

他们两个分开是挺好做的,但是和起来就是另一回事了。

首先我们来分析下它们的原理,搜索是搜索的表中的某些字段亦或是模糊搜索,加起来就是一个网页。

分页则是需要网页上传过去一个当前页,传过去一个总页数,后台进行总页数/每页展示条数。

加在一起则是

//条件查询
    public List<UserInfo> getProductByCon(int index,int currentCount,Condition con) throws SQLException{
        QueryRunner qr=new QueryRunner(MyDBUtils.getDataSource());
        String sql="select * from userinfo where 1=1 ";  //如果不把where放到这里面,就会出现上一个无值,下一个不走了
        ArrayList<Object> arr=new ArrayList<Object>();
        //如果pname去掉空格后不为空字符串,并且不为空,去拼串
        if(con.getUsercard()!=null&&!con.getUsercard().trim().equals("")){
            sql+=" and usercard like ?";
            arr.add("%"+con.getUsercard()+"%");
        }
        if(con.getUsername()!=null&&!con.getUsername().trim().equals("")){
            sql+=" and username like ?";
            arr.add("%"+con.getUsername()+"%");
        }
        if(con.getStart()!=null&&!con.getStart().trim().equals("")){
            sql+=" AND ? < starttime ";
            arr.add(con.getStart());
            System.out.println("lala");
        }
        if(con.getEnd()!=null&&!con.getEnd().trim().equals("")){
            sql+=" AND ? > starttime";
            System.out.println("lal");
            arr.add(con.getEnd());
        }
        sql+=" limit ?,?";
        arr.add(index);
        arr.add(currentCount);
    /*    if(!con.getCid().trim().equals("")&&con.getCid().trim()!=null){
            sql+=" and cid=?";
            arr.add(con.getCid());
        }*/
        //将存放了形参的arr当做可变参数传入
        List<UserInfo> list=qr.query(sql, new BeanListHandler<UserInfo>(UserInfo.class),arr.toArray());
        System.out.println(list);
        return list;            
    }

service

//分页:为了封装一个Pageben给servlet
        public PageBean<UserInfo> getPageBean(int currentPage,int currentCount,Condition con){
                PageBean<UserInfo> page=new PageBean<UserInfo>();
                //封装当前页
                page.setCurrentPage(currentPage);
                //封装每页显示的条数
                page.setCurrentCount(currentCount);
                //封装总条数
                int totalCount=0;
                try {
                    totalCount=userInfroDao.gettotalCount();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                page.setTotalCount(totalCount);
                //封装总页数=总条数/每页显示的条数  52*1.0/12=4
                int totalPage=(int)Math.ceil(totalCount*1.0/currentCount);
                page.setTotalPage(totalPage);
                //封装每页显示的数据
                //封装每页显示的数据select * from product limit起始页,每页显示条数
                //计算起始页=(当前页-1)*每页显示条数
                int index=(currentPage-1)*currentCount;
                List<UserInfo> list=null;
                try {
                    list=userInfroDao.getProductByCon(index, currentCount,con);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                page.setList(list);
                return page;
        }

cotroller

    //搜索
                //解决乱码
                request.setCharacterEncoding("UTF-8");
                //获取所有参数的map集合
                Map<String ,String[]> map=request.getParameterMap();
                //new集合
                Condition con=new Condition();
                //将参数封装集合中,三个搜索的参数传入
                try {
                    BeanUtils.populate(con, map);
                } catch (IllegalAccessException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //分页
        //从前台获取当前页
        String currentPageStr=request.getParameter("currentPage");
        //因为servlet请求页面,显示默认的数字,所以就要设定下为空=1
        if(currentPageStr==null){
            currentPageStr="1";
        }
        //将当前页字符串强转为int
        int currentPage=Integer.parseInt(currentPageStr);
        System.out.println(currentPage);
        //手动设置每页显示的条数
        int currentCount=12;
        //调用servlet方法
        PageBean<UserInfo> page=userInfoUser.getPageBean(currentPage, currentCount,con);
        //放入域中
        request.setAttribute("Page", page);
        //请求转发
        //调用service层方法
        /*List<UserInfo> list =userInfoUser.getProductByCon(con);
        UserInfo userinfo=new UserInfo();
        //和之前遍历商品的是一样的,为了保证是一个值
        request.setAttribute("getUserinfo", list);*/
        request.getRequestDispatcher("/adduserinfo.jsp").forward(request, response);
    }

jsp

<form method="post"
                action="${pageContext.request.contextPath}/PageServlet">
                <div class="layui-card-body">
                    <div class="layui-inline layui-show-xs-block">
                        <input type="text" name="username" placeholder="请输入姓名"
                            autocomplete="off" class="layui-input"
                            value="${Condition.username}">
                    </div>
                    <div class="layui-inline layui-show-xs-block">
                        <input type="text" name="usercard" placeholder="请输入身份证"
                            autocomplete="off" class="layui-input"
                            value="${Condition.usercard}">
                    </div>
                    <%-- 查找身份证:<input type="text" name="usercard"
                        value="${Condition.usercard}"
                        style="height: 25px;  152px; border- 1px; border-style: solid; background-color: #fff; border-radius: 2px;">
                    查找姓名:<input type="text" name="username"
                        value="${Condition.username}"
                        style="height: 25px;  152px; border- 1px; border-style: solid; background-color: #fff; border-radius: 2px;">
 --%>
                    <!--  开始时间-结束时间查询-->
                    <div class="layui-inline layui-show-xs-block">
                        <input class="layui-input" autocomplete="off" placeholder="开始日"
                            name="start" id="start" value="${Condition.start}">
                    </div>
                    <div class="layui-inline layui-show-xs-block">
                        <input class="layui-input" autocomplete="off" placeholder="截止日"
                            name="end" id="end" value="${Condition.end}">
                    </div>

                    <div class="layui-inline layui-show-xs-block">
                        <button class="layui-btn" lay-submit="" lay-filter="sreach"
                            type="submit">
                            <i class="layui-icon">&#xe615;</i>
                        </button>
                    </div>
====分页========
    <!--分页 -->
        <div style=" 450px; margin: 0 auto; margin-top: 50px;">
            <ul class="pagination" style="text-align: center; margin-top: 10px;">
                <!--上一页  -->
                <c:if test="${Page.currentPage==1}">
                    <li class="disabled"><a href="javascript:void(0)"
                        aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                </c:if>
                <c:if test="${ Page.currentPage!=1}">
                    <li><a
                        href="${pageContext.request.contextPath}/PageServlet?currentPage=${Page.currentPage-1 }"
                        aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                </c:if>

                <c:forEach begin="1" end="${Page.totalPage }" var="page">
                    <c:if test="${ page==Page.currentPage}">
                        <li class="current"><a
                            href="${pageContext.request.contextPath}/PageServlet?currentPage=${page }">${page }</a>
                        </li>
                    </c:if>
                    <!--  如果当前页不等于从域中取过来的当前页-->
                    <c:if test="${ page!=Page.currentPage}">
                        <li><a
                            href="${pageContext.request.contextPath}/PageServlet?currentPage=${page }">${page }</a></li>
                    </c:if>
                </c:forEach>

                <c:if test="${Page.currentPage==Page.totalPage}">
                    <li class="disabled"><a href="javascript:void(0)"
                        aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>
                </c:if>

                <c:if test="${Page.currentPage!=Page.totalPage}">
                    <li><a
                        href="${pageContext.request.contextPath}/PageServlet?currentPage=${Page.currentPage+1}"
                        aria-label="Next"> <span aria-hidden="true">&raquo;</span>
                    </a></li>
                </c:if>
            </ul>
        </div>

原文地址:https://www.cnblogs.com/a199706/p/11686503.html