• Servlet 分页保存查询条件


    第一种情况:一个页面走一个JSP页面和Servlet

        解决办法:   

          /** 把用户这一次选择的所有条件保存Map集合中,再把 map存到Session会话中,点击分页时进入将Servlet中再将Session中的map集合取出来,获得用户上一次的搜索条件 */

          request.getSession().setAttribute("map", map);

    1.Servlet中代码

    /** 接口实现类    可以放到调用处,可少走代码提高效率*/
            HouseDao hdi=new HouseDaoImpl();
    
            /** map集合 用户选择的条件 */
            Map<String, Object> map=null;
            
            /** 页面配置  初始count为零,当查询到结果后再给予赋值*/
            SeniorPage senior=new SeniorPage(1, 5, 0);
            String index=request.getParameter("index");
            /** 当index不为空时重新赋予index值 */
            if(index!=null){
                senior.setPageIndex(Integer.parseInt(index));
            }
            
            /**根据用户不同的请求,进去不同的操作 */
            String term=request.getParameter("term");
            if(term!=null){
                /** 
                 * 当点击房屋搜索按钮时 重置用户条件的map  -若不重置的话 当用户点击了搜索按钮但没有选择条件的情况下,还是查询的上一次结果 
                map=new HashMap<String, Object>();*/
                if(term.equals("likeHouse")){
                    
                    String title=request.getParameter("title")==null?"":request.getParameter("title");
                    String price=request.getParameter("price")==null?"":request.getParameter("price");
                    String street=request.getParameter("street_id")==null?"":request.getParameter("street_id");
                    String type=request.getParameter("type_id")==null?"":request.getParameter("type_id");
                    String floorage=request.getParameter("floorage")==null?"":request.getParameter("floorage");
                    
                    map=new HashMap<String, Object>();
                    map.put("title", title);
                    map.put("price", price);
                    map.put("street", street);
                    map.put("type", type);
                    map.put("floorage", floorage);
                    
                    
                    /**
                     * 取Map集合放这里    确实优化了效率
                     *  保存用户这一次选择的条件  ,便于下一页功能,获得用户搜索条件 */
                    request.getSession().setAttribute("map", map);
                }
            }else{
             
                    /**
                     * 当点击下一页的时候取 ,存入session的上次用户选择的条件  -放入这里的原因是只有点击下一页的时候才会找这行代码,稍微优化性能
                     */
                    map=(Map<String, Object>) request.getSession().getAttribute("map");
               
            }
                    
            
                /** 得到查询到的结果集 */
                List<Object> listObj=hdi.houseInfoLike(senior.getPageIndex(), senior.getPageSize(), map);
                /** 取出 总条数 -并赋予页面配置属性*/
                senior.setCount((Integer)listObj.get(0));
                /** 响应结果给予客户端 */
                    /* 条件查询的结果*/
                List<House> listHouse=(List<House>) listObj.get(1);
                request.getSession().setAttribute("HouseList", listHouse);
                    /* 传页面配置信息 */
                request.setAttribute("page", senior);
               
         
              /** 转发跳转 */
              request.getRequestDispatcher("page/search_list.jsp").forward(request, response);

    2.dao实现类的代码,使用的是Hibernate

    /** 条件查询 带分页 带得到总条数   */
        public List<Object> houseInfoLike(int pageIndex, int pageSize,
                Map<String, Object> map) {
            List<Object> listObj=new ArrayList<Object>();
            
            Session session=HibernateSessionFactory.getSession();
            
            String hql="from House h where 1=1 ";
            
            /** 遍历map集合 得到用户的选择   if判断map集合不等于{}时要先判断是否为空。否则点toString会空指针 */
            if(map!=null && !map.toString().equals("{}")){
                Set<String > keySet= map.keySet();
                Iterator<String> iterator=keySet.iterator();
                while(iterator.hasNext()){
                    String key=iterator.next();
                    String value=map.get(key).toString();
                    /** 判断选择了哪些条件 */
                    if(key.equals("title") && !value.equals("")){
                        hql+="and h.title like('%"+value+"%') ";
                        
                    }else if(key.equals("price") && !value.equals("")){
                        /** 拆分价格 */
                        String[] price=value.split("-");
                        hql+="and h.price between "+price[0]+" and "+price[1]+" ";
                    }else if(key.equals("street") && !value.equals("")){
                        
                        hql+="and h.street.id="+value+" ";
                        
                    }else if(key.equals("type") && !value.equals("")){
                        
                        hql+="and h.type2.id="+value+" ";
                    }else if(key.equals("floorage") && !value.equals("")){
                        
                        String[] price=value.split("-");
                        hql+="and h.floorage between "+price[0]+" and "+price[1]+" ";
                    }else if(key.equals("users") && !value.equals("")){
                        
                        hql+="and h.users.id="+value+" ";
                    }
                    
                }
            }
            
            Query query=session.createQuery(hql);
            
            /** 得到总条数 */
            ScrollableResults scroll= query.scroll();
            scroll.last();
            int count=scroll.getRowNumber()+1;
            listObj.add(count);
            
            /** 分页 */
            query.setFirstResult((pageIndex-1)*pageSize);
            query.setMaxResults(pageSize);
            
            /** 得到分页后的结果 */
            List<House> listHouse=query.list();
            listObj.add(listHouse);
            
            return listObj;
        }

    3.html代码

    <li class="current"><a href="usersServlet?method=getAllHouseList&index=1">首页</a></li>
                <li><a href="usersServlet?method=getAllHouseList&index=${page.paterPage }">上一页</a></li>
                <li><a href="usersServlet?method=getAllHouseList&index=${page.nextPage }">下一页</a></li>
                <li><a href="usersServlet?method=getAllHouseList&index=${page.totalPage }">末页</a></li>

    4.附加一个page分页工具类

    package com.page;
    /**
     * 分页专用属性
     * @author asus
     *
     */
    
    public class SeniorPage {
        /** 属性 */
        private int pageIndex;
        private int pageSize;
        private int paterPage;
        private int nextPage;
        private int totalPage;
        private int count;
        
        /** 构造 */
        public SeniorPage(int pageIndex, int pageSize, int count) {
            super();
            this.pageIndex = pageIndex;
            this.pageSize = pageSize;
            this.count = count;
        }
    
        /** JavaBean */
        public int getPageIndex() {
            return pageIndex;
        }
        public void setPageIndex(int pageIndex) {
            this.pageIndex = pageIndex;
        }
        public int getPageSize() {
            return pageSize;
        }
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
        public int getCount() {
            return count;
        }
        public void setCount(int count) {
            this.count = count;
        }
        
        /** 上一页 */
        public int getPaterPage() {
            if(pageIndex==1){
                paterPage=1;
            }else{
                paterPage=pageIndex-1;
            }
            return paterPage;
        }
        public void setPaterPage(int paterPage) {
            this.paterPage = paterPage;
        }
        
        /** 下一页 */
        public int getNextPage() {
            if(pageIndex==this.getTotalPage()){
                nextPage=this.getTotalPage();
            }else{
                nextPage=pageIndex+1;
            }
            return nextPage;
        }
        public void setNextPage(int nextPage) {
            this.nextPage = nextPage;
        }
    
        /** 总页数 */
        public int getTotalPage() {
            totalPage=count%pageSize==0?count/pageSize:count/pageSize+1;
            return totalPage;
        }
        public void setTotalPage(int totalPage) {
            this.totalPage = totalPage;
        }
        
    }
    Page分页参数类

    第二种情况:多个页面同时走一个Jsp页面与Servlet ,用上一种方法就会遇到一个问题,当第二个页面走Servlet会重置第一个页面存入session中的条件Map。

       解决办法:给存入Session会话中的键值对,赋一个动态的键名。首先要找到共通点比如说ID。

    1.Servlet

     /** 装条件查询的Map集合 */
         Map<String, Object> map = new HashMap<String, Object>();
            SqlSession session = MyBatisUtil.getSession();//MyBatis框架做的持久化数据,当然也可以换别的任何JDBC,Hibernate..
    
    
            /** 共通点查询条件 */
            String strVID = request.getParameter("varietyID");
            if(strVID!=null && !strVID.equals("undefined") && !strVID.equals("")){
                    /** 获得共通点查询条件ID */
                    int varietyID = Integer.parseInt(strVID);
                    map.put("varietyID", varietyID);//装入根据ID获得相应的信息 的查询条件
                }
                request.setAttribute("varietyID", value);//将ID传入页面,此ID就是标记,下一次走Servlet还要从页面再把此值传回来。JSP页面可以用隐藏域把值存起来。
            }
            
            /** 根据不同的信息进入相应的方法 */
            String method = request.getParameter("method");
            if(method!=null){
               if(method.equals("inTurn")){
                    /** 排序操作 */
                    String turn =request.getParameter("turn");
                    map.put("turn", turn);//装入排序操作信号,信息
                    request.getSession().setAttribute("map"+strVID, map);//动态存入Session会话中
                }else if(method.equals("paging")){
                        /** 分页 */
                        Map<String, Object> sessionMap = (Map<String, Object>) request.getSession().getAttribute("map"+strVID);//键名后动太的加了一个共通ID属性,来判断页面1取存入Session中map1查询条件,页面2取Session中的map2查询条件。
                        if(sessionMap!=null){
                            map=sessionMap;//取出上一次某页面存入的条件
                        }
                }
            }
          
            List<Commodity> commodityTerm = session.getMapper(CommodityDao.class).commodityTerm(map);//此为MyBatis,dao实现
            request.setAttribute("commodityTerm", commodityTerm);//响应页面商品信息数据
            
            /** 转发跳转 */
            request.getRequestDispatcher("page/variety_many.jsp").forward(request, response);

    2.HTML

    <!-- 隐藏域 -->
          <input id="hiddens" type="hidden" value="${requestScope.varietyID }" /><!-- 进入页面选择的类型ID(共通点),点击分页还要把此标记传回Servlet -->

     

  • 相关阅读:
    perlsplice
    perl中数组函数:delete和grep
    Python字符串格式化
    blast命令解释
    通俗解释托管与非托管
    四、GO语言的转义字符
    六、GO语言的指针
    五、GO语言的变量及数据类型
    一、GO语言的特点
    前台生成验证码案例
  • 原文地址:https://www.cnblogs.com/wkrbky/p/5883741.html
Copyright © 2020-2023  润新知