第一种情况:一个页面走一个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.>; }else if(key.equals("type") && !value.equals("")){ hql+="and h.type2.>; }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.>; } } } 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; } }