`

java web 分页详解1

阅读更多

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

 

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

  • 大小: 102.4 KB
  • 大小: 104.7 KB
  • 大小: 6.7 KB
  • 大小: 10.4 KB
  • 大小: 94 KB
  • 大小: 92.5 KB
分享到:
评论
1 楼 hw1287789687 2014-09-07  
http://hw1287789687.iteye.com/blog/2114022

相关推荐

    java web 分页 设计

    ### Java Web 分页设计知识点详解 #### 一、分页设计概述 在Java Web开发中,当需要展示大量数据时,通常会采用分页技术来提高用户体验和减轻服务器负担。分页可以有效地控制每次加载的数据量,使得用户界面更加...

    java分页原理详解

    Java 分页原理详解 Java 中的分页技术是指在查询大量数据时,为了提高性能和用户体验,将数据分成多页展示的技术。这种技术广泛应用于各种 Java 项目中,例如 Web 应用程序、移动应用程序等。 在 Java 中,常用的...

    前台Java通用分页详解描述下

    在Java开发中,分页是前端与后台交互时不可或缺的一部分,尤其在处理大量数据时,分页能够有效地提高用户体验,避免一次性加载过多数据导致页面响应慢或者内存溢出。本篇将详细介绍Java中实现前端通用分页的方法和...

    好用的JAVA WEB分页中间件,比mybatis内置的分页好用.zip

    标题提到的“好用的JAVA WEB分页中间件,比mybatis内置的分页好用”,指的是PageHelper,这是一个在MyBatis框架上扩展的分页插件,提供了强大的分页功能,并且比MyBatis原生的分页更加灵活和高效。 PageHelper插件...

    java-web-mysql 分页demo

    【Java-Web-Mysql 分页实现详解】 在Java Web开发中,当数据量较大时,为了提高用户体验,通常会采用分页的方式来展示数据。本示例"java-web-mysql 分页demo"提供了一个完整的Java Web应用程序,它结合了MySQL...

    JAVA分页大全.txt

    根据提供的文件信息,我们可以深入探讨Java分页技术的相关知识点,特别是Struts框架中的分页实现。下面将详细介绍分页的基本概念、Struts框架中的分页处理方式以及如何使用自定义的`PageController`类来实现分页功能...

    java_web_分页

    ### Java Web 分页技术详解 #### 一、引言 在Java Web开发中,...通过上述内容的学习,开发者可以更好地理解和掌握Java Web分页技术,并将其应用于实际项目中。希望这些知识能够帮助到正在学习Java Web开发的朋友。

    分页功能实现java

    在Java Web开发中,实现分页功能通常涉及前端页面(JSP)和后端代码(Java)的协同工作。而这里提到的Eclipse、Struts、Hibernate则是Java开发中常用的工具和框架,分别用于集成开发环境、MVC模式的Web层框架和对象...

    Java_Web分页技术

    ### Java Web分页技术详解 在Java Web开发中,分页技术是提升用户体验、优化数据库查询性能的关键技术之一。本文将深入探讨如何在JSP页面上实现简单的分页功能,重点在于SQL语句的处理与优化。 #### 分页概念与...

    java多种分页实现

    在Java开发中,分页是处理大量数据时常用的技术之一,尤其在Web应用中,为了提升用户体验和系统性能,分页技术被广泛应用。本文将基于提供的文件信息,深入解析Java中实现分页的多种方法,并重点阐述Struts框架下...

    个人博客 java web

    【个人博客 Java Web 开发详解】 在互联网时代,拥有一个属于自己的个人博客是展示自我、分享知识和技术的理想平台。本文将深入探讨如何使用Java Web技术栈来构建一个个人博客系统,特别关注在MyEclipse集成开发...

    java web手写实现分页功能

    java web 手写实现分页功能详解 Java web 开发中,分页功能是非常常见的需求之一。现在很多流行的框架都可以很快地实现分页效果,但是作为一名程序员,掌握手写分页的流程是非常重要的。本文将详细介绍 java web ...

    java一个通用的分页方法

    在Java开发中,特别是在Web应用中,分页功能是数据展示中不可或缺的一部分。合理的分页不仅能够提升用户体验,还能优化服务器性能,避免一次性加载大量数据导致的延迟和资源消耗。下面,我们将深入探讨一个Java通用...

    分页算法java实现

    #### Java代码详解 ##### 类定义:PageBean ```java public class PageBean { // 当前页,默认为1 private int currentPage = 1; // 总页数 public int totalPages = 0; // 每页显示的记录数 private ...

    JSP+MYSQL+Java类优化分页的实例

    1. **JSP (JavaServer Pages)**:是一种基于Java技术的服务器端脚本语言,用于动态网页的生成。在JSP页面中可以嵌入Java代码,实现逻辑处理。 2. **MYSQL**:是一款关系型数据库管理系统,广泛应用于Web应用程序的...

    java 分页源码

    Java分页是Web开发中的重要组成部分,通过合理的设计和实现,可以有效地处理大数据量的显示问题。理解并掌握各种分页方式和最佳实践,有助于提升Java应用的性能和用户体验。在“pagebean”这个具体实例中,学习和...

    java分页设计

    ### Java分页设计详解 #### 一、引言 在Java Web开发中,为了提高用户体验并减轻服务器压力,分页技术被广泛应用。本篇文章将详细介绍Java分页技术的基本原理、实现方法及其应用场景,并通过示例代码展示如何在...

    最好用的分页代码(java版)

    【Java分页实现详解】 在Java开发中,分页是一种常见的功能,用于处理大量数据时,提高用户体验,避免一次性加载所有数据导致的性能问题。本文将深入解析标题为"最好用的分页代码(java版)"的实现,探讨如何在Java...

Global site tag (gtag.js) - Google Analytics