jsp如何分页(100分)

  • 主题发起人 主题发起人 goddy
  • 开始时间 开始时间
//result为数据库查询结果
result.first();
result.absolute((pages-1)*pagesize);
 
作者:大天使
先声明一下,本人也是刚学习JSP没多少时间,期间得到了 何志强 先生的大力帮助,解决了很多Java平台方面的问题。
对于分页这个问题,我试着以以前写ASP和PHP的思路做了一下,是以纯JSP代码的形式,后来又写了一个bean来实现,实际的结果发现2者速度没有多大差别(我是做了20000条记录的分页:>)我还想试试servlet的结果如何
关于分页的代码如下:
//Author tar(bigangell@yesky.com)
//您可以任意拷贝复制该代码,但请加上以上作者信息
//有任何问题请与我联系
//效果请看 http://210.77.144.64/kk/java/java/article.jsp

<%@ page import="java.sql.*" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.*" %>
<jsp:useBean id="sqlconn" scope="page" class="kk.database.sqlconn" />
<%! String aTitle,aAuthor,AType,ArticleType,InsertTime,Color;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>ArticleList</TITLE>
<META NAME="Generator" CONTENT="jBuilder3.5 &amp;&amp;
jEdit1.0">
<META NAME="Author" CONTENT="bigangell">
<META NAME="Keywords" CONTENT="Java,Servlet,Jsp,Beans,PHP">
<META NAME="Description" CONTENT="A Pure World For Programming Include C/C++,Java">
<META HTTP-EQUIV="Content-Type" CONTENT="text/html;
CHARSET=gb2312">
<link rel="stylesheet" href="style.css">
</head>
<body bgcolor="#FFFFFF">
<table width="760" border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
<td>
<table width="750" border="0" cellspacing="2" cellpadding="2" align="center">
<tr align="center">
<td>&amp;nbsp;</td>
</tr>
<tr>
<td>
<table width="740" border="0" cellspacing="1" cellpadding="1" align="center">
<tr align="center" bgcolor="#CCCCCC">
<td><b>标题</b></td>
<td><b>作者</b></td>
<td><b>类型</b></td>
<td><b>点击</b></td>
<td><b>加入时间</b></td>
</tr>
<%
int i;
int ipage=10;
//分页单位
int allpage;
//总页数
int pages;
//接受的页码变量
int cpage=1;
//当前页
int spage;
//开始页

//数据库连接声明
java.lang.String sql,pagesql;
java.sql.ResultSet rs,pagers;
pagesql = "select count(a_id) as A from article";

//取总文章数
pagers = sqlconn.executeQuery(pagesql);
int allCol = pagers.getInt("A");

//获得总页面数
allpage = (int)Math.ceil((allCol + ipage-1) / ipage);

//判断参数pages是否为空
if (request.getParameter("pages")==null) {
pages=1;
} else
{
pages = new Integer(request.getParameter("pages")).intValue();
}
//判断当前页
if(pages > allpage // pages == 0){
cpage = 1;
} else
{
cpage = pages;
}
//判断起始页
spage=(cpage-1)*ipage;

sql = "select a_id,a_title,a_author,aID,a_time,a_readtime,sID from article order by a_id desc limit "+ spage +","+ ipage;
rs = sqlconn.executeQuery(sql);
int cu=1;

