`
wiley
  • 浏览: 254359 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

WEB分页技术

阅读更多
百事通信息网


web应用开发中,分页是一项很重要的技术,分页效率直接影响web应用程序的性能.当然分页除了高效,还得考虑通用性.
昨天在网上花了一天时间研究分页,今天一早就动手将自已以前的分页程序重新设计.
这里我将源代码贴出来供大家讨论,希望大家提出宝贵意见
首先封装Page类
import java.util.List;
public class Page {
 private boolean hasPrevPage;//是否存在上一页
 private boolean hasNextPage;//是否存在下一页
 
 private int pageSize;//每页容量
 private int totalPage;//总页数
 private int totalRow;//总记录数
 private int curPage;//当前页
 private int beginIndex;//当前页开始索引号
 
 private String url;//该页URL地址
 private String param;//参数以&分隔
 private String pageToolBar;//分页工具条
  
 private List result;//当前页结果集(记录集)
 
 /**
  * 功能:初始化数据(查询前)
  * @param pageSize
  * @param url
  * @param param
  */
 public Page(int pageSize,String url,String param) {
  this.pageSize=pageSize;
  this.url=(null==url)?"":url;
  this.param=(null==param)?"":param;
 }
 /**
  * 功能:初始化数据(查询后)
  * @param hasPrevPage
  * @param hasNextPage
  * @param pageSize
  * @param totalPage
  * @param totalRow
  * @param curPage
  * @param beginIndex
  * @param pageToolBar
  */
 public Page(boolean hasPrevPage, boolean hasNextPage,int pageSize, int totalPage, int totalRow,int curPage, int beginIndex,String pageToolBar){
  this.hasPrevPage=hasPrevPage;
  this.hasNextPage=hasNextPage;
  this.pageSize=pageSize;
  this.totalPage=totalPage;
  this.totalRow=totalRow;
  this.curPage=curPage;
  this.beginIndex=beginIndex;
  this.pageToolBar=pageToolBar;
 }
 
 public List getResult() {
  return result;
 }
 public void setResult(List result) {
  this.result = result;
 }
 public int getBeginIndex() {
  return beginIndex;
 }
 public void setBeginIndex(int beginIndex) {
  this.beginIndex = beginIndex;
 }
 public int getCurPage() {
  return curPage;
 }
 public void setCurPage(int curPage) {
  this.curPage = curPage;
 }
 public boolean isHasNextPage() {
  return hasNextPage;
 }
 public void setHasNextPage(boolean hasNextPage) {
  this.hasNextPage = hasNextPage;
 }
 public boolean isHasPrevPage() {
  return hasPrevPage;
 }
 public void setHasPrevPage(boolean hasPrevPage) {
  this.hasPrevPage = hasPrevPage;
 }
 public int getTotalPage() {
  return totalPage;
 }
 public void setTotalPage(int totalPage) {
  this.totalPage = totalPage;
 }
 public int getTotalRow() {
  return totalRow;
 }
 public void setTotalRow(int totalRow) {
  this.totalRow = totalRow;
 }
 public int getPageSize() {
  return pageSize;
 }
 public void setPageSize(int pageSize) {
  this.pageSize = pageSize;
 }
 public String getPageToolBar() {
  return pageToolBar;
 }
 public void setPageToolBar(String pageToolBar) {
  this.pageToolBar = pageToolBar;
 }
 
 public String getParam() {
  return param;
 }
 public void setParam(String param) {
  this.param = param;
 }
 
 public String getUrl() {
  return url;
 }
 public void setUrl(String url) {
  this.url = url;
 }
}

建PageUtil类,用来构告Page类的数据
public class PageUtil {
 private final static int DEF_PAGE_SIZE = 10;//默认当前页的容量
 /**
  * 功能:传入查询前初始化的page实例,创建一个新的Page实例
  * @param page
  * @param totalRow
  * @return
  */
 public static Page createPage(Page page, int totalRow) {
  return createPage(page.getUrl(),page.getParam(),page.getPageSize(), page.getCurPage(), totalRow);
 }
 public static Page createPage(String url,String param,int pageSize, int curPage, int totalRow) {
  pageSize = getpageSize(pageSize);
  curPage = getcurPage(curPage);
  int beginIndex = getBeginIndex(pageSize, curPage);
  int totalPage = getTotalPage(pageSize, totalRow);
  boolean hasNextPage = hasNextPage(curPage, totalPage);
  boolean hasPrePage = hasPrePage(curPage);
  String pageToolBar=getPageToolBar(url,param,hasPrePage, hasNextPage, pageSize, totalPage, totalRow,curPage);
  return new Page(hasPrePage, hasNextPage, pageSize, totalPage, totalRow,
    curPage, beginIndex,pageToolBar);
 }
 private static String getPageToolBar(String url,String param,boolean hasPrePage, boolean hasNextPage, int pageSize, int totalPage, int totalRow,int curPage){
  StringBuffer strBuf=new StringBuffer();
  
  boolean isHaveParam=false;
  
  if(null!=param && !"".equals(param)){
   isHaveParam = true;
  }
 
  strBuf.append("当前第"+curPage+"页/共"+totalPage+"页  总记录"+totalRow+"条");
  if(hasPrePage){
   strBuf.append("  <a href=\""+url+"?page=1"+((isHaveParam)?"&"+param:"")+"\">首页</a>");
   strBuf.append("  <a href=\""+url+"?page="+(curPage - 1)+((isHaveParam)?"&"+param:"")+"\">上一页</a>");
  }else{
   strBuf.append("  首页  上一页");
  }
  if(hasNextPage){
   strBuf.append("  <a href=\""+url+"?page="+(curPage + 1)+((isHaveParam)?"&"+param:"")+"\">下一页</a>");
   strBuf.append("  <a href=\""+url+"?page="+totalPage+((isHaveParam)?"&"+param:"")+"\">尾页</a>");
  }else{
   strBuf.append("  下一页  尾页");
  }
  return strBuf.toString();
 }
 
 private static int getpageSize(int pageSize) {
  return pageSize == 0 ? DEF_PAGE_SIZE : pageSize;
 }
 private static int getcurPage(int curPage) {
  return curPage == 0 ? 1 : curPage;
 }
 private static int getBeginIndex(int pageSize, int curPage) {
  return (curPage - 1) * pageSize;
 }
 private static int getTotalPage(int pageSize, int totalRow) {
  int totalPage = 0;
  if (totalRow % pageSize == 0)
   totalPage = totalRow / pageSize;
  else
   totalPage = totalRow / pageSize + 1;
  return totalPage;
 }
 private static boolean hasPrePage(int curPage) {
  return curPage == 1 ? false : true;
 }
 private static boolean hasNextPage(int curPage, int totalPage) {
  return curPage == totalPage || totalPage == 0 ? false : true;
 }
}

以上二个类与业务层无关,接下来结合业务层应用,给出以下代码
用户操作业务的接口:
import com.note.comm.Page;
import com.note.dao.UsersDAO;
import com.note.model.Users;
public interface IUserService {
 public UsersDAO getUsersDao();
 public void setUsersDao(UsersDAO usersDao);
 
 ......
 
 /**
  * 功能:得到当前页的分页信息与当前页的记录集(存入在page的result属性中)
  * @param page
  * @return
  */
 public Page listUsers(Page page);
 
 ......
}

用户操作业务的具体实现:
UserService
import java.util.List;
import com.note.bussies.service.IUserService;
import com.note.comm.Page;
import com.note.comm.PageUtil;
import com.note.dao.UsersDAO;
import com.note.model.Users;
public class UserService implements IUserService {
 private UsersDAO usersDao;
 public UsersDAO getUsersDao() {
  return usersDao;
 }
 public void setUsersDao(UsersDAO usersDao) {
  this.usersDao = usersDao;
 }
 ......
 
 public Page listUsers(Page page){
  int totalRecords = this.usersDao.getUserCount();
         page = PageUtil.createPage(page, totalRecords);
         if(totalRecords == 0)return page;
         List users = this.usersDao.getUsersByPage(page);
         page.setResult(users);
  return page;
 }
}

UserService调用UserDao的方法实现分页,UserDao代码如下:
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.note.comm.Page;
import com.note.model.Users;
/**
 * Data access object (DAO) for domain model class Users.
 * @see com.note.dao.Users
 * @author MyEclipse - Hibernate Tools
 */
public class UsersDAO extends HibernateDaoSupport {
    private static final Log log = LogFactory.getLog(UsersDAO.class);
 //property constants
 public static final String USERNAME = "username";
 public static final String PASSWORD = "password";
 public static final String LEVEL = "level";
 protected void initDao() {
  //do nothing
 }
     
 ......
    
 public int getUserCount(){
         int count = 0;
         String querySentence = "SELECT count(*) FROM Users";
         Session s=getSession();
         Query query = s.createQuery(querySentence);
         count = ((Integer)query.iterate().next()).intValue();
         releaseSession(s);//注意,些处必须关闭Session
         return count;
   }
 
 public List getUsersByPage(final Page page){
  return getHibernateTemplate().executeFind(new HibernateCallback() {
   public Object doInHibernate(Session s){
    Query query=s.createQuery("From Users AS users ORDER BY users.userid");
    query.setFirstResult(page.getBeginIndex());
    query.setMaxResults(page.getPageSize());
    return query.list();
   }
  });
 }
}

至此,一个完整的分页程序完成。下页给出Struts调用示例

action类:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.apache.struts.actions.DispatchAction;
import com.note.bussies.service.IUserService;
import com.note.comm.Page;
import com.note.comm.ParamUtil;
import com.note.model.Users;
import com.note.sys.Constant;
 
/** 
 * MyEclipse Struts
 * Creation date: 10-09-2006
 * 
 * XDoclet definition:
 * @struts.action path="/user" name="userForm" input="/form/user.jsp" scope="request"
 * @struts.action-forward name="success" path="/success.htm" redirect="false"
 * @struts.action-forward name="fail" path="/fail.htm" redirect="false"
 */
public class UserAction extends DispatchAction {
 private IUserService ius;
 
 public IUserService getIus() {
  return ius;
 }
 public void setIus(IUserService ius) {
  this.ius = ius;
 }
 
 public ActionForward display(ActionMapping mapping, ActionForm form,
   HttpServletRequest request, HttpServletResponse response) {
  
  //获得url
  String contextPath = request.getContextPath();
  String PathName="listUser" + Constant.FILEPREFIX;
  String url=contextPath+"/"+PathName;
  //获得参数
  int curPage = ParamUtil.getInt(request, "page", 1);
  String method=ParamUtil.getString(request, "method", "display");
  String param="method="+method;
 
  Page page=new Page(3,url,param);
  page.setCurPage(curPage);
  page=this.ius.listUsers(page);
  request.setAttribute("users",page);//保存到request中
  return mapping.findForward("success");
 }
}

view页面:
 <logic:present name="users">
  <table>
   <logic:iterate id="user" name="users" indexId="number" property="result">
    <tr>
     <td>
      <bean:write name="number" />
      <bean:write name="user" property="userid" />
      <bean:write name="user" property="username" />
     </td>
    </tr>
   </logic:iterate>
  </table>
  <bean:write name="users" property="pageToolBar" filter="false" />
 </logic:present>

以上代码参考了downpour跟水如清二位仁兄的设计思想,特些声明.
分享到:
评论
1 楼 19122273 2008-10-11  
可以把完整的例子发我邮箱19122273@qq.com么 谢谢了

相关推荐

    Java web 分页技术

    Java Web分页技术是Web应用程序中常用的一种数据展示方式,它允许用户逐步浏览大量的数据集合,而不会一次性加载所有数据,从而提高页面加载速度和用户体验。Struts2作为一款流行的MVC框架,提供了实现分页功能的...

    基于Java-Web的分页技术研究.pdf

    文章通过对Java-Web分页技术的研究,为开发者提供了一种有效管理大量数据和提升用户体验的解决方案。分页技术不仅提高了信息检索的效率,还通过合理管理数据存储、优化查询效率和确保数据的正确显示,确保了系统在...

    Java Web分页技术与实现.pdf

    "Java Web分页技术与实现" Java Web分页技术是指在Java Web应用中对显示的数据进行分页显示,以提高用户体验和系统性能。分页技术可以在Web服务器中或数据库服务器中实现。 在Web服务器中实现分页可以利用...

    java web分页技术

    Java Web分页技术是网页应用开发中不可或缺的一部分,主要用于处理大量数据查询时的展示问题。在JSP(Java Server Pages)开发中,分页技术能够有效地提高系统性能,提升用户体验。下面将详细介绍分页的基本概念、...

    基于Mootools库的Web分页技术实现.doc

    以下是对基于Mootools库的Web分页技术的详细解释。 1. **Web分页原理** Web分页主要涉及如何在用户界面上有效地显示大量数据。传统的分页方案通常在数据库或Web服务器端进行,但这可能导致不必要的数据传输和延迟...

    Java_Web分页技术

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

    基于Mootools库的Web分页技术实现的论文-计算机应用论文.docx

    基于Mootools库的Web分页技术实现的论文-计算机应用论文.docx

    大工论文 基于Web的分页技术的研究与实现.docx

    基于Web的分页技术的研究与实现 在当今的信息时代,网络已经成为我们生活中不可或缺的一部分,而网页则成为我们获取信息的主要来源。当我们在浏览网页时,不可避免地会碰到有的数据不能在一个页面完全显示出来的...

    web分页技术

    **网页分页技术详解** 网页分页是一种常见的数据展示策略,尤其在大数据量的场景下,如电商的商品列表、社交网络的动态流等。通过分页,用户可以逐步浏览大量信息,而不会一次性加载所有内容,这提高了网页的加载...

    基于-Web的分页技术的研究和实现.doc

    综上所述,Web分页技术是Web应用中的关键组成部分,它涉及到HTML、Java、数据库技术和脚本语言的综合运用。选择合适的技术栈并合理实现分页,对于提升Web应用的性能和用户体验至关重要。随着Web技术的不断发展,分页...

    10种 js web分页效果

    在Web页面中,当数据量过大时,为了提高用户体验和加载速度,通常会采用分页技术来展示内容。本教程将深入探讨10种不同的JS Web分页效果,这些效果设计精良,适用于现代网站的需求。 1. **基础分页**:这是最简单的...

    Web分页控件例子Demo

    "Web分页控件例子Demo"是一个示例项目,旨在展示如何在网页应用中实现高效且用户友好的分页功能。下面我们将深入探讨Web分页控件的相关知识点,并结合给出的文件名进行分析。 1. **分页的基本概念**: 分页是将...

    java_web_分页

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

    web实现简单分页

    实现Web分页的方法有很多,包括使用服务器端分页和客户端分页。服务器端分页意味着每次用户切换页面时,服务器都会根据请求的页码和每页记录数返回对应的数据。而客户端分页则是在前端JavaScript中完成,通常利用...

    javaweb分页技术详解及代码.pdf

    Java Web分页技术是开发Web应用时不可或缺的一部分,特别是在处理大量数据展示时,为了提高用户体验,通常需要将数据分页显示。本篇将详细介绍Java Web中的分页技术和代码实现。 一、分页技术概述 在Java Web开发...

    简单web分页实现

    本篇文章将深入探讨“简单web分页实现”的概念、原理以及实现方法。 首先,我们要理解分页的基本原理。分页通常涉及到两个主要方面:前端显示和后端数据处理。前端负责展示页面上的导航元素(如页码),并根据用户...

Global site tag (gtag.js) - Google Analytics