第一种情况:一个页面走一个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 分页保存查询条件的更多相关文章

  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. Atcoder Grand-014 Writeup

    A - Cookie Exchanges 题面 Takahashi, Aoki and Snuke love cookies. They have A, B and C cookies, respec ...

  2. silverlight 父窗体传值给ChildWindow

    在网上找了许多列子,有的没有看懂,有的太麻烦. 现在有两种方法又简单又实用的,分享给大家! 第一种:使用构造函数传值 1.子页面新建一个构造函数 public ChildWindowTest(stri ...

  3. 归并排序 JavaScript 实现

    前文我们了解了快速排序算法的实现,本文我们来了解下另一种流行的排序算法-归并排序算法. 我们先来回顾下快排.快排的核心是找出一个基准元素,把数组中比该元素小的放到左边数组,比该元素大的放到右边数组,如 ...

  4. #微码分享#C++变参字符串格式化函数format_string

    在C和C++中,变参格式化函数虽然非类型安全,但却十分便利,因为得到广泛使用.对于常见的size_t类型要用“%zu”,ssize_t用”%zd“,int64_t用“% ”PRId64,uint64_ ...

  5. 查看Redis集群主从对应关系工具

    工具的作用: 1)比"cluster nodes"更为直观的显示结果 2)指出落在同一个IP上的master 3)指出落在同一个IP上的master和slave对 运行效果图: 源 ...

  6. 深入浅出javascript(三)封装和继承

    一.私有变量和公有变量 通过var修饰的是私有变量. 二.私有变量的访问方法 三.特权.公有和私有方法 一个例子: function f(name) { var name=name; //私有变量 t ...

  7. 让页面整体变灰css设置

    上次看到某人去世了,百度就把相应介绍某人的信息页面全部灰掉,于是寻找到了种简单的方法,只需设置html html { filter: grayscale(100%); -webkit-filter: ...

  8. webService之helloword(java)rs

    webservice之rs(helloworld) 1.pom.xml文件 <dependencies> <!-- 使用CXF RS开发 --> <dependency& ...

  9. JAVA作业之动手动脑

    1.枚举类型是引用类型,但例子输出结果引用的不是同一个类型.枚举类型可以有自己的属性(参数)和方法,枚举类型可以以独立的文件存在. 2.第一个"X+Y="+X+Y的运行结果是默认为 ...

  10. SPRING框架中ModelAndView、Model、ModelMap区别及详细分析

    转载内容:http://www.cnblogs.com/google4y/p/3421017.html 1. Model Model 是一个接口, 其实现类为ExtendedModelMap,继承了M ...