//循环取数据库值
while (rs.next()) {
int aID = rs.getInt("a_id");
aTitle = rs.getString("a_title");
aAuthor = rs.getString("a_author");
int ArticleTypeID = rs.getInt("aID");
int ReadTime = rs.getInt("a_readtime");
InsertTime = rs.getString("a_time");
if (cu % 2 == 0) { Color="#DBECFD";
}
else
{ Color="#C6E1FD";
}
switch (ArticleTypeID) {
case(1):
ArticleType="小说";
break;
case(2):
ArticleType="散文";
break;
case(3):
ArticleType="诗歌";
break;
case(4):
ArticleType="随笔";
break;
}
%>
<tr bgcolor="<%= Color %>">
<td width="300"><a href="viewarticle.jsp?aID=<%= aID %>"><%= aTitle %></a></td>
<td align="center" width="100"><%= aAuthor %></td>
<td align="center" width="50"><%= ArticleType %></td>
<td align="center" width="50"><%= ReadTime %></td>
<td align="center" width="240"><%= InsertTime %></td>
</tr>
<%
cu++;
}
%>
<tr bgcolor="#CCCCCC">
<td colspan="5" align="right" valign="middle">共 <%= allCol %>条记录 共 <%= allpage %>页 <% if (cpage>1) { %><a href="article.jsp?pages=<%= cpage-1 %>"><img src="images/prev.gif" border="0"></a><% } if (cpage<allpage) { %><a href="article.jsp?pages=<%= cpage+1 %>"><img src="images/next.gif" border="0"></a><% } %> / <% for (i=1;i<=allpage;i++) { if (i != pages) {%><a href="article.jsp?pages=<%= i %>"><%= i %></a>&amp;nbsp;<% } }%></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>

 
这个问题好像我早就问过eguy了。
sql = "select a_id,a_title,a_author,aID,a_time,a_readtime,sID from article order by a_id desc limit "+ spage +","+ ipage;
关键就是这一句吧?
我也扔块石头过来:(mysql)
public void openPagedSQL(String SQL,int RowPerPage,int pageNO)
throws SQLException
{
int Rangebegin
= pageNO * RowPerPage;;

String SQL2 = SQL + " LIMIT "+Rangebegin
+","+RowPerPage;
openSQL(SQL2);
}
可是如果用的不是mysql呢?
还是用小天的办法吧,通用。
 
goddy:请继续请继续请继续或结束问题
 
不是依靠JSP,而是由于使用的数据库不同,分页方法也不一样。
MYSQL这类数据库支持取一部分结果。
SQLSERVER这类数据库不支持取一部分结果,只好取出全部结果。
方法吗,正如楼上的大虾所说。
 
一般做法,写SQL去分页,但局限了通用性。
http://jsptags.com/tags/navigation/pager/
 
