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 -->

 

原文地址:https://www.cnblogs.com/wkrbky/p/5883741.html