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

    解决办法:   

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

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

1.Servlet中代码

  1. /** 接口实现类 可以放到调用处,可少走代码提高效率*/
  2. HouseDao hdi=new HouseDaoImpl();
  3.  
  4. /** map集合 用户选择的条件 */
  5. Map<String, Object> map=null;
  6.  
  7. /** 页面配置 初始count为零,当查询到结果后再给予赋值*/
  8. SeniorPage senior=new SeniorPage(1, 5, 0);
  9. String index=request.getParameter("index");
  10. /** 当index不为空时重新赋予index值 */
  11. if(index!=null){
  12. senior.setPageIndex(Integer.parseInt(index));
  13. }
  14.  
  15. /**根据用户不同的请求,进去不同的操作 */
  16. String term=request.getParameter("term");
  17. if(term!=null){
  18. /**
  19. * 当点击房屋搜索按钮时 重置用户条件的map -若不重置的话 当用户点击了搜索按钮但没有选择条件的情况下,还是查询的上一次结果
  20. map=new HashMap<String, Object>();*/
  21. if(term.equals("likeHouse")){
  22.  
  23. String title=request.getParameter("title")==null?"":request.getParameter("title");
  24. String price=request.getParameter("price")==null?"":request.getParameter("price");
  25. String street=request.getParameter("street_id")==null?"":request.getParameter("street_id");
  26. String type=request.getParameter("type_id")==null?"":request.getParameter("type_id");
  27. String floorage=request.getParameter("floorage")==null?"":request.getParameter("floorage");
  28.  
  29. map=new HashMap<String, Object>();
  30. map.put("title", title);
  31. map.put("price", price);
  32. map.put("street", street);
  33. map.put("type", type);
  34. map.put("floorage", floorage);
  35.  
  36. /**
  37. * 取Map集合放这里 确实优化了效率
  38. * 保存用户这一次选择的条件 ,便于下一页功能,获得用户搜索条件 */
  39. request.getSession().setAttribute("map", map);
  40. }
  41. }else{
  42.  
  43. /**
  44. * 当点击下一页的时候取 ,存入session的上次用户选择的条件 -放入这里的原因是只有点击下一页的时候才会找这行代码,稍微优化性能
  45. */
  46. map=(Map<String, Object>) request.getSession().getAttribute("map");
  47.  
  48. }
  49.  
  50. /** 得到查询到的结果集 */
  51. List<Object> listObj=hdi.houseInfoLike(senior.getPageIndex(), senior.getPageSize(), map);
  52. /** 取出 总条数 -并赋予页面配置属性*/
  53. senior.setCount((Integer)listObj.get(0));
  54. /** 响应结果给予客户端 */
  55. /* 条件查询的结果*/
  56. List<House> listHouse=(List<House>) listObj.get(1);
  57. request.getSession().setAttribute("HouseList", listHouse);
  58. /* 传页面配置信息 */
  59. request.setAttribute("page", senior);
  60.  
  61.   /** 转发跳转 */
  62.   request.getRequestDispatcher("page/search_list.jsp").forward(request, response);

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

  1. /** 条件查询 带分页 带得到总条数 */
  2. public List<Object> houseInfoLike(int pageIndex, int pageSize,
  3. Map<String, Object> map) {
  4. List<Object> listObj=new ArrayList<Object>();
  5.  
  6. Session session=HibernateSessionFactory.getSession();
  7.  
  8. String hql="from House h where 1=1 ";
  9.  
  10. /** 遍历map集合 得到用户的选择 if判断map集合不等于{}时要先判断是否为空。否则点toString会空指针 */
  11. if(map!=null && !map.toString().equals("{}")){
  12. Set<String > keySet= map.keySet();
  13. Iterator<String> iterator=keySet.iterator();
  14. while(iterator.hasNext()){
  15. String key=iterator.next();
  16. String value=map.get(key).toString();
  17. /** 判断选择了哪些条件 */
  18. if(key.equals("title") && !value.equals("")){
  19. hql+="and h.title like('%"+value+"%') ";
  20.  
  21. }else if(key.equals("price") && !value.equals("")){
  22. /** 拆分价格 */
  23. String[] price=value.split("-");
  24. hql+="and h.price between "+price[0]+" and "+price[1]+" ";
  25. }else if(key.equals("street") && !value.equals("")){
  26.  
  27. hql+="and h.street.id="+value+" ";
  28.  
  29. }else if(key.equals("type") && !value.equals("")){
  30.  
  31. hql+="and h.type2.id="+value+" ";
  32. }else if(key.equals("floorage") && !value.equals("")){
  33.  
  34. String[] price=value.split("-");
  35. hql+="and h.floorage between "+price[0]+" and "+price[1]+" ";
  36. }else if(key.equals("users") && !value.equals("")){
  37.  
  38. hql+="and h.users.id="+value+" ";
  39. }
  40.  
  41. }
  42. }
  43.  
  44. Query query=session.createQuery(hql);
  45.  
  46. /** 得到总条数 */
  47. ScrollableResults scroll= query.scroll();
  48. scroll.last();
  49. int count=scroll.getRowNumber()+1;
  50. listObj.add(count);
  51.  
  52. /** 分页 */
  53. query.setFirstResult((pageIndex-1)*pageSize);
  54. query.setMaxResults(pageSize);
  55.  
  56. /** 得到分页后的结果 */
  57. List<House> listHouse=query.list();
  58. listObj.add(listHouse);
  59.  
  60. return listObj;
  61. }

