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 ...
随机推荐
- .net 导出Excel
CreateExcel(ExcelDs, ", f); void CreateExcel(DataSet ds, string typeid, string FileName) { Http ...
- 基于S2AFCM的子主题划分
http://sztsg.czlib.net:8088/interlibSSO/goto/2/=jmr9bmjh9mds/KXReader/Detail?dbcode=CJFD&filenam ...
- redis for lack of backlog
版本: redis-3.2.9 部署: 5台64G内存的物理机,每台机器启动2个redis进程组成5主5备集群,每台机器1个主1个备,并且错开互备. 问题: 发现redis进程占用内存高达40G,而且 ...
- UML(一)下载与安装
三步 Step1 下载绿色版: http://www.pc6.com/softview/SoftView_64080.html Step2 下载汉化包,(提供一个地址): http://downloa ...
- Docker mysql 主从
一.独立容器部署mysql主从 # 主从 my.cnf加上 [mysqld] server-id = XXX log-bin = mysql-bin log-bin-index = log-bin.i ...
- Mysql之数据库操作
数据库操作: 链接数据库: mysql -uroot -p masql -uroot -pmysql 退出数据库: exit/quit/ctrl + d sql语句最后需要分号结尾: 查看时间: ...
- Application-identifier entitlement does not match问题的解决
以下是一个老外的回答: This happened to me after installing a build from TestFlight and overwriting it with the ...
- (记忆化搜索 )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 ...
- Bloom Filter 算法简介 (增加 Counting Bloom Filter 内容)
Bloom Filter的中文翻译叫做布隆过滤器,是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询 ...
- mysql-5.7安装、配置
1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...