To 小天。
>//result为数据库查询结果
> result.first();
> result.absolute((pages-1)*pagesize);
这两个函数的工能是不是定位游标。result.first(),指向第一笔?,
result.absolute() 指向特定的一笔资料?。
当你用result.absolute((pages-1)*pagesize)时,设pages=1,pagesize=15.
(pages-1)*pagesize=0, result.absolute()将报错,我查看过这函数的原代码,它的参数
是不能为0的。我想因该把它改为result.absolute((pages-1)*pagesize + 1);
pages=1是
定位到第一笔,pages=2时定位到第16笔。使有JDBC2.0编译通过,运行没错。可就是没有资料
出来(注,我的资料库有一笔资料).但是我如果把这两句去掉,运行正常,就是不能分页了。
下面是我的源代码,希望大家帮我看一看。我用的是MSSQL数据库。
sql = "select Ids,Face,Type,TxtLong,Author,Layer,Topic,LastTime from t_bbs_data ";
sql += "where boardid = " + boardid + " order by topid desc";
//out.print(sql);
ResultSet rs1 = worker.SelectData(sql);
//分面关键
//rs1.first();
//rs1.absolute((pages-1) * pageSize + 1);
//rs1.absolute(1);
-------去掉这两个语名下面即可以。
while (rs1.next()) {
firstboard = false;
ids = rs1.getString("Ids");
face = rs1.getString("Face");
String oType = rs1.getString("Type").trim();
nType = new String(oType.getBytes("iso-8859-1"),"big5");

txtlong = rs1.getString("TxtLong");

String oAuthor = rs1.getString("Author");
nAuthor = new String(oAuthor.getBytes("iso-8859-1"),"big5");

layer = Integer.parseInt(rs1.getString("Layer"));

String oTopic = rs1.getString("Topic").trim();
nTopic = new String(oTopic.getBytes("iso-8859-1"),"big5");

lasttime = rs1.getString("LastTime");

//设置树状结构
listtrip = "&amp;nbsp;&amp;nbsp;";
i = 1;
while (i &amp;lt;
layer) {
listtrip = listtrip + "&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;";
i++;
}

//设置显示的每行内容
 
absolute是JDBC 2的方法,如果使用JDBC 1.X该怎样实现呢?
密切跟踪中。
 
<%@ page contentType="text/html;charset=gb2312"%>
<% response.setHeader("Expires","0");
%>
<%@ page import="java.sql.ResultSet" %>
<!--生成一个JavaBean:lyf.db的实例-->
<jsp:useBean id="db" class="lyf.db" scope="request"/>
<jsp:setProperty name="db" property="*"/>
<%
java.lang.String strSQL;
//SQL语句
int intPageSize;
//一页显示的记录数
int intRowCount;
//记录总数
int intPageCount;
//总页数
int intPage;
//待显示页码
java.lang.String strPage;
int i,j,k;
//设置一页显示的记录数
intPageSize = 15;
//取得待显示页码
strPage = request.getParameter("page");
if(strPage==null){//表明在QueryString中没有page这一个参数,此时显示第一页数据
intPage = 1;
}
else
{//将字符串转换成整型
intPage = java.lang.Integer.parseInt(strPage);
if(intPage<1) intPage = 1;
}
//获取记录总数
strSQL = "select count(*) from tableliu";
ResultSet result = db.executeQuery(strSQL);
//执行SQL语句并取得结果集
result.next();
//记录集刚打开的时候,指针位于第一条记录之前
intRowCount = result.getInt(1);
result.close();
//关闭结果集
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageSize;
//调整待显示的页码
if(intPage>intPageCount) intPage = intPageCount;
strSQL="select username,email,homepage,regtime,signs from tableliu order by id desc";
//执行SQL语句并取得结果集
result = db.executeQuery(strSQL);
//将记录指针定位到待显示页的第一条记录上
i = (intPage-1) * intPageSize;
for(j=0;j<i;j++) result.next();
%>
<html>
<head>
<meta http-equiv="Content-Language" content="zh-cn">
<meta http-equiv="Content-Type" content="text/html;
charset=gb2312">
<meta name="GENERATOR" content="Microsoft FrontPage 3.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>用户列表</title>
</head>
<body bgcolor="#FFEBBD">
<div align="center"><center>
<table border="1"
borderColorDark="#FFFFFF" borderColorLight="#000000" cellspacing="0" height="22"
width="100%">
<tr bgcolor="#FFEBAD">
<td height="1" width="691" class="main">
第<%=intPage%>页 共<%=intPageCount%>页
<a href="listuser.jsp?page=0">首页</a>
<%if(intPage>1){%><a href="listuser.jsp?page=<%=intPage-1%>">上一页</a><%}%>
<%if(intPage<=1){%>上一页<%}%>
<%if(intPage<intPageCount){%><a href="listuser.jsp?page=<%=intPage+1%>">下一页</a><%}%>
<%if(intPage>=intPageCount){%>下一页<%}%>
<a href="listuser.jsp?page=<%=intPageCount%>">尾页</a>
第<input type="text" class="main" name="page" size="3" value="<%=intPage%>" tabindex="1">页<input type="submit" class="main" value="go" name="B1" tabindex="2"><class="main">
</td></tr></table></form>
<table border="1" width="100%" cellspacing="0" bordercolorlight="#000000"
bordercolordark="#FFFFFF" class="main">
<tr bgcolor="#FFEBAD">
<td >
<div align="left">用户名</div>
</td>
<td >
<p align="center">Email
</td>
<td >
<p align="center">主页
</td>
<td>
<p align="center">登记时间
</td>
<td>
<p align="center">说明
</td>
</tr>
<%
//显示数据
i = 0;
while(i<intPageSize &amp;&amp;
result.next()){
%>
<tr bgcolor="#FFEBAD">
<td>
<div align="left"><%=result.getString("username") %></div></td>
<td><div align="center"><%=result.getString("email") %></a></div></td>
<td><div align="center"><font color="#0000CC"><%=result.getString("homepage") %></font></div></td>
<td><div align="center"><font color="#FF6666"><%=result.getDate("regtime") %></font></div></td>
<td><div align="center"><font color="#0000FF"><%=result.getString("signs") %></font></div></td></tr>
<%
i++;
}
%>
</table>
<% result.close();
//关闭结果集%>
</body>
</html>
 
多人接受答案了。
 
后退
顶部