java web 分页详解1

简介:

Java Web中如何更好地分页呢?

并且分页时要记住当时的查询条件(现场恢复)

我以一个案例来详细说明.

我做了一个订单查询,界面如下:

 这个订单查询有6个条件,而且有分页,每页显示10条记录.

查询页面(list.jsp)代码如下:

Java代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <%  
  5.     String path = request.getContextPath();  
  6.     String basePath = request.getScheme() + "://"  
  7.             + request.getServerName() + ":" + request.getServerPort()  
  8.             + path + "/";  
  9. %>     
  10. <html xmlns="http://www.w3.org/1999/xhtml">  
  11. <head>  
  12. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  13. <title>个人信息管理</title>  
  14. <link rel="stylesheet" type="text/css" href="<%=path%>/static/css/tongy_xx.css">  
  15. <link rel="stylesheet" type="text/css" href="<%=path%>/static/css/ddcx.css">  
  16. <script type="text/javascript" src="<%=path%>/static/js/common_util.js"></script>  
  17.     <script type="text/javascript" src="<%=path%>/static/js/jquery-1.10.1.js"></script>  
  18.     <script type="text/javascript" src="<%=path%>/static/js/jquery.form.js"></script>  
  19.     <script type="text/javascript" src="<%=path%>/static/js/page.js"></script>  
  20.       
  21.   
  22.       
  23.     <jsp:include page="/WEB-INF/jsp/orders/orders.jsp"/>  
  24. </head>  
  25. <body>  
  26.       
  27.     <div class="box">  
  28.       
  29.         <jsp:include page="../public/top.jsp"/>  
  30.           
  31.         <jsp:include page="../public/left.jsp"/>  
  32.           
  33.         <form id="form" method="POST"  action="<%=path%>/orders/list"   >  
  34.         <div class="r_lr">  
  35.   
  36.               
  37.   
  38.                 <ul>  
  39.   
  40.                     <h3>订单查询</h3>  
  41.   
  42.                     <h4>检索条件</h4>  
  43.                       <Li>                      
  44.                         <label>条码/订单号:</label><input type="text" id="barCode" name="barCode" value="${view.barCode }" />  
  45.                     </Li>  
  46.                     <Li>  
  47.                             <label>订单类别:</label>  
  48.                             <select  id="orderclass" name="orderclass"  value="${view.orderclass }" >  
  49.                             <c:forEach items="${orderclass_map }" var="item" >  
  50.                               <option value="${item.key }" >   ${item.value }</option>    
  51.                             </c:forEach>  
  52.                             </select>  
  53.                     </Li>  
  54.                     <Li>  
  55.                             <label>医院/诊所:</label><input type="text" id="hospital" name="hospital" value="${view.hospital }" />  
  56.                     </Li>  
  57.                       
  58.                                 <Li>                      
  59.                         <label>医生:</label><input type="text" id="doctor" name="doctor" value="${view.doctor }" />  
  60.                     </Li>  
  61.                     <Li>  
  62.                             <label>患者:</label><input type="text" id="patient" name="patient" value="${view.patient }" />  
  63.                     </Li>  
  64.                     <Li>  
  65.                             <label>登记人:</label><input type="text" id="regname" name="regname" value="${view.regname }" />  
  66.                     </Li>  
  67.                       
  68.                       
  69.                     <Li class="submit"><input type="submit" value="查询" onclick="orders.checkForm()" /></Li>  
  70.   
  71.   
  72.   
  73.                 </ul>  
  74.   
  75.               
  76.             <h3>订单列表</h3>  
  77.               
  78.             <table style="color: white" >  
  79.                   
  80.                 <tr><th style="width:3">序号</th>  
  81.                 <th>条码</th><th>类别</th>  
  82.                 <th style="width:120" >医院/诊所</th>  
  83.                 <th>医生</th><th>患者</th>  
  84.                 <th style="display:none" >联系方式</th>  
  85.                 <th  >登记人</th>  
  86.                 <th style="width:100" >到厂日期</th>  
  87.                 <th style="width:120">操作</th></tr>  
  88.               
  89.                <c:forEach var="orders" items="${view.recordList}" varStatus="status">  
  90.                 <tr style="color:'red'" >  
  91.                     <td>${status.count }</td>  
  92.                     <td>${orders.barCode }</td>  
  93.                     <td>${orders.orderclass }</td>  
  94.                       
  95.                     <td>${orders.hospital }</td>  
  96.                       
  97.                     <td>${orders.doctor }</td>  
  98.                     <td>${orders.patient }</td>  
  99.                     <td style="display:none">${orders.tel }</td>  
  100.                     <td>${orders.regname }</td>  
  101.                     <td>${orders.inDate }</td>  
  102.                     <td>  
  103.                      <a  
  104.                         href="<%=path%>/orders/detail?barCode=${orders.barCode }&fsdf=${currentTime}">详情</a>  
  105.                         |<a  
  106.                         href="<%=path%>/osType/editInput?id=${orders.barCode }&fsdf=${currentTime}">防伪码</a>  
  107.                     </td>  
  108.                 </tr>  
  109.             </c:forEach>  
  110.                   
  111.                   
  112.                   
  113.             </table>  
  114.         <jsp:include page="../pageBottom.jsp">  
  115.             <jsp:param name="action" value="orders.query" />  
  116.         </jsp:include>  
  117.           
  118.           
  119.         </div>  
  120.         </form>  
  121.         </div>  
  122.       
  123.       
  124. </body>  
  125. </html>  

 我使用的是spring MVC框架,拿其中一个查询项来说,比如

