数据量大了就需要进行分页,分页主要使用四个参数
RecordCount 总记录条数 这个基本上是固定的(条件确定后)
PageSize 页大小 这个可以根据自己的需要进行调
PageCount 总页数 上面两个确定这个基本确定
PageIndex 当前页码 这个是可以进行变化的,取值范围0到PageCount-1之间
这是分页的基本思想,在JSP中使用我们可以通过一个PageVo类对分页的导航进行简化处理,
我设计了这样一个分页辅助类:
PageVo.java
public class PageVo {
private int recordCount;
private int pageSize;
private int pageCount;
private int pageIndex;
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public PageVo(int recordCount, int pageSize, int pageCount, int pageIndex) {
super();
this.recordCount = recordCount;
this.pageSize = pageSize;
this.pageCount = pageCount;
this.pageIndex = pageIndex;
}
}
封装了上面四个变量,写了一个构造函数
数据访问层类使用这个辅助类
NewsDaoImpl.java
public class NewsDaoImpl extends DBM<NewsVo> implements NewsDao {
public List<NewsVo> findAllByPage(PageVo p) {
int recordCount=Integer.parseInt(queryScalar("select count(*) from News").toString());
p.setRecordCount(recordCount);
int pageSize=p.getPageSize();
int pageCount=recordCount/pageSize;
if(recordCount%pageSize>0) pageCount++;
p.setPageCount(pageCount);
int pageIndex=p.getPageIndex();
if(pageIndex<0) pageIndex=0;
if(pageIndex>pageCount-1) pageIndex=pageCount-1;
p.setPageIndex(pageIndex);
return query("select top "+pageSize+" * from news where nid not in (select top "+pageIndex*pageSize+" nid from news order by nid) order by nid");
}
}
使用前面写的dbuitls+反射!
JSP页面使用:
newsList.jsp
<table border="1">
<tr>
<td>id</td>
<td>title</td>
<td>author</td>
<td>createDate</td>
</tr>
<%
int index=0;
if(request.getParameter("p")!=null){
index=Integer.parseInt(request.getParameter("p"));
}
PageVo p=new PageVo(0,10,0,index);
for(NewsVo n:new NewsBizImpl().findAllByPag(p)){
%>
<tr>
<td><%=n.getNid()%></td>
<td><%=n.getNtitle() %></td>
<td><%=n.getNauthor() %></td>
<td><%=n.getNcreateDate()%></td>
</tr>
<%
}
%>
</table>
这最后少一行导航功能,我们可能需要这样一个导航功能:
下面的导航基本上是一样的,因此我们可以扩充PageVo.java在其中写一个方法生成导航,jsp页面变为:
<table border="1">
<tr>
<td>id</td>
<td>title</td>
<td>author</td>
<td>createDate</td>
</tr>
<%
int index=0;
if(request.getParameter("p")!=null){
index=Integer.parseInt(request.getParameter("p"));
}
PageVo p=new PageVo(0,10,0,index);
for(NewsVo n:new NewsBizImpl().findAllByPag(p)){
%>
<tr>
<td><%=n.getNid()%></td>
<td><%=n.getNtitle() %></td>
<td><%=n.getNauthor() %></td>
<td><%=n.getNcreateDate()%></td>
</tr>
<%
}
%>
<tr>
</tr>
</table>
我给PageVo增加了一个toNav的方法,用于生成导航功能:
对于导航我设计了两部分:
左边是一个<span class=info>共42页每页10条 共5页第1页</span> 右边是一个<span class=nav>首页 上一页 下一页 末页</span>
这样方便将来使用样式表进行扩充
最终的PageVo.java代码如下:
public class PageVo {
private int recordCount;
private int pageSize;
private int pageCount;
private int pageIndex;
public int getRecordCount() {
return recordCount;
}
public void setRecordCount(int recordCount) {
this.recordCount = recordCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageIndex() {
return pageIndex;
}
public void setPageIndex(int pageIndex) {
this.pageIndex = pageIndex;
}
public PageVo(int recordCount, int pageSize, int pageCount, int pageIndex) {
super();
this.recordCount = recordCount;
this.pageSize = pageSize;
this.pageCount = pageCount;
this.pageIndex = pageIndex;
}
public String toNav(String jsp){
StringBuilder sb=new StringBuilder();
sb.append("<span class='info'>共"+recordCount+"页每页"+pageSize+"条 共"+pageCount+"页第"+(pageIndex+1)+"页</span>");
sb.append("<span class='nav'>");
if(pageIndex==0){
sb.append("<span class='a'>首页</span> ");
sb.append("<span class='a'>上一页</span> ");
}
else{
sb.append("<a href='"+jsp+"?p=0'>首页</a> ");
sb.append("<a href='"+jsp+"?p="+(pageIndex-1)+"'>上一页</a> ");
}
if(pageIndex>=pageCount-1){
sb.append("<span class='a'>下一页</span> ");
sb.append("<span class='a'>末页</span>");
}
else{
sb.append("<a href='"+jsp+"?p="+(pageIndex+1)+"'>下一页</a> ");
sb.append("<a href='"+jsp+"?p="+(pageCount-1)+"'>末页</a> ");
}
sb.append("</span>");
return sb.toString();
}
}
这里可以根据需要进行扩充和重载。