3.html代码

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

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

  1. package com.page;
  2. /**
  3. * 分页专用属性
  4. * @author asus
  5. *
  6. */
  7.  
  8. public class SeniorPage {
  9. /** 属性 */
  10. private int pageIndex;
  11. private int pageSize;
  12. private int paterPage;
  13. private int nextPage;
  14. private int totalPage;
  15. private int count;
  16.  
  17. /** 构造 */
  18. public SeniorPage(int pageIndex, int pageSize, int count) {
  19. super();
  20. this.pageIndex = pageIndex;
  21. this.pageSize = pageSize;
  22. this.count = count;
  23. }
  24.  
  25. /** JavaBean */
  26. public int getPageIndex() {
  27. return pageIndex;
  28. }
  29. public void setPageIndex(int pageIndex) {
  30. this.pageIndex = pageIndex;
  31. }
  32. public int getPageSize() {
  33. return pageSize;
  34. }
  35. public void setPageSize(int pageSize) {
  36. this.pageSize = pageSize;
  37. }
  38. public int getCount() {
  39. return count;
  40. }
  41. public void setCount(int count) {
  42. this.count = count;
  43. }
  44.  
  45. /** 上一页 */
  46. public int getPaterPage() {
  47. if(pageIndex==1){
  48. paterPage=1;
  49. }else{
  50. paterPage=pageIndex-1;
  51. }
  52. return paterPage;
  53. }
  54. public void setPaterPage(int paterPage) {
  55. this.paterPage = paterPage;
  56. }
  57.  
  58. /** 下一页 */
  59. public int getNextPage() {
  60. if(pageIndex==this.getTotalPage()){
  61. nextPage=this.getTotalPage();
  62. }else{
  63. nextPage=pageIndex+1;
  64. }
  65. return nextPage;
  66. }
  67. public void setNextPage(int nextPage) {
  68. this.nextPage = nextPage;
  69. }
  70.  
  71. /** 总页数 */
  72. public int getTotalPage() {
  73. totalPage=count%pageSize==0?count/pageSize:count/pageSize+1;
  74. return totalPage;
  75. }
  76. public void setTotalPage(int totalPage) {
  77. this.totalPage = totalPage;
  78. }
  79.  
  80. }

Page分页参数类

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

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

1.Servlet

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

2.HTML

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

 

Servlet 分页保存查询条件的更多相关文章

  1. Thinkphp分页时查询条件保存方法

    web应用中经常要根据用户提交的查询条件进行过滤,再以列表方式显示在浏览器上.如果这种查询是多种条件的组合,并要进行分页显示,则如何在分页导航中保持查询条件,是必须解决的问题. 在Thinkphp中, ...

  2. 使用AspNetPager进行分页,查询条件丢失问题

    在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ...

  3. jsp+servlet实现模糊查询和分页效果

    ---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...

  4. Thinkphp 带查询条件数据分页

    //查询条件中如果有中文 $keyword= urldecode(I("request.keyword")); if ($keyword!=""){ $Mode ...

  5. MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页

    前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点.一般的列表页面,少不了有查询条件,下面分享下Drapper+Page ...

  6. thinkphp带查询条件的分页

    <!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...

  7. EF:分页查询 + 条件查询 + 排序

    /// <summary> /// linq扩展类---zxh /// </summary> /// <typeparam name="T">& ...

  8. hibernate中带查询条件的分页

    所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select ...

  9. spring mongodb分页,动态条件、字段查询

    使用MongRepository public interface VideoRepository extends MongoRepository<Video, String> { Vid ...

随机推荐

  1. .net 导出Excel

    CreateExcel(ExcelDs, ", f); void CreateExcel(DataSet ds, string typeid, string FileName) { Http ...

  2. 基于S2AFCM的子主题划分

    http://sztsg.czlib.net:8088/interlibSSO/goto/2/=jmr9bmjh9mds/KXReader/Detail?dbcode=CJFD&filenam ...

  3. redis for lack of backlog

    版本: redis-3.2.9 部署: 5台64G内存的物理机,每台机器启动2个redis进程组成5主5备集群,每台机器1个主1个备,并且错开互备. 问题: 发现redis进程占用内存高达40G,而且 ...

  4. UML(一)下载与安装

    三步 Step1 下载绿色版: http://www.pc6.com/softview/SoftView_64080.html Step2 下载汉化包,(提供一个地址): http://downloa ...

  5. Docker mysql 主从

    一.独立容器部署mysql主从 # 主从 my.cnf加上 [mysqld] server-id = XXX log-bin = mysql-bin log-bin-index = log-bin.i ...

  6. Mysql之数据库操作

    数据库操作: 链接数据库: mysql -uroot -p masql -uroot -pmysql 退出数据库: exit/quit/ctrl + d   sql语句最后需要分号结尾: 查看时间: ...

  7. Application-identifier entitlement does not match问题的解决

    以下是一个老外的回答: This happened to me after installing a build from TestFlight and overwriting it with the ...

  8. (记忆化搜索 )The Triangle--hdu --1163

    http://poj.org/problem?id=1163     Description 73 88 1 02 7 4 44 5 2 6 5 (Figure 1) Figure 1 shows a ...

  9. Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)

    Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...

  10. mysql-5.7安装、配置

    1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...