java web中如何更好地分页呢?
并且分页时要记住当时的查询条件(现场恢复)
我以一个案例来详细说明.
我做了一个订单查询,界面如下:
这个订单查询有6个条件,而且有分页,每页显示10条记录.
查询页面(list.jsp)代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <% String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; %> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>个人信息管理</title> <link rel="stylesheet" type="text/css" href="<%=path%>/static/css/tongy_xx.css"> <link rel="stylesheet" type="text/css" href="<%=path%>/static/css/ddcx.css"> <script type="text/javascript" src="<%=path%>/static/js/common_util.js"></script> <script type="text/javascript" src="<%=path%>/static/js/jquery-1.10.1.js"></script> <script type="text/javascript" src="<%=path%>/static/js/jquery.form.js"></script> <script type="text/javascript" src="<%=path%>/static/js/page.js"></script> <jsp:include page="/WEB-INF/jsp/orders/orders.jsp"/> </head> <body> <div class="box"> <jsp:include page="../public/top.jsp"/> <jsp:include page="../public/left.jsp"/> <form id="form" method="POST" action="<%=path%>/orders/list" > <div class="r_lr"> <ul> <h3>订单查询</h3> <h4>检索条件</h4> <Li> <label>条码/订单号:</label><input type="text" id="barCode" name="barCode" value="${view.barCode }" /> </Li> <Li> <label>订单类别:</label> <select id="orderclass" name="orderclass" value="${view.orderclass }" > <c:forEach items="${orderclass_map }" var="item" > <option value="${item.key }" > ${item.value }</option> </c:forEach> </select> </Li> <Li> <label>医院/诊所:</label><input type="text" id="hospital" name="hospital" value="${view.hospital }" /> </Li> <Li> <label>医生:</label><input type="text" id="doctor" name="doctor" value="${view.doctor }" /> </Li> <Li> <label>患者:</label><input type="text" id="patient" name="patient" value="${view.patient }" /> </Li> <Li> <label>登记人:</label><input type="text" id="regname" name="regname" value="${view.regname }" /> </Li> <Li class="submit"><input type="submit" value="查询" onclick="orders.checkForm()" /></Li> </ul> <h3>订单列表</h3> <table style="color: white" > <tr><th style="width:3">序号</th> <th>条码</th><th>类别</th> <th style="width:120" >医院/诊所</th> <th>医生</th><th>患者</th> <th style="display:none" >联系方式</th> <th >登记人</th> <th style="width:100" >到厂日期</th> <th style="width:120">操作</th></tr> <c:forEach var="orders" items="${view.recordList}" varStatus="status"> <tr style="color:'red'" > <td>${status.count }</td> <td>${orders.barCode }</td> <td>${orders.orderclass }</td> <td>${orders.hospital }</td> <td>${orders.doctor }</td> <td>${orders.patient }</td> <td style="display:none">${orders.tel }</td> <td>${orders.regname }</td> <td>${orders.inDate }</td> <td> <a href="<%=path%>/orders/detail?barCode=${orders.barCode }&fsdf=${currentTime}">详情</a> |<a href="<%=path%>/osType/editInput?id=${orders.barCode }&fsdf=${currentTime}">防伪码</a> </td> </tr> </c:forEach> </table> <jsp:include page="../pageBottom.jsp"> <jsp:param name="action" value="orders.query" /> </jsp:include> </div> </form> </div> </body> </html>
我使用的是spring MVC框架,拿其中一个查询项来说,比如
<input type="text" id="doctor" name="doctor" value="${view.doctor }" />这是查询医生的.
后台控制器是如何接受查询的参数的呢?
后台controller 的action代码如下:
@RequestMapping(value = "/list") public String list(Model model,ToothOrders toothOrders, OrdersView view) { String barCode=toothOrders.getBarCode(); ToothOrders toothOrders2=null; try { toothOrders2=toothOrders.clone(); BeanUtils.copyProperties(view, toothOrders2); } catch (CloneNotSupportedException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } if(ValueWidget.isNullOrEmpty(barCode)){ PageAssistant.paging(toothOrders,true,view, toothOrdersDao); }else{ PageAssistant.paging("barCode",barCode,view, toothOrdersDao); } int size=view.getRecordList().size(); for(int i=0;i<size;i++){ ToothOrders toothOrders3=null; toothOrders3=(ToothOrders)view.getRecordList().get(i); toothOrders3.setOrderclass(DictionaryParam.get("orderclass", toothOrders3.getOrderclass())); } model.addAttribute("orderclass_map", DictionaryParam.get(Constant2.DICTIONARY_GROUP_ORDERCLASS)); model.addAttribute("orders", toothOrders2); model.addAttribute("view", view); model.addAttribute("currentTime", TimeHWUtil.getCurrentTimestamp() .getTime()); return "orders/list"; }
spring MVC 会自动把请求要素doctor 注入到action 方法list() 的参数ToothOrders toothOrders中,即toothOrders 中将会包含所有的请求要素(查询项).下面是查询时执行到controller 的list方法时的状态:
接受到请求要素之后,连接数据库进行查询操作.
我们发现list方法还有一个形参,OrdersView view,view是用于接收分页的信息(当前是第多少页,共有多少页,每页显示多少条记录)的.
查询之后,重新设置view 中的分页信息,然后返回给视图(页面)
是如何把分页信息返回给页面的呢?
controller 的代码:
model.addAttribute("view", view);
页面pageBottom.jsp
该页面是所有分页页面需要include进去的,是一个公共的页面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%> <table style="height: 35px" > <tr> <td nowrap="nowrap" style="width: 6%"> <td nowrap="nowrap" style="width: 43%"><span style="color: white" >共 <c:choose> <c:when test="${view.totalRecords==0}"><font color="#df625c">0</font> </c:when> <c:otherwise> ${view.totalRecords } </c:otherwise> </c:choose> 条记录, 当前第<font color="#46bbfe"> <c:choose> <c:when test="${view.totalPages==0 }">0</c:when> <c:otherwise> ${view.currentPage} </c:otherwise> </c:choose></font> / ${view.totalPages}页 </span></td> <td nowrap="nowrap" style="display: none"> <!-- 首页,view.currentPage的值为1 --> <td colspan="9"><span> <c:choose> <c:when test="${view.currentPage<=1}">首页</c:when> <c:otherwise> <a href="javascript:toPageFirst(${param.action})">首页</a> </c:otherwise> </c:choose> <c:choose> <c:when test="${view.currentPage<=1}">上一页</c:when> <c:otherwise> <a href="javascript:toPagePre(${param.action})">上一页</a> </c:otherwise> </c:choose> <c:choose> <c:when test="${view.currentPage>=view.totalPages }">下一页</c:when> <c:otherwise> <a href="javascript:toPageNext(${param.action})">下一页</a> </c:otherwise> </c:choose> <c:choose> <c:when test="${view.currentPage>=view.totalPages}">尾页</c:when> <c:otherwise> <a href="javascript:toPageLast(${param.action})">尾页</a> </c:otherwise> </c:choose> <strong>转</strong> <c:choose> <c:when test="${view.totalPages==0 }"> <input type="text" id="view.currentPage" name="currentPage" value="0" /> </c:when> <c:otherwise> <input type="text" id="view.currentPage" name="currentPage" value="${view.currentPage }" /> </c:otherwise> </c:choose> <strong> 页</strong> <a href="javascript:toPageGo(${param.action})">GO</a> </span> <input type="hidden" id="view.thisPage" value="${view.currentPage }" /> <input type="hidden" id="view.totalPages" name="totalPages" value="${view.totalPages }"> <input type="hidden" id="view.ascDesc" name="ascDesc" value="${view.ascDesc }"> <input type="hidden" id="view.sortKey" name="sortKey" value="${view.sortKey }"></td> </tr> </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构建
大家可以提出自己的方案,多谢!!!
相关推荐
### Java Web 分页设计知识点详解 #### 一、分页设计概述 在Java Web开发中,当需要展示大量数据时,通常会采用分页技术来提高用户体验和减轻服务器负担。分页可以有效地控制每次加载的数据量,使得用户界面更加...
Java 分页原理详解 Java 中的分页技术是指在查询大量数据时,为了提高性能和用户体验,将数据分成多页展示的技术。这种技术广泛应用于各种 Java 项目中,例如 Web 应用程序、移动应用程序等。 在 Java 中,常用的...
在Java开发中,分页是前端与后台交互时不可或缺的一部分,尤其在处理大量数据时,分页能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢或者内存溢出。本篇将详细介绍Java中实现前端通用分页的方法和...
标题提到的“好用的JAVA WEB分页中间件,比mybatis内置的分页好用”,指的是PageHelper,这是一个在MyBatis框架上扩展的分页插件,提供了强大的分页功能,并且比MyBatis原生的分页更加灵活和高效。 PageHelper插件...
【Java-Web-Mysql 分页实现详解】 在Java Web开发中,当数据量较大时,为了提高用户体验,通常会采用分页的方式来展示数据。本示例"java-web-mysql 分页demo"提供了一个完整的Java Web应用程序,它结合了MySQL...
根据提供的文件信息,我们可以深入探讨Java分页技术的相关知识点,特别是Struts框架中的分页实现。下面将详细介绍分页的基本概念、Struts框架中的分页处理方式以及如何使用自定义的`PageController`类来实现分页功能...
### Java Web 分页技术详解 #### 一、引言 在Java Web开发中,...通过上述内容的学习,开发者可以更好地理解和掌握Java Web分页技术,并将其应用于实际项目中。希望这些知识能够帮助到正在学习Java Web开发的朋友。
在Java Web开发中,实现分页功能通常涉及前端页面(JSP)和后端代码(Java)的协同工作。而这里提到的Eclipse、Struts、Hibernate则是Java开发中常用的工具和框架,分别用于集成开发环境、MVC模式的Web层框架和对象...
### Java Web分页技术详解 在Java Web开发中,分页技术是提升用户体验、优化数据库查询性能的关键技术之一。本文将深入探讨如何在JSP页面上实现简单的分页功能,重点在于SQL语句的处理与优化。 #### 分页概念与...
在Java开发中,分页是处理大量数据时常用的技术之一,尤其在Web应用中,为了提升用户体验和系统性能,分页技术被广泛应用。本文将基于提供的文件信息,深入解析Java中实现分页的多种方法,并重点阐述Struts框架下...
【个人博客 Java Web 开发详解】 在互联网时代,拥有一个属于自己的个人博客是展示自我、分享知识和技术的理想平台。本文将深入探讨如何使用Java Web技术栈来构建一个个人博客系统,特别关注在MyEclipse集成开发...
java web 手写实现分页功能详解 Java web 开发中,分页功能是非常常见的需求之一。现在很多流行的框架都可以很快地实现分页效果,但是作为一名程序员,掌握手写分页的流程是非常重要的。本文将详细介绍 java web ...
在Java开发中,特别是在Web应用中,分页功能是数据展示中不可或缺的一部分。合理的分页不仅能够提升用户体验,还能优化服务器性能,避免一次性加载大量数据导致的延迟和资源消耗。下面,我们将深入探讨一个Java通用...
#### Java代码详解 ##### 类定义:PageBean ```java public class PageBean { // 当前页,默认为1 private int currentPage = 1; // 总页数 public int totalPages = 0; // 每页显示的记录数 private ...
1. **JSP (JavaServer Pages)**:是一种基于Java技术的服务器端脚本语言,用于动态网页的生成。在JSP页面中可以嵌入Java代码,实现逻辑处理。 2. **MYSQL**:是一款关系型数据库管理系统,广泛应用于Web应用程序的...
Java分页是Web开发中的重要组成部分,通过合理的设计和实现,可以有效地处理大数据量的显示问题。理解并掌握各种分页方式和最佳实践,有助于提升Java应用的性能和用户体验。在“pagebean”这个具体实例中,学习和...
### Java分页设计详解 #### 一、引言 在Java Web开发中,为了提高用户体验并减轻服务器压力,分页技术被广泛应用。本篇文章将详细介绍Java分页技术的基本原理、实现方法及其应用场景,并通过示例代码展示如何在...
【Java分页实现详解】 在Java开发中,分页是一种常见的功能,用于处理大量数据时,提高用户体验,避免一次性加载所有数据导致的性能问题。本文将深入解析标题为"最好用的分页代码(java版)"的实现,探讨如何在Java...