bufegar 2007-4-6 14:13
JSP中常用到的分页显示程序(mdwolf 收集整理 )
JSP中常用到的分页显示程序(mdwolf 收集整理 )
分页程序(一):
这里我们介绍的分页程序的核心内容,并不是全部代码的讲解,只要理解分页的原理,你就能写出更好的分页程序;
范例图片如下:
分页.jpg
[img]http://www.newwhy.com/images/tietu/20070406/cut.jpg[/img]
1,首先我们来看分页程序中最基本的常量的存取,我已经抽出来了:
[java]
package org.mdwolf.utils.pagination;
/**
* <p>Title: 分页程序的基础类 </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author mdwolf
* @version 1.0
*/
public class PaginationBase {
private int curPage; //当前是第几页
private int maxPage; //一共有多少页
private int maxRowCount; //一共有多少行
private int rowsPerPage = 10; //每页有多少行
private int pageStartFlag; //取得当前页面的起始 位置 ;
private int pageEndFlag; //取得当前页面的结束 位置;
/**
* <p>Description:设置 页面 最后一条记录的位置
* </p>
* @param curPage
*/
public void setPageEndFlag(int curPage){
if (curPage < this.maxPage && curPage > 0) {//当前不是最后页
this.pageEndFlag = curPage*this.getRowsPerPage();
}
else if (curPage == this.maxPage){
this.pageEndFlag = this.getMaxRowCount();
}
}
/**
* <p>Description: 取得页面 最后一条记录的位置
* </p>
* @return
*/
public int getPageEndFlag(){
return this.pageEndFlag;
}
/**
* <p>Description:设置 每页有多少行
* </p>
* @param rowsPerPage
*/
public void setRowsPerPage(int rowsPerPage){
this.rowsPerPage = rowsPerPage;
}
/**
* <p>Description:得到 每页有多少行
* </p>
* @return
*/
public int getRowsPerPage(){
return this.rowsPerPage;
}
/**
* <p>Description:设置 一共有多少行</p>
* @param maxRowCount
*/
public void setMaxRowCount(int maxRowCount){
this.maxRowCount = maxRowCount;
}
/**
* <p>Description:得到 一共有多少行</p>
* @return
*/
public int getMaxRowCount() {
return this.maxRowCount;
}
/**
* <p>Description:设置 页面 第一条 记录位置</p>
* @param curPage
*/
public void setPageStartFlag(int curPage){
if (curPage <= this.maxPage && curPage > 0) {//当前不是最后页
this.pageStartFlag = (curPage-1)*this.getRowsPerPage()+1;
}
else if (curPage == 1 ){
this.pageStartFlag = 1;
}
}
/**
* <p>Description:取得 页面 第一条记录 位置</p>
* @return
*/
public int getPageStartFlag(){
return this.pageStartFlag;
}
/**
* <p>Description:设置 当前是第几页</p>
* @param curPage
*/
public void setCurPage(int curPage){
this.curPage = curPage;
}
/**
* <p>Description:返回 当前是第几页</p>
* @return
*/
public int getCurPage() {
return this.curPage;
}
/**
*<p>Description:根据总行数计算总页数</p>
*/
public void setMaxPage() {
if(this.getMaxRowCount() % this.getRowsPerPage()==0){
this.maxPage = this.getMaxRowCount()/this.getRowsPerPage();
}else{
this.maxPage = this.getMaxRowCount()/this.getRowsPerPage() + 1;
}
}
/**
* <p>Description:取得 总页数</p>
* @return
*/
public int getMaxPage() {
return this.maxPage;
}
public PaginationBase() {
}
public static void main(String[] args) {
PaginationBase paginationBase1 = new PaginationBase();
}
} [/java]
上述类是分页程序中最基本的常量存取类了,那我们该如何存取它呢?
看接下来的代码:[java]
package org.mdwolf.utils.pagination;
import java.util.Collection;
import java.util.ArrayList;
import java.sql.ResultSet;
/**
* <p>Title: 用jsp进行数据分页显示,适合于小数据量</p>
* <p>Description: 一次取出全部数据</p>
* <p>Copyright: </p>
* <p>Company: </p>
* @author mdwolf
* @version 1.0
*/
public class PaginationOne extends PaginationBase{
/**
*<p>Description:设置 取指定 页面 记录 动作</p>
* @param rs
* @param curPage
*/
public PaginationOne(ResultSet rs,int curPage) {
try {
if (rs.last()) {//如果有记录 true
this.setMaxRowCount(rs.getRow());//得到 所有记录数
this.setMaxPage();//计算总页数
this.setCurPage(curPage);//设置 当前是第几页
this.setPageEndFlag(curPage);//设置 当前是第几页最后一条记录的位置
this.setPageStartFlag(curPage);//设置 当前是第几页第1条记录位置
rs.beforeFirst();// 返回 准备状态 ,开始 取记录操作
}else {
this.setPageStartFlag(1);
System.out.println("没有找到相应记录!");
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
/**
* 设置 取指定 页面 记录 动作,增加了 设置每页显示的行数
* @param rs
* @param curPage 当前页数
* @param rowsPerPage 设置每页显示的行数
*/
public PaginationOne(ResultSet rs,int curPage,int rowsPerPage){
try {
if (rs.last()) {//如果有记录 true
if (rowsPerPage > 0) this.setRowsPerPage(rowsPerPage);//设置行数
this.setMaxRowCount(rs.getRow());//得到 所有记录数
this.setMaxPage();//计算总页数
this.setCurPage(curPage);//设置 当前是第几页
this.setPageEndFlag(curPage);//设置 当前是第几页最后一条记录的位置
this.setPageStartFlag(curPage);//设置 当前是第几页第1条记录位置
rs.beforeFirst();// 返回 准备状态 ,开始 取记录操作
}else {
System.out.println("没有找到相应记录!");
}
}
catch (Exception ex) {
ex.printStackTrace();
}
}
/**
*空构建器
*/
public PaginationOne(){
}
}
[/java]
这里我们写的第1个分页程序PaginationOne 继承了PaginationBase类,它只有3个构件器,其中2个带参数;
用来设置分页程序中的所用的参数;
现在我们来具体讲解一下这两个带参数的构件器:
public PaginationOne(ResultSet rs,int curPage)
这里我们的第1个分页程序传入的是结果集,你需要在Connection 关闭之前传入才有效,
curPage当前用户想要浏览的页码号;
public PaginationOne(ResultSet rs,int curPage,int rowsPerPage)
第2个带参数的构件器只比第1个多1个参数,就是rowsPerPage:每页我们要显示的行数,没有这个参数我们
程序就会使用默认的参数来显示每页的行数10条;
2.设置好分页程序中所必须的参数后,我们来看程序如何取得用户所需要的查看记录资料的,这里我们把记录放入
容器中返还给客户端,然后在JSP层通过分页的JSP显示组件来显示记录:
下面是查询的方法:[java]
public class PageOneExample {
private ConnectionMgr conMgr;
private PreparedStatement pst;
private Collection coll;
private Connection conn;
private Statement st;
private ResultSet rs;
private PaginationOne pgo = new PaginationOne();
private PageOneExampleModel poModel;
public PaginationOne getPaginationOne(){
return this.pgo;
}
/**
* <p>Description:实现 分类操作,使用默认的每页行数</p>
* @param sql
* @param paginationFlag 为用户指定的页码
* @return
*/
public Collection queryPageOne(int paginationFlag) throws AppException {
try {
conn = conMgr.getInstance().getConnection();
coll = new ArrayList();
String sql = " SELECT PASSWORD,CODE,NAME FROM MYEXAMPLE ORDER BY CODE ";
st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
rs = st.executeQuery(sql);
this.pgo = new PaginationOne(rs, paginationFlag);
if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
do {
poModel = new PageOneExampleModel();
poModel.setPassword(rs.getString(1));
poModel.setCode(rs.getString(2));
poModel.setName(rs.getString(3));
coll.add(poModel);
} while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
} //end ifb
return coll;
} catch (Exception ex) {
throw new AppException("分页程序取记录错误!");
} finally {
// conMgr.closeAll(conn, pst, st, rs);
conMgr.closeConn(conn);
} //end trycf
}
/**
* <p>Description:实现 分类操作,使用可以设置的每页行数</p>
* @param sql
* @param paginationFlag 为用户指定的页码
* @return
*/
public Collection queryPageOneFlag(int paginationFlag,int curPageNum) throws AppException {
try {
conn = conMgr.getInstance().getConnection();
st = conn.createStatement();
coll = new ArrayList();
String sql =
" SELECT PASSWORD,CODE,NAME FROM MYEXAMPLE ORDER BY CODE ";
System.out.println("sql:"+sql);
rs = st.executeQuery(sql);
this.pgo = new PaginationOne(rs,paginationFlag,curPageNum);//传入指定 页码 并设置 类成员,设置 每页 总的行数
if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
do {
poModel = new PageOneExampleModel();
poModel.setPassword(rs.getString(1));
poModel.setCode(rs.getString(2));
poModel.setName(rs.getString(3));
coll.add(poModel);
} while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
} //end ifb
return coll;
} catch (Exception ex) {
throw new AppException("分页程序取记录错误!");
} finally {
conMgr.closeAll(conn, pst, st, rs);
} //end trycf
}
/**
* 增加记录
* @param paginationFlag
* @param curPageNum
* @return
* @throws AppException
*/
public String add() throws AppException {
try {
conn = conMgr.getInstance().getConnection();
coll = new ArrayList();
// conMgr.beginTransaction(conn);
String name ="00000";
String password ="000000";
String code = SecManager.instance().getUniteCode();
System.out.println("****code:"+code);
String sql =
" INSERT INTO MYEXAMPLE (PASSWORD,CODE,NAME) VALUES (?,?,?) ";
pst = conn.prepareStatement(sql);
pst.setString(1,name);
pst.setString(2,code);
pst.setString(3,password);
int a = pst.executeUpdate();
String msg = "记录添加成功!";
if (a ==0 ) return "没有记录被更新!";
// conMgr.endTransaction(conn);
return msg;
} catch (Exception ex) {
// conMgr.rollbackTransaction(conn);
ex.printStackTrace();
throw new AppException("添加数据出错!!");
} finally {
conMgr.closeAll(conn, pst, st, rs);
} //end trycf
}
public PageOneExample() {
}
public static void main(String[] args) {
PageOneExample pageOneExample1 = new PageOneExample();
}
}
[/java]
这里有2个查询的方法,1个是没有设定行数的查询方法,1个已经设定行数的查询方法;
我们只介绍没有设定行数的方法,另一个方法读者一看就明白了,这里不多说:[java]
this.pgo = new PaginationOne(rs, paginationFlag);
if (rs.absolute(pgo.getPageStartFlag())) { //定位 指定页 的第一条记录
do {
poModel = new PageOneExampleModel();
poModel.setPassword(rs.getString(1));
poModel.setCode(rs.getString(2));
poModel.setName(rs.getString(3));
coll.add(poModel);
} while (rs.next() && rs.getRow() <= pgo.getPageEndFlag()); //到 最后行 操作 一次 退出
} //end ifb[/java]
取到结果以后,程序从用户指定要查看的页码paginationFlag,取出该页面的第1条记录和最后一条记录,放入
容器返还给客户端;
3.下面介绍如何显示数据:
用到的显示组件:
paginationCtl.jsp[java]
每页<%=thePageOneExample.getPaginationOne().getRowsPerPage()%>行
共<%=thePageOneExample.getPaginationOne().getMaxRowCount()%>行
第<%=thePageOneExample.getPaginationOne().getCurPage()%>页
共<%=thePageOneExample.getPaginationOne().getMaxPage()%>页
<%if(thePageOneExample.getPaginationOne().getCurPage()==1){
// out.print(" 首页 上一页");
%>
首页 上一页
<%
}else{
%>
<A HREF="javascript:gotoPage(1)">首页</A>
<A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getCurPage()-1%>)">上一页</A>
<%
}
if (thePageOneExample.getPaginationOne().getCurPage()==thePageOneExample.getPaginationOne().getMaxPage()){
// out.print("下一页 尾页");
%>
下一页 尾页
<%
}else{
%>
<A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getCurPage()+1%>)">下一页</A>
<A HREF="javascript:gotoPage(<%=thePageOneExample.getPaginationOne().getMaxPage()%>)">尾页</A>
<%}%>
转到第
<SELECT class="input1" name="curPage" onchange="Jumping(this)">
<%
for(int i=1; i<=thePageOneExample.getPaginationOne().getMaxPage(); i++) {
if (i== thePageOneExample.getPaginationOne().getCurPage()){
%>
<OPTION selected value=<%=i%>><%=i%></OPTION>
<%}else{%>
<OPTION value=<%=i%>><%=i%></OPTION>
<%}}%>
</SELECT>
页 [/java]
接下来是如何显示数据和运用显示组件的:
[java]
<%
PageOneExampleModel poModel = null;
PageOneExample thePageOneExample = new PageOneExample();
int ii = 0;
String msg = "";
String curPage = Utils.doRequestTrim(request,"curPage");
String operate = Utils.doRequestTrim(request,"operate");
if (curPage.equals("")) curPage = "1";
Collection coll = null;
try {
if (operate.equals("add")) {
msg = thePageOneExample.add();
coll = thePageOneExample.queryPageOne(Integer.parseInt(curPage));
}
else coll = thePageOneExample.queryPageOne(Integer.parseInt(curPage));
}
catch (Exception ex) {
throw ex;
}
if (coll == null) coll = new ArrayList();
Iterator it = coll.iterator();
%>
<script language="javascript" src="./javascript/jsfaq.js"></script>
<link rel="stylesheet" href="./javascript/index.css" type="text/css">
<script >
function submitOperation(){//提交操作
document.form1.submit();
}
function gotoPage(curPage){// 页面 链接 页码 提交动作
document.form1.curPage.value=curPage;
submitOperation();
}
function Jumping() {//下拉框 页码 提交动作
submitOperation();
}
function addOn() {//下拉框 页码 提交动作
document.form1.operate.value = "add";
submitOperation();
}
</script >
<form name="form1" method="post" action="">
<input type="hidden" name="operate" value="">
<table width="100%" border="0">
<tr>
<td width="11%"> </td>
<td width="80%"><div align="center"></div></td>
<td width="9%"> </td>
</tr>
<tr>
<td> </td>
<td><table width="100%" border="0" cellpadding="0" cellspacing="1" bgcolor="#CCCCCC">
<tr>
<td bgcolor="#CCCCCC"><div align="center">分页程序</div></td>
</tr>
<tr>
<td bgcolor="#FFFFFF"> 说明: 取出全部记录,但是没有放入内存,必须每次都查询</td>
</tr>
<tr>
<td bgcolor="#FFFFFF">
<table width="80%" border="1" align="center" cellspacing="1" bordercolordark="#ffffff">
<tr>
<td align="right" colspan="7">
<%if (thePageOneExample.getPaginationOne().getMaxPage() != 1 && thePageOneExample.getPaginationOne().getMaxPage() != 0) {%>
<%@ include file="./pagination/paginationCtl.jsp"%>
<%}%>
</td>
</tr>
<tr bgcolor="#CCCCCC">
<td width="4%"> </td>
<td width="7%"><div align="center">序列号</div></td>
<td width="19%"><div align="center">password</div></td>
<td width="17%"><div align="center">code</div></td>
<td width="20%"><div align="center">name</div></td>
<td width="18%"><div align="center">操作</div></td>
</tr>
<%
while (it.hasNext()) {
ii++;
poModel = (PageOneExampleModel)it.next();
%>
<tr>
<td bgcolor="#CCCCCC"><input type="checkbox" name="recordId" value="<%=poModel.getCode()%>"></td>
<td> <%=ii%></td>
<td> <%=poModel.getPassword()%></td>
<td> <%=poModel.getCode()%></td>
<td> <%=poModel.getName()%></td>
<td align="center">修改</td>
</tr>
<%}%>
<tr>
<td colspan="7"><div align="center">
<input class="input1" type="button" name="button2" value="增加" onclick="addOn();">
<input class="input1" type="submit" name="button1" value="查询" >
<input class="input1" type="submit" name="button3" value="查询" >
<input class="input1" type="submit" name="button4" value="查询" ><%=msg%>
</div></td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#FFFFFF"> </td>
</tr>
<tr>
<td bgcolor="#FFFFFF"> </td>
</tr>
</table></td>
<td> </td>
</tr>
<tr>
<td> </td>
<td><table width="60%" border="0" align="center">
<tr>
<td> <div align="center">
<input name="fff" type="button" class="input1" onClick="javascript: location.href='index.html'" value="首页">
<input class="input1" type="button" name="Submit3" value="刷新" onClick="reloadOn();">
<input class="input1" type="button" name="Submit" value="后退" onClick="backOn();">
<input class="input1" type="button" name="Submit4" value="关闭" onClick="closeOn();">
</div></td>
</tr>
</table></td>
<td> </td>
</tr>
</table>
</form>
[/java]
取得数据后,我们把分页参数放入显示组件页面:
[java]
<%if (thePageOneExample.getPaginationOne().getMaxPage() != 1 && thePageOneExample.getPaginationOne().getMaxPage() != 0) {%>
<%@ include file="./pagination/paginationCtl.jsp"%>
<%}%>
[/java]
如果所取得的记录只有1页的话,这个显示组件的页面将不显示;
至于上页下页首页等的跳转方法这里就不多说了,大伙一看就知道;
好了,今天讲的分页程序就到这里,当然这个分页程序每次查看都要查寻数据库,太费资源,下次我们会针对
MYSQL、ORACLE分别取部分数据来进行分页;有任何问题的朋友可以跟帖,欢迎大家来讨论,我的邮箱是[email]mdwolf@sina.com.cn[/email],再会!
7媛q 2008-10-22 18:44
音乐家刘冰《警察忠诚》专辑歌曲,大家支持一下!
下载地址:[url=http://www.hsooo.com/mp3/段钊-流星.mp3]http://www.hsooo.com/mp3/段钊-流星.mp3[/url]
视听专辑地址:[url=http://wwww.hsooo.com/]http://wwww.hsooo.com/[/url]
[align=center][img=430,384]http://wwww.hsooo.com/bbs/attachments/month_0810/20081022_32492076ae72c1f9f1bcbjcgiab6ovzl.jpg[/img][/align][align=left]音乐家刘冰《警察忠诚》[/align][align=left]
唱片名称:音乐家刘冰《警察忠诚》 [/align][align=left]制作人:许传龙[/align][align=left]版权代理:艺星时尚文化信息传播有限公司[/align][align=left]出版公司:天赋唱片 [/align][align=left]发行时间:2008年10月 [/align][align=left]推荐单曲:《流星》、《警察忠诚》、《相聚北京》、 [/align][align=left]这张专辑“由内地音乐家刘冰独立创作完成”,音乐制作许传龙,演唱队伍则汇聚了众多当[/align][align=left]今歌坛最具影响力的实力派唱将:王子辰、段钊、王云、张峻铭、王坤、姚莉、吴憾等歌手[/align][align=left]纷纷加盟,为这张专辑献声。唱片中收录了十首风格完全不同的原创歌曲。[/align][align=left]
专辑歌曲列表: [/align][align=left]
01、王子辰-东方姑娘[/align][align=left]02、段钊-流星[/align][align=left]03、王云 张峻铭-北京2008[/align][align=left]04、王坤-大河源头[/align][align=left]05、张峻铭-警察忠诚[/align][align=left]06、群星-希望[/align][align=left]07、张峻铭-相聚[/align][align=left]08、张峻铭-祖国统一[/align][align=left]09、张峻铭 姚莉-生日快乐[/align][align=left]10、刘冰-相聚北京[/align][align=left] [/align]