http://javawebstudio.51.net/instance/index.htm
《10、如何在Struts 数据库应用程序中实现分页显示》

解决方案 »

  1.   

    看得太多的关于分页的文章,但真正符合MVC结构的不多。
    还有就是为什么有很多人问struts分页的问题?如果你能在非struts框架中实现分页,那么完全搬过来不就行了。既然问了,我想大家是想使用struts分页中的标签来分页吧。一个好的struts分页实现是不应该破坏struts的MVC宗旨的。下面要讲的分页实现上可能会麻烦一些,但是比在jsp页面中穿插大堆java代码要易维护的多,而且可复用性极好。下面先给出我的分页在使用过程中看上去都是什么样的,也许你对这种分页并不感兴趣。需要分页的jsp页面中只需这些:
    page.jsp
    <logic:iterate id="item" name="pageCtrl" property="datas">
        <bean:write name="item" property="propertyValues.id"/><br/>
        <bean:write name="item" property="propertyValues.title"/><br/>
        <bean:write name="item" property="propertyValues.publishDate"/><br />
    </logic:iterate><form name="PageForm"  action="/pageAction.do" >
        <%@ include file="/pagectrl.jsp"%>
    </form>
    ------------------------------------------------------------------------
    pageAction中只需这些:
    String sCurPageNum = request.getParameter("curPageNum");//取得当前页,这个参数在包含文件pagectrl.jsp中,往后看就知道了
    int curPageNum = 1;
    if (sCurPageNum != null) {
        curPageNum = Integer.parseInt(sCurPageNum);
    }PageCtrl pageCtrl = new PageCtrl(curPageNum, model.WTONews.getPageInfo());//model.WTONews这个类是难点
    request.setAttribute("pageCtrl", pageCtrl);//可以看到,在page.jsp页面中的数据都是从pageCtrl对象中获得的。
    mapping.findForward("page");--------------------------------------------------------------------------
    model.WTONews类中的getPageInfo()方法:
    public static PageInfo getPageInfo() {
        List p = new Vector();
        p.add("title");
        p.add("id");
        p.add("publishDate");    PageInfo pageInfo = new PageInfo();
        pageInfo.setSelectAllSql("select title,id,publishdate from wto_article");
        pageInfo.setRowCountSql("select count(*) from wto_article");
        pageInfo.setRowCountPerPage(4);
        pageInfo.setPropertyNames(p);
        pageInfo.setBeanName("model.WTONews");    return pageInfo;
    }
    --------------------------------------------------------------------------
    好了,到目前为止,你所看到的分页实现应该还算干净利索吧!如果你有兴趣的话,请继续阅读。
    这个分页的思路如下,(思路比源代码重要的多):首先,在pageAction中,我们要获取page.jsp中要显示的数据。
    a)获取当前页代码,如果为空,即说明我们还没有访问过page.jsp。那么要设为第一页。
    b)建立pageCtrl对象,该对象负责根据curPageNum,来获取当前要显示的数据。而数据库的访问语句,每页显示多少行等信息则由相关的model来提供。正如前面你见到的那样。
    c)把该pageCtrl对象存入request作用域。
    d)转发到page.jsp。(如果你不懂转发,请参考http://blog.csdn.net/funcreal/archive/2004/09/17/108060.aspx)
    然后,就是显示了
    a)通过<logic:iterate id="item" name="pageCtrl" property="datas">这一句你应该可以猜到pageCtrl提供了一个getDatas方法,并且它的类型很可能是List。事实上,确是如此。
    b)然后显示每一个属性<bean:write name="item" property="propertyValues.id"/>注意里面的property的值是propertyValues.id。这个并不奇怪,struts支持这样的语法来调用,它相当于getPropertyValues().getId(),至于这里为什么是这样的,那是实现细节,你不必关心。将来你的实现也许是这样的<bean:write name="item" property="id"/>
    c)分页form,这个form将会提交到pageAction中,同时还会把当前页一起带过去。<%@ include file="/pagectrl.jsp"%>包含了分页的页脚,它的源代码将在最后给出,它的实现很简单,实际上,你并不需要关心它的很多细节,复用就行了。pagectrl.jsp你把它粘到dreamweaver中,他就回原形毕露了。在使用过程中,不用对他进行什么修改,你只需注意变量名要一致。
    <jsp:useBean id="pageCtrl" class="funcreal.db.PageCtrl" scope="request" />
    共检索到<%=pageCtrl.getRowCount()%>条记录 共<%=pageCtrl.getPageCount()%>页 每页<%=pageCtrl.getRowCountPerPage()%>行 <a href="#" onClick="gotoPage(1)">首页</a> <a href="#" onClick="gotoPage(<%=pageCtrl.getCurPageNum()%> - 1)">上一页</a> 第<%=pageCtrl.getCurPageNum()%>页 <a href="#" onClick="gotoPage(<%=pageCtrl.getCurPageNum()%> + 1)">下一页</a> <a href="#" onClick="gotoPage(<%=pageCtrl.getPageCount()%>)">末页</a> 转到第
       <SELECT name="curPageNum" onchange="jump()">
         <% for(int i=1;i<=pageCtrl.getPageCount();i++){
             if (i== pageCtrl.getCurPageNum()){%>
                 <OPTION selected value=<%=i%>><%=i%></OPTION>
             <%}else{%>
                 <OPTION value=<%=i%>><%=i%></OPTION>
             <%}
      }%>
        </SELECT>页
    <script language="javascript" >
    function jump(){
      document.PageForm.submit();
      return ;
    }function gotoPage(pageNumber){
      if(pageNumber < 1){
        pageNumber =1;
      }
      if(pageNumber > "<%=pageCtrl.getPageCount()%>"){
        pageNumber = "<%=pageCtrl.getPageCount()%>";
      }
      document.all.curPageNum.value = pageNumber;
      document.PageForm.submit();
      return ;
    }
    </script> 事实上,在page.jsp页面中剥去struts标签,这个分页实现同样适用于非struts框架。你可能很想参考我的源代码,但我还是希望你自己能够开动脑筋,实现一下。思路应该很清晰了。如果,你实在写不出来,那么留下联系方式,在我能力范围内的,我会给你发一份源代码过去,但前提是你有一定的面向对象编程的基础,因为其中涉及到了模板模式这种依赖多态性的实现,否则,请勿扰,谢谢。