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构建

 

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

相关文章
|
22天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1月前
|
Web App开发 SQL Java
javaweb实现分页(二)
javaweb实现分页(二)
19 1
|
1月前
|
Web App开发 Java 关系型数据库
java中部的分页实现(二)
java中部的分页实现(二)
17 1
|
1月前
|
SQL 关系型数据库 MySQL
javaweb中实现分页,持续更新……
javaweb中实现分页,持续更新……
16 1
|
1月前
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
Mybatis+mysql动态分页查询数据案例——分页工具类(Page.java)
22 1
|
1天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
10天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
19天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
18 3
|
22天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
23天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南