`

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

 
阅读更多
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>
 在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(intPageNothis.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(intPageNothis.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></paravalues.size>{
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></paravalues.size>{
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></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



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=641237


分享到:
评论

相关推荐

    easyjweb1.2

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

    EasyJWeb实用开发指南——开始EasyJWeb

    EasyJWeb实用开发指南——开始EasyJWeb

    easyjweb 开发文档

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

    简易Web框架EasyJWeb源码

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

    EasyJWEB2.0

    EasyJWeb是基于java技术,用于实现企业级Java Web应用程序快速开发框架。框架由来自国内的EasyJF开源团队维护,是一个完全由来自的中国开源爱好者开发,文档及注释全部为中文的开源框架。

    EasyJWeb开发指南

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

    EasyJWeb快速入门指南

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

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

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

    easyjweb-2.0快速开发

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

    EasyJWeb开发者指南

    EasyJWeb中的验证 21 实现自己的验证器 22 验证错误获彼此 23 EasyJWeb的错误处理 24 工具类 24 CommUtil 25 分页 25 tagUtil 26 验证码 26 容器部分 28 EasyJWeb的容器 28 IoC 28 EasyJWeb中的容器 28 集成其他容器...

    EasyJWeb入门手册

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

    EasyJWeb框架0.7.0

    EasyJWeb框架0.7.0

    EasyJWeb源码构建指南

    目前EasyJWeb已经采用国际水准的项目管理工具——Maven。Maven是一个功能强大的项目管理工具,在此处不做过多介绍,有兴趣的可以阅读Maven官方文档。 首先要确保你的计算机上已经安装了Maven2.0.5以上版本,如果还...

    配置easyjweb项目

    配置easyjweb项目 ,要用到的细节,免于发生不必要的错误

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

    描述了MVC设计模式和EasyJWeb框架的组成和工作原理,然后通过一个客户管理系统实例论述了基于MVC模式EasyJWeb框架的Web应用系统的实现方法。通过实例论述了基于EasyJWeb框架开发的Web应用系统可获得较高的效率性、可...

    easyjweb说明文档

    easyjweb说明文档

    easyjweb-1.1

    一个轻量级的J2EE框架

    Easyjweb 1.2.2

    类似于struts的开发框架,但开发效率却是struts的N倍。这是2010年01月15日发布出来的最新的版本。

    EasyJWeb-Velocity脚本简明教程

    EasyJWeb-Velocity脚本简明教程

Global site tag (gtag.js) - Google Analytics