看得太多的关于分页的文章,但真正符合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框架。你可能很想参考我的源代码,但我还是希望你自己能够开动脑筋,实现一下。思路应该很清晰了。如果,你实在写不出来,那么留下联系方式,在我能力范围内的,我会给你发一份源代码过去,但前提是你有一定的面向对象编程的基础,因为其中涉及到了模板模式这种依赖多态性的实现,否则,请勿扰,谢谢。 
|