<input type="text" id="doctor" name="doctor" value="${view.doctor }" />这是查询医生的.

后台控制器是如何接受查询的参数的呢?

后台controller 的action代码如下:

Java代码   收藏代码
  1. @RequestMapping(value = "/list")  
  2.     public String list(Model model,ToothOrders toothOrders, OrdersView view) {  
  3.         String barCode=toothOrders.getBarCode();  
  4.         ToothOrders toothOrders2=null;  
  5.         try {  
  6.             toothOrders2=toothOrders.clone();  
  7.             BeanUtils.copyProperties(view, toothOrders2);  
  8.         } catch (CloneNotSupportedException e) {  
  9.             e.printStackTrace();  
  10.         } catch (IllegalAccessException e) {  
  11.             e.printStackTrace();  
  12.         } catch (InvocationTargetException e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.         if(ValueWidget.isNullOrEmpty(barCode)){  
  16.             PageAssistant.paging(toothOrders,true,view, toothOrdersDao);  
  17.         }else{  
  18.             PageAssistant.paging("barCode",barCode,view, toothOrdersDao);  
  19.         }  
  20.         int size=view.getRecordList().size();  
  21.         for(int i=0;i<size;i++){  
  22.             ToothOrders toothOrders3=null;  
  23.             toothOrders3=(ToothOrders)view.getRecordList().get(i);  
  24.             toothOrders3.setOrderclass(DictionaryParam.get("orderclass", toothOrders3.getOrderclass()));  
  25.         }  
  26.           
  27.         model.addAttribute("orderclass_map", DictionaryParam.get(Constant2.DICTIONARY_GROUP_ORDERCLASS));  
  28.         model.addAttribute("orders", toothOrders2);  
  29.         model.addAttribute("view", view);  
  30.         model.addAttribute("currentTime", TimeHWUtil.getCurrentTimestamp()  
  31.                 .getTime());  
  32.         return "orders/list";  
  33.     }  

 spring MVC 会自动把请求要素doctor 注入到action 方法list() 的参数ToothOrders toothOrders中,即toothOrders 中将会包含所有的请求要素(查询项).下面是查询时执行到controller 的list方法时的状态:

 

接受到请求要素之后,连接数据库进行查询操作.

我们发现list方法还有一个形参,OrdersView view,view是用于接收分页的信息(当前是第多少页,共有多少页,每页显示多少条记录)的.

查询之后,重新设置view 中的分页信息,然后返回给视图(页面)

 是如何把分页信息返回给页面的呢?

controller 的代码:

Java代码   收藏代码
  1. model.addAttribute("view", view);  

 页面pageBottom.jsp

 该页面是所有分页页面需要include进去的,是一个公共的页面

Java代码   收藏代码
  1. <%@ page language="java" contentType="text/html; charset=UTF-8"  
  2.     pageEncoding="UTF-8"%>  
  3. <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>  
  4. <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>  
  5. <table style="height: 35px"  >  
  6.     <tr>  
  7.         <td nowrap="nowrap" style="width: 6%">  
  8.         <td nowrap="nowrap" style="width: 43%"><span style="color: white" >共  
  9.                   
  10.                 <c:choose>  
  11.           
  12.                     <c:when test="${view.totalRecords==0}"><font color="#df625c">0</font> </c:when>  
  13.                     <c:otherwise>  
  14.                         ${view.totalRecords }  
  15.                     </c:otherwise>  
  16.                 </c:choose>  
  17.                 条记录, 当前第<font color="#46bbfe"> <c:choose>  
  18.                     <c:when test="${view.totalPages==0 }">0</c:when>  
  19.                     <c:otherwise>  
  20.                     ${view.currentPage}  
  21.                 </c:otherwise>  
  22.                 </c:choose></font> / ${view.totalPages}页  
  23.         </span></td>  
  24.   
  25.   
  26.         <td nowrap="nowrap" style="display: none">  
  27.         <!-- 首页,view.currentPage的值为1 -->  
  28.         <td colspan="9"><span> <c:choose>  
  29.           
  30.                     <c:when test="${view.currentPage<=1}">首页</c:when>  
  31.                     <c:otherwise>  
  32.                         <a href="javascript:toPageFirst(${param.action})">首页</a>  
  33.                     </c:otherwise>  
  34.                 </c:choose> <c:choose>  
  35.                     <c:when test="${view.currentPage<=1}">上一页</c:when>  
  36.                     <c:otherwise>  
  37.                         <a href="javascript:toPagePre(${param.action})">上一页</a>  
  38.                     </c:otherwise>  
  39.                 </c:choose> <c:choose>  
  40.                     <c:when test="${view.currentPage>=view.totalPages }">下一页</c:when>  
  41.                     <c:otherwise>  
  42.                         <a href="javascript:toPageNext(${param.action})">下一页</a>  
  43.                     </c:otherwise>  
  44.                 </c:choose> <c:choose>  
  45.                     <c:when test="${view.currentPage>=view.totalPages}">尾页</c:when>  
  46.                     <c:otherwise>  
  47.                         <a href="javascript:toPageLast(${param.action})">尾页</a>  
  48.                     </c:otherwise>  
  49.                 </c:choose> <strong>转</strong> <c:choose>  
  50.                     <c:when test="${view.totalPages==0 }">  
  51.                         <input type="text" id="view.currentPage" name="currentPage" value="0" />  
  52.                     </c:when>  
  53.                     <c:otherwise>  
  54.                         <input type="text" id="view.currentPage" name="currentPage"  
  55.                             value="${view.currentPage }" />  
  56.                     </c:otherwise>  
  57.                 </c:choose> <strong> 页</strong> <a href="javascript:toPageGo(${param.action})">GO</a>  
  58.         </span> <input type="hidden" id="view.thisPage" value="${view.currentPage }" />  
  59.             <input type="hidden" id="view.totalPages" name="totalPages"  
  60.             value="${view.totalPages }"> <input type="hidden"  
  61.             id="view.ascDesc" name="ascDesc" value="${view.ascDesc }"> <input  
  62.             type="hidden" id="view.sortKey" name="sortKey"  
  63.             value="${view.sortKey }"></td>  
  64.   
  65.     </tr>  
  66.   
  67. </table>  

上述页面包含的控件: 

 

那么是如何恢复现场的呢?

也是通过view.

 疑问:

(1)list方法中为什么需要toothOrders 呢,有view 就足够了?

不是的,还需要toothOrders,因为条件查询时,我使用的是Example,所以必须使用ToothOrders对象

 

(2)toothOrders和view 能同时接收到请求要素吗?

是的,这两个对象都会接收到请求要素.要注意,页面表单控件的name不是toothOrders.doctor,而是doctor,这一点与struts2 是不同的.

 

(3)点击[下一页]时是如何保证查询原来的条件呢?

点击[下一步]时,会触发表单提交,同点击[查询]按钮,即会把表单提交,与点击[查询]不同的是:点击查询时会把当前页重置为1(currentPage初始值为1,而不是0).

 点击[上一页]或[下一页]时,应该查询原来的条件.比如我先查询文医生的订单,然后点击
[上一页]或[下一页]应该仍然查询文医生的订单,但是此时我输入其他查询条件,再点击[上一页]或[下一页],那么查询条件就变化了.这就是问题.

界面如下,我先查询订单类型为"正常"的订单:

 然后我在查询条件中添加条件:"
文医生",然后点击[下一页],结果如下:

 确实是进入了第二页,但是原来是共有2324页,但现在只有33页,因为查询条件变化了.但是这是不正常的,
点击[上一页]或[下一页]时查询条件不应该变化.

 

原因:点击[查询]和点击[上一页]或[下一页],触发的是同一个表单提交.

 

但是存在一个问题,点击[上一页]或[下一页]时查询条件应该是原来的.

如何解决这个问题呢?

我的方案如下:点击[查询]时,把查询条件存储到session中,然后点击[上一页]或[下一页]时,表单提交新增一个参数,用于区分点击[查询].

详细方案见下一篇博客.

项目源码见附件demo_channel_terminal.zip

注意:

项目使用spring MVC,hibernate框架,使用maven构建

 

大家可以提出自己的方案,多谢!!!

相关文章
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
58 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
63 6
|
2月前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
80 4
|
3月前
|
Java 程序员 调度
Java|PageHelper 怎么自作主张帮我分页?
没有调用 PageHelper.startPage,查询怎么也被自动分页了?
17 2
|
2月前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
74 0
|
3月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
49 1
WK
|
2月前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
120 0
|
4月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
5月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
47 1
|
5月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
86 3