第一种情况:一个页面走一个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; } }
第二种情况:多个页面同时走一个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 -->