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 分页保存查询条件的更多相关文章
- Thinkphp分页时查询条件保存方法
web应用中经常要根据用户提交的查询条件进行过滤,再以列表方式显示在浏览器上.如果这种查询是多种条件的组合,并要进行分页显示,则如何在分页导航中保持查询条件,是必须解决的问题. 在Thinkphp中, ...
- 使用AspNetPager进行分页,查询条件丢失问题
在Asp.Net中使用AspNetPager进行分页时,发现一个问题: 当通过查询条件进行查询后,对查询结果进行翻页操作时,查询条件会丢失. 当修改UrlPaging属性后(设置UrlPaging=“ ...
- jsp+servlet实现模糊查询和分页效果
---恢复内容开始--- 1.DAO+MVC包 2.DAO接口方法定义 package com.wanczy.dao; import java.math.BigDecimal;import java. ...
- Thinkphp 带查询条件数据分页
//查询条件中如果有中文 $keyword= urldecode(I("request.keyword")); if ($keyword!=""){ $Mode ...
- MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页
前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点.一般的列表页面,少不了有查询条件,下面分享下Drapper+Page ...
- thinkphp带查询条件的分页
<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8& ...
- EF:分页查询 + 条件查询 + 排序
/// <summary> /// linq扩展类---zxh /// </summary> /// <typeparam name="T">& ...
- hibernate中带查询条件的分页
所谓分页,从数据库中分,则是封装一个分页类.利用分页对象进行分页. 但,分页往往带查询条件. 分页类的三个重要数据:[当前页码数],[数据库中的总记录数],[每页显示的数据的条数] 原理:select ...
- spring mongodb分页,动态条件、字段查询
使用MongRepository public interface VideoRepository extends MongoRepository<Video, String> { Vid ...
随机推荐
- ★ prototype、__proto__ 详解
# var Person = function(name) { this.name = name; } var p = new Person(); //new操作符的操作是 var p = {} p. ...
- leetcode - [6]Binary Tree Postorder Traversal
Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...
- java重定向与请求转发的区别
最近工作不算太忙,今天在这里对java中的重定向和请求转发稍作总结,希望能帮助到大家. 请求转发: request.getRequestDispatcher().forward(); 重定向: res ...
- eclipse中html编辑环境的搭建
转自http://blog.csdn.net/xuanyuansen/article/details/9318661 最近开始对JAVA网络编程感兴趣,所以索性用起了鼎鼎有名的eclipse,正如广大 ...
- html5 datalist
教程:http://www.w3school.com.cn/html5/html5_datalist.asp 提供自动完成的文本框
- SpringMVC源码分析(3)DispatcherServlet的请求处理流程
<springmvc源码分析(2)dispatcherservlet的初始化>初始化DispatcherServlet的多个组件. 本文继续分析DispatcherServlet解析请求的 ...
- Shell 命令实现词频统计
杨贵福老师的方法 cat tr sed sort head 命令的综合使用方式1 $ cat pg11.txt |tr -cs A-Za-z\' '\n' |sed "/'/d"| ...
- Excel 两列单元格合并超级链接的VBA 写法
Excel 单元格 分两列 (B列存放姓名, C列存放链接) 列如: 姓名 学号 博客地址 1309032022 李汉超 http://www.cnblogs.com/Vpygamalion/ 141 ...
- vs2017常用快捷键
项目相关的快捷键 Ctrl + Shift + B = 生成项目 Ctrl + Alt + L = 显示 Solution Explorer(解决方案资源管理器) Ctrl + Shift + A = ...
- 在我朝如何为Brackets安装扩展?
Brackets是Adobe发起的一个开源的HTML编辑器,界面优美简洁.扩展丰富.支持基于Chrome浏览器的实时预览,非常适合对于Web的开发和学习. 但是Brackets的安装包下载和扩展下载, ...