首页 > 代码库 > Servlet 分页保存查询条件

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

 

 

 

 

 

 

 

 

Servlet 分页保存查询条件