`
icheng
  • 浏览: 881985 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

EasyJWeb Tools业务引擎中分页的设计及实现

 
阅读更多
在Web应用开发中,不管是有没有数据库,经常要用到分页处理问题。EasyJWeb中通过引入IPageList接口来轻松解决我们的遇到的各种分页问题,包括对数据库记录分页、文件目录分页、数组或者Java对象分页等。

  EasyJWeb作为一个Web框架,其MVC核心中本身没有包含分页的内容,我们这里所说的分页设计是指在EasyJWebTools业务引擎中关于分页需求应用的设计。

  1、应用示例代码

  首先们看看该分页设计的有关应用示例代码,该示例的完整代码可在http://www.easyjf.com/download.htm中下载!

  示例代码A:com.easyjweb.action.userManageAction.java

  这是EasyJWeb文档中示例3(添删改查)中有关记录分页显示的部分代码:
publicclassuserManageActionextendsAbstractCrudAction{
  publicIPageListdoQuery(WebFormform,intcurrentPage,intpageSize){
....

DbPageListpList=newDbPageList(User.class,scope,paras);//通过调用DbPageList对象,返回分页结果IPageList
pList.doList(currentPage,pageSize);
returnpList;
}
...

  从代码中我们可以看出,这是一个对数库记录集对象的分页处理例子。直接通实现了IPageList接口的DbPageList类实现数据库的分页。


  示例代码B:net.meybo.mail.action.EmailAction.java

  这是MeyboMailWeb邮件客户端开源简化版中,中对邮件主题进行分页显示的代码。
  publicclassEmailActionimplementsIWebAction{
...
  privatePagedoList(WebFormform,Modulemodule,ActiveUseruser)
{
  ...
  Listlist=null;
  ...
list=EmailManage.getMailList(user.getUserName(),user.getServerDomain(),boxName);
  IPageListpList=newPageList(newListQuery(list));
if(pList!=null){
pList.doList(pageSize,currentPage,"","");
form.addResult("list",pList.getResult());
form.addResult("pages",newInteger(pList.getPages()));
form.addResult("rows",newInteger(pList.getRowCount()));
form.addResult("page",newInteger(pList.getCurrentPage()));
form.addResult("gotoPageHTML",CommUtil.showPageHtml(pList.getCurrentPage(),pList.getPages()));
}
  ...

  上面例子中是对一个List集合进行分页,因为MeyboMailWeb中没有用到数据库,所以使用ListQuery查询处理器进行处理。

   

2、EasyJWebTools中业务引擎中有关分页的接口及类

  EasyJWebTools中通过使用IPageList及IQuery两个接口对分页问题进行抽象。
  下面是IPageList接口的全部代码:
  
packagecom.easyjf.web.tools;
importjava.util.Collection;
importjava.util.List;
publicinterfaceIPageList{
publicListgetResult();//取回分页的结果
publicvoidsetQuery(IQueryq);//设置查询处理器
publicintgetPages();//返回总页数
publicintgetRowCount();//返回总记录数
publicintgetCurrentPage();//返回当前页
publicvoiddoList(intpageSize,intpageNo,StringtotalSQL,StringqueryHQL);//执行分页处理
publicvoiddoList(intpageSize,intpageNo,StringtotalSQL,StringqueryHQL,CollectionparaValues);//执行分页处理
}

  在IPageList中,我们看到通过设置查询处理器实现数据的查询及分页,这里我们在看看IQuery接口的内容:

  packagecom.easyjf.web.tools;
  importjava.util.Collection;
  importjava.util.List;
  publicinterfaceIQuery{
  intgetRows(Stringconditing);//得到总记录数
  ListgetResult(Stringconditing);//根据条件查询并返回结果
  voidsetFirstResult(intbegin);//设置开始记录
  voidsetMaxResults(intmax);//设置每次查询返回的最大记录
  voidsetParaValues(CollectionparaValues);//设置查询参数值
  ListgetResult(Stringconditing,intbegin,intmax);//从结果集中begin开始的位置,取max条记录
  }

  由此可见,我们的IPageList其实是通过设置调用不同的查询处理器实现对不同类型数据来进行分页处理的。


3、通用分页处理IPageList的实现PageList类
  在EasyJWebTools中,我们的PageList类实现了IPageList接口,其是一个通用的分页处理类,其它各种类型数据的分页可以通过继承它来实现。

  PageList.java的全部代码如下:

  packagecom.easyjf.web.tools;

importjava.util.*;
/**
*实现通过调用IQuery实现分页处理
*@author蔡世友
*
*/
publicclassPageListimplementsIPageList{
privateintrowCount;//记录数
privateintpages;//总页数
privateintcurrentPage;//实际页数
privateListresult;
privateIQueryquery;
publicPageList()
{

}
publicPageList(IQueryq)
{
this.query=q;
}
publicvoidsetQuery(IQueryq)
{
query=q;
}
publicListgetResult()
{
returnresult;
}

publicvoiddoList(intpageSize,intpageNo,StringtotalSQL,StringqueryHQL){
Listrs=null;
inttotal=query.getRows(totalSQL);
if(total>0){
this.rowCount=total;
this.pages=(this.rowCount+pageSize-1)/pageSize;//记算总页数
intintPageNo=(pageNo>this.pages?this.pages:pageNo);
if(intPageNo<1)intPageNo=1;
this.currentPage=intPageNo;
if(pageSize>0){
query.setFirstResult((intPageNo-1)*pageSize);
query.setMaxResults(pageSize);
}
rs=query.getResult(queryHQL);
}
result=rs;
}
publicvoiddoList(intpageSize,intpageNo,StringtotalSQL,StringqueryHQL,CollectionparaValues){
Listrs=null;
query.setParaValues(paraValues);
inttotal=query.getRows(totalSQL);
if(total>0){
this.rowCount=total;
this.pages=(this.rowCount+pageSize-1)/pageSize;//记算总页数
intintPageNo=(pageNo>this.pages?this.pages:pageNo);
if(intPageNo<1)intPageNo=1;
this.currentPage=intPageNo;
if(pageSize>0){
query.setFirstResult((intPageNo-1)*pageSize);
query.setMaxResults(pageSize);
}
rs=query.getResult(queryHQL);
}
result=rs;
}
publicintgetPages(){
returnpages;
}
publicintgetRowCount(){
returnrowCount;
}
publicintgetCurrentPage(){
returncurrentPage;
}
}



4、使用Hibernate访问数据库时的IQuery接口实现
  这是EasyJF网站后台中,使用Hibernate中间件对数据库访问时候,其对应查询处理器IQuery接口的实现。

  DbQuery.java的全部代码:

packagecom.easyjf.comm;

importjava.util.Collection;
importjava.util.List;

importorg.hibernate.Query;
importorg.hibernate.Session;
importcom.easyjf.web.tools.IQuery;
publicclassDbQueryimplementsIQuery{
privateSessionsession;
privateintbegin;
privateintmax;
privateListparaValues;
publicDbQuery(Sessionsession)
{
this.session=session;
}

publicvoidsetParaValues(CollectionparaValues){
this.paraValues=(List)paraValues;
//System.out.println("参数":paraValues.size();)
}

publicintgetRows(Stringconditing){
Queryquery1=session.createQuery(conditing);
if(paraValues!=null){
for(inti=0;i<paraValues.size();i++)
{
query1.setParameter(i,paraValues.get(i));

}
}
inttotal=((Integer)query1.uniqueResult()).intValue();
returntotal;
}

publicListgetResult(Stringconditing){
Queryquery=session.createQuery(conditing);
if(paraValues!=null){
for(inti=0;i<paraValues.size();i++)
{
query.setParameter(i,paraValues.get(i));
}
}
if(begin>0)query.setFirstResult(begin);
if(max>0)query.setMaxResults(max);
returnquery.list();
}

publicvoidsetFirstResult(intbegin){
this.begin=begin;
}

publicvoidsetMaxResults(intmax){
this.max=max;
}

publicListgetResult(Stringconditing,intbegin,intmax){
Queryquery=session.createQuery(conditing);
if(begin>0)query.setFirstResult(begin);
if(max>0)query.setMaxResults(max);
returnquery.list();
}
publicvoidsetParaValues(ListparaValues){
this.paraValues=paraValues;
}
}

5、对于List列表数据进行分页的查询处理器ListQuery实现

  当我们要分页的目标数据不是数据库记录,而是其它储存方式时(如文本、xml或者内存中的实时对象线程等),可以转化为数组或List等。这时可通过使用ListQuery查询处理器实现分页查询。

  ListQuery.java的全部代码:

packagecom.easyjf.web.tools;

importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.List;

publicclassListQueryimplementsIQuery{
privateintbegin=0;
privateintmax=0;
privateListlist=null;
publicListQuery()
{

}
publicListQuery(Listl)
{
if(l!=null){
this.list=l;
this.max=l.size();
}
}
publicvoidinitList(Listl)
{
this.list=l;
this.max=l.size();
}
publicintgetRows(Stringconditing){

return(list==null?0:list.size());
}

publicListgetResult(Stringconditing){
returnlist.subList(begin,begin+max>list.size()?list.size():begin+max);
}
publicvoidsetFirstResult(intbegin){
this.begin=list.size()<begin?list.size():begin;
}
publicvoidsetMaxResults(intmax){
this.max=max;
}
publicListgetResult(Stringconditing,intbegin,intmax){

returnlist;
}
publicvoidsetParaValues(CollectionparaValues){
//TODOAuto-generatedmethodstub
}
}

6、关于分页的算法讨论
  由于EasyJWebTools业务引擎是对众多分页需求的简单抽象。因此,无法对分页查询处理器的算法等作具体的限制,上面给出的两个查询处理器只是一个简单的应用实例,大家可以根据实际应用项目中的需求进行查询处理器的实现及算法设计。
  
  由于水平有限,该设计上有很多不合理的地方,恳请大家指正!


7、EasyJWeb简介

  EasyJWeb是基于java技术,应用于WEB应用程序快速开发的MVC框架,框架设计构思来源于国内众多项目实践,充分借签了当前主流的开源Web框架(Struts、JSF、Tapestry、Webwork等),吸取了其优点及精华,利用Velocity作为模板页面引擎,是一个实现了页面及代码完全分离的MVC开发框架,是一个旨在于为中小型Web应用系统提供快速开发实践的简易Web框架。

  EasyJF开源团队于2006年初才开始建设,因此当前整个开发团队组建以及所发布的作品,都显得极不成熟。EasyJWeb仍然处于测试阶段,请广大的Java爱好者多多批评及建议。同进也非常欢迎您能加入到我们的国产开源队伍中。

  EasyJWeb官方网址:www.easyjf.com
EasyJF团队官方网址:www.easyjf.com
分享到:
评论

相关推荐

    easyjweb1.2

    框架设计构思来源于国内众多项目实践,框架的设计及实现借鉴当前主要流行的开源Web框架,如Rails、Struts、JSF、Tapestry等,吸取其优点及精华,是一个完全由来自的中国开源爱好者开发,文档及注释全部为中文的开源...

    EasyJWeb快速入门指南

    - 设计域模型:根据业务需求设计合理的数据模型。 - 执行EasyJWebTools脚本:自动生成部分代码模板。 - 修改数据库配置:确保正确连接数据库。 - 打包并运行程序:部署并启动Web应用。 - **在IDE中深入开发**:...

    EasyJWEB2.0

    - **MVC架构**:遵循Model-View-Controller的设计模式,EasyJWeb 2.0 提供了清晰的业务逻辑、数据模型和用户界面分离,便于代码维护和扩展。 - **组件化开发**:通过模块化和组件化的方式,开发者可以快速构建可...

    Easyjweb 1.2.2

    1. MVC架构:Easyjweb基于Model-View-Controller(MVC)设计模式,这种模式将业务逻辑、数据和用户界面分离,使得代码更易于维护和扩展。它通过控制器处理HTTP请求,模型管理业务逻辑,视图负责展示结果。 2. 简化...

    easyjweb 开发文档

    2. **容器及通用业务逻辑封装**:EasyJWeb提供了Inversion of Control (IoC)容器,对常见的企业级业务逻辑如分页、查询和DAO进行了抽象和封装。这使得开发者能够直接操作和应用企业资源,简化了开发流程。 3. **...

    简易Web框架EasyJWeb源码

    EasyJWeb是基于Java技术,应用于WEB应用程序快速开发的MVC框架,框架设计构思来源于国内众多项目实践,框架充分借签了当前主要流行的开源Web框架(Struts、JSF、Tapestry 、Webwork),吸取了其优点及精华,利用...

    easyjweb-1.1

    1. **MVC模式**:EasyJWeb遵循MVC设计模式,将业务逻辑、用户界面和数据模型分离,提高了代码的可读性和可维护性。 2. **简单易用**:其API设计简洁,学习曲线平缓,使开发者能够快速上手。 3. **数据库支持**:内置...

    用easyjweb快速实现增删查改

    在IT行业中,开发Web应用程序是一项常见的任务,而EasyJWeb是一个强大的工具,它可以帮助开发者快速构建基于Java的企业级应用,尤其适用于实现基本的增删查改(CRUD)功能。EasyJWeb以其简单易用、高效的特点,深受...

    基于EasyJWeb框架和MVC模式的Web应用

    - **视图层**:采用Velocity模板引擎设计了客户信息的展示页面,如客户列表页、客户详情页等。 - **控制器层**:负责处理用户的请求,调用模型层的方法获取数据,并将数据传递给视图层进行展示。 2. **系统开发...

    wincvs、ajaxanywhere+struts示例+easyjweb指南

    **EasyJWeb**则是一个轻量级的Java Web开发框架,它的设计目标是简化Java Web应用的开发过程,提高开发效率。EasyJWeb通过提供简单的API和约定优于配置的方式,让开发者可以快速构建Web服务。它特别适合于小型到中型...

    EasyJWeb服务调度和自定义邮件引擎技术的CRM系统实战开发

    本课程以一个现实的CRM系统为原型,在对系统需求分析的基础上,对系统进行了设计并且实现。由于课程时间有限,对于CRM系统的功能只实现了一部分,但是已经涵盖了全部的CRM系统的技术点。 1.2、课程内容介绍 ...

    easyjweb 用户权限

    EasyJWeb是一款基于Java的轻量级Web开发框架,其在企业级应用中广泛使用,特别是在权限管理方面表现出色。本文将深入探讨EasyJWeb如何实现用户权限控制,以及相关的核心概念和技术点。 一、EasyJWeb权限体系概述 ...

    EasyJWeb简易教程pdf版

    - **用户注册与登录**:展示了如何使用EasyJWeb进行用户认证,包括用户模型的设计、业务逻辑的实现以及前端页面的展示等步骤。 - **CRUD操作**:通过一个简单的数据表操作示例(增删改查),介绍了如何利用EasyJWeb...

    EasyJWeb源码构建指南

    【EasyJWeb源码构建指南】是一篇关于如何构建和设置EasyJWeb开源项目的文章。EasyJWeb采用了Subversion(SVN)作为版本控制工具,而Maven作为项目管理工具,确保开发流程的标准化和高效性。 首先,你需要获取源代码...

    easyjweb-2.0快速开发

    easyjweb-2.0 java 快速开发 easyjweb-2.0 java 快速开发 easyjweb-2.0 java 快速开发

    EasyJWeb入门手册

    框架设计构思来源于国内众多项目实践,框架的设计及实现借鉴当前主要流行的开源Web框架(Rails、Struts、JSF、Tapestry),吸取其优点及精华,是一个完全由来自中国的开源爱好者开发、文档及注释全中文的开源框架。

    easyjweb初试--简单的say hello示例

    在IT行业中,EasyJWeb是一个轻量级的Java Web应用框架,主要用来简化Web应用程序的开发。本示例将引导我们逐步了解如何使用EasyJWeb创建一个简单的"Say Hello"应用,这通常是我们初次接触任何Web框架时都会做的经典...

Global site tag (gtag.js) - Google Analytics