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