论坛首页 Java企业应用论坛

Web应用中的“分页显示”究竟怎样进行到底?

浏览 9868 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-05-12  
在Web应用中,分页的讨论应该是最为我们所熟悉的。很多有经验的仁兄都慷慨的给出了自己的分页程序。

在此谨对IT界无私奉献的人们致敬!!!

但是给出的例子都是很简单(例子也许本来就是应该简单),在查询中并没有考虑参数的存在,例如:

session.createQuery(from A a);
            .setFirstResult(0);
            .setMaxsetMaxResults(10);;


在这个查询中并没有涉及到参数的传递问题,但是在实际的应用中我们往往需要传递一大把的参数,甚者参数可以是不确定的,例如:


session.createQuery(from A a ,B b where a.id=b.aid and a.x =? b.y=?);
            .setFirstResult(0);
            .setMaxsetMaxResults(10);;



如果我们在每次只提取当页数据的情况下,是否也应该考虑到我们的参数如何处理?是放在request URL中,还是隐藏表单,或者Session中?怎么样才能使我们的分页真正的解耦,通用。

期待大家的谈论、指导。。。。。。
   发表时间:2006-05-12  
使用自己定义的 Pagination 对象来保存分页指令信息。

利用java的传引用的特性,可以将page对象直接从form传递到dao,而且web层还可以根据page生成分页导航条。
开发者只需要构造简单的page,通过page对象的传递,可以很灵活的进行上页,下页,指定起始位置,指定分页大小的任意分页查询。


目前,我通过我封装的page和我自己的代码生成器,基本可以把90%的代码自动生成。重用度极高。


下面dao部分的代码就是自动生成的。当然从jsp到actionform,到action到service,全部也都可以自动生成。


  public List findBlogIssue(
      final java.lang.String blogNo,
      final java.util.Date addtime_begin,
      final java.util.Date addtime_end,
      final java.lang.String blogUserName,
      final java.lang.String blogContent,
      final Pagination page); {
    return (List);this.getHibernateTemplate();.execute(
        new HibernateCallback(); {
      public Object doInHibernate(Session session); throws SQLException,
          HibernateException {
        Criteria ca = session.createCriteria(BlogIssue.class);;
        if (blogNo != null && blogNo.length(); > 0); {
          ca.add(Expression.like("blogNo", blogNo, MatchMode.ANYWHERE););;
        }
        if (addtime_begin != null); {
          ca.add(Expression.ge("addtime", addtime_begin););;
        }
        if (addtime_end != null); {
          ca.add(Expression.le("addtime", addtime_end););;
        }
        if (blogUserName != null && blogUserName.length(); > 0); {
          ca.add(Expression.like("blogUserName", blogUserName););;
        }
        if (blogContent != null && blogContent.length(); > 0); {
          ca.add(Expression.like("blogContent", blogContent, MatchMode.ANYWHERE););;
        }
        if (page != null); {
          page.setTotalNum( ( (Integer); ca.setProjection(Projections.
              rowCount(););.uniqueResult(););.intValue(););; //在设置总记录数的时候,根据分页指令计算起始位置。
        }
        ca.setProjection(null);;
        if (page != null); {
          ca.setMaxResults(page.getPageSize(););;
          ca.setFirstResult(page.getStartIndex(););;
        }
        return ca.list();;
      }
    }, true);;
  }

0 请登录后投票
   发表时间:2006-05-12  
codeutil 老兄,你可以给出你的具体的思路吗?
你现在只给出了生成以后的代码,跟一般我们写的程序没有两样.具体点啊.

期望你的回复!
0 请登录后投票
   发表时间:2006-05-12  
web表单里:
  <html:hidden property="page.pageSize"/>
  <html:hidden property="page.pageAction"/>
  <html:hidden property="page.currentPage"/>


提交翻页查询的js:

<script type="text/javascript">
  function findByPage(action);
  {
    document.myActionForm['page.pageAction'].value=action;
    document.myActionForm.submit();;
  }

</script>



翻页导航条:

共${myActionForm.page.totalNum}条记录 页数:${myActionForm.page.currentPage}/${myActionForm.page.totalPage}

<c:if test="${!myActionForm.page.firstPage}">
 <a href="javascript:findByPage('first');">首页</a>
 <a href="javascript:findByPage('pre');">上页</a>
</c:if>
<c:if test="${!myActionForm.page.lastPage}">
 <a href="javascript:findByPage('next');">下页</a>
 <a href="javascript:findByPage('last');">末页</a>
</c:if>


MyActionForm.java


public class MyActionFormextends ValidatorForm {
    private Pagination pageBean = new Pagination();;//存放分页指令以及分页结果信息

    private  java.lang.String blogNo;  // 文章编号
    private  java.util.Date addtime_begin;  // addtime
    private  java.util.Date addtime_end;  // addtime
    private  java.lang.String blogUserName;  // 博客用户名
     private  java.lang.String blogContent;  // 文章内容




Action.java


request.setAttribute("blogIssueList",
        this.getVarIBlogIssueLogic();.findBlogIssueby(
        form.getBlogNo();,
        form.getAddtime_begin();,
        form.getAddtime_end();,
        form.getBlogUserName();,
        form.getBlogContent();,
        form.getPageBean();););;



service.java


    public List findBlogIssueby(
        java.lang.String blogNo,
        java.util.Date addtime_begin,
        java.util.Date addtime_end,
        java.lang.String blogUserName,
        java.lang.String blogContent,
        Pagination page);{
    return getVarIBlogIssueDAO();.findBlogIssueby(
        blogNo,
        addtime_begin,
        addtime_end,
        blogUserName,
        blogContent,
        page);;
    }



dao的就不再写了。

以上的代码都是代码生成器就生成好了的。
重用的时候基本把代码复制过来就改一下查询条件即可。
一点也不需要关心分页的问题。
0 请登录后投票
   发表时间:2006-05-15  
恕小弟愚昧,你的代码虽然是很清晰,但是还是没有解决我想要问的问题。

第一、我所理解的通用,并不是指使用所有代码生成器之类的工具生成代码。用工具生成代码,在我看来只是把手工的东西变成自动化或者半自动化。

第二、在查询分页中,查询条件的传递问题。简单的说就是,当我翻到第n页的时候,我怎么知道用户查询时输入的查询条件(或者是组装的查询语句,对象)。
0 请登录后投票
   发表时间:2006-05-20  
我个人觉得参数传递与分页的解耦、通用关系不大。

一般我对这种参数是放入request中。如果是webwork就更简单了,可以做一个查询条件的类,来放置查询的条件。
0 请登录后投票
   发表时间:2006-05-21  
//我怎么知道用户查询时输入的查询条件(或者是组装的查询语句,对象)。

上面我的代码中,每次提交查询的时候,查询都从表单中获取。
0 请登录后投票
   发表时间:2006-06-22  
既然已经写了,为什么大家不能把自己的代码帖出来呢?最好的可以直接运行的,然后再讨论一下嘛
0 请登录后投票
   发表时间:2006-06-27  
发现一个好东西、老东西。
http://www.blogjava.net/aichan/archive/2006/06/27/55248.html
Pager-taglib是个通用的分页标签库。可能解决参数传递、与逻辑解藕等问题。每个人可以根据自已的喜好去订制自已风格的导航页面。
0 请登录后投票
   发表时间:2006-07-01  
不明白分页,在各个论坛上总是搞来搞去的,长盛不衰,实际上分页查询是很简单的,为什么搞的很麻烦。将分页查询进行功能分解:
  1、显示层:
     a. 数据表格显示页面
     b.分页条
  2、action
       接收查询参数,动态组装SQL。
  3、查询DAO
      接收SQL,分页参数,再次将SQL组装成有分页功能的SQL.查询数据库返回数据。
   4、action接收数据,封装成Page组件。传递到页面。

   这4个部分,框架能够完成的功能如下:
   1、分页条
   2、接收查询参数
   3、查询DAO
    4、封装查询数据
  
   你需要完成的功能:
   1、写SQL,不要以为写SQL很麻烦,比Hibernate方便多了。工作量也小多了。只需要返回一个SQL字符串和条件参数值就完事了。
   2、在页面上取数据,填充到TD中。
 
    所以你只需要做两项目工作,工作量很小的。根本不需要写多余的DTO类,因为查询参数是放在Map中,返回数据也是放在Map中,一行数据一个Map。你只需要用列名从Map中取出数据就完事了。
   返回时,查询条件参数值仍然返回去了,所以在查询条上,原来输入的查询条件参数数据仍然可以自己保持在页面。
   我们在项目中十分钟就搞定了了一个分页查询
   1、因为页面可以复制一个模板,很快就写出来了。
   2、因为只写SQL,爽死了,调优也非常的方便
   3、不用写Action,整个框架就一个Action
    4、更不用配置struts-config或xwork.xml.因为那个Action由框架配置好了。
   5、调试方便,配置是由框架完成的,不用担心配置错误
   6、测试方便,只专心写SQL,所以在相信框架不会出错的前提下,只需要专注测试SQL写的正确不正确。我们专一写了测试类。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics