在开拓过程中,常常做的一件事,也是最基本的事,便是从数据库中查询数据,然后在客户端显示出来。当数据少时,可以在一个页面内显示完成。然而,如果查询记录是几百条、上千条呢?直接一个页面显示完备的话,表格得多长啊。。。。。。这时,我们可以用分页技能。
作甚分页?效果图如下:
这里统共查询了100条记录,如果一次性显示的话表格会很多行,用户体验不佳。而我们采取分页显示的话,一页显示10条记录,共十页。用户可以自行翻阅,记录少,清晰显示。
下面谈谈分页效果的实现,思路有三种:
其一:纯JS实现分页。一次性查询记录并加载到html的table中。然后通过选择性地显示某些行来达到分页显示的目的。这是一种伪分页,障眼法而已。只能用于数据少的情形下。一旦数据多了,十几万条数据加载到html中会变得很慢。而且不实时,一次加载完后数据就写去世在页面了,若数据库中有变革,浏览器端显示的仍是上次加载过来的数据。
首先:用table来显示查询出来的记录们,全部显示。
<table width=\"大众500\"大众 id=\"大众idData\"大众>
<%
String user_id, user_name, user_sex, user_phone, user_age;
while (sqlRst.next()) {
user_id = sqlRst.getString(1);
user_name = sqlRst.getString(2);
user_sex = sqlRst.getString(3);
user_phone = sqlRst.getString(4);
user_age = sqlRst.getString(5);
%>
<tr>
<td><%=user_id%></td>
<td><%=user_name%></td>
<td><%=user_sex%></td>
<td><%=user_phone%></td>
<td><%=user_age%></td>
</tr>
<%
}
%>
</table>
<br/>
<table width=\公众60%\"大众 align=\"大众right\"大众>
<tr><td><div id=\"大众changePages\"大众 name=\公众changePages\"大众></div></td></tr>
</table>
然后,在JS中修正table中某些行显示,某些行隐蔽。
<script type=\公众text/javascript\公众>
function goPage(pno,psize){
var itable = document.getElementById(\"大众idData\公众);//获取table
var num = itable.rows.length;//得到记录总数
var totalPage = 0;
var pageSize = psize;//一页显示pageSize条记录
//打算总页数
if(num/pageSize > parseInt(num/pageSize)){
totalPage=parseInt(num/pageSize)+1;
}else{
totalPage=parseInt(num/pageSize);
}
//当前页数
var currentPage = pno;
//获取当前页第一条、末了一条记录的行号
var startRow = (currentPage - 1) pageSize+1;
var endRow = currentPage pageSize;
endRow = (endRow > num)? num : endRow;
//修正table中当前页对应的行的属性为显示,非本页的记录为隐蔽
for(var i=1;i<(num+1);i++){
var irow = itable.rows[i-1];
if(i>=startRow && i<=endRow){
irow.style.display = \"大众block\公众;
}else{
irow.style.display = \"大众none\"大众;
}
}
//分页页码列表
var tempStr = \公众共\"大众+num+\"大众条记录 分\公众+totalPage+\"大众页 当前第\公众+currentPage+\公众页\公众;
if(currentPage>1){
tempStr += \"大众<a href=\\"大众#\\公众 onClick=\\"大众goPage(\公众+(1)+\"大众,\"大众+psize+\"大众)\\"大众>首页</a>\公众;
tempStr += \"大众<a href=\\"大众#\\"大众 onClick=\\"大众goPage(\公众+(currentPage-1)+\"大众,\公众+psize+\公众)\\公众><上一页</a>\公众
}else{
tempStr += \公众首页\公众;
tempStr += \公众<上一页\"大众;
}
if(currentPage<totalPage){
tempStr += \"大众<a href=\\"大众#\\"大众 onClick=\\"大众goPage(\"大众+(currentPage+1)+\"大众,\"大众+psize+\公众)\\公众>下一页></a>\"大众;
tempStr += \"大众<a href=\\"大众#\\公众 onClick=\\"大众goPage(\"大众+(totalPage)+\公众,\公众+psize+\公众)\\"大众>尾页</a>\"大众;
}else{
tempStr += \"大众下一页>\"大众;
tempStr += \"大众尾页\"大众;
}
document.getElementById(\公众changePages\"大众).innerHTML = tempStr;
}
</script>
其二:一次查询,分批显示。
便是说,我们可以实行一个数据库查询操作,得到结果集rs。然后,通过指针的移动来显示当前页面的记录。这样,就可以以 rs.absolute(当前页面号每页记录数)定位到当前页的第一条记录,然后通过while循环显示n条记录(n为每页显示记录数)。在跳页时,只需修正currentPage,即可在重定位到下一页时把当前页面号改掉,重新定位记录指针,通过while遍历显示n条记录。与JS选择性显示不同,这里是选择性遍历。与JS分页不同的是,这里分页每次跳页修正的是遍历的指针,每次跳页都要进行一次全面查询。同样地,不适宜大数据量查询。这里比JS分页优化的地方在于——实时性。每次跳页都会查询一次数据库,担保数据的实时性。
参考代码:
<%
int intPageSize = 10; //一页显示的记录数 int intRowCount; //记录总数
int intPageCount; //总页数
String strPage; //从表单或URL传送的待显示页码
int intPage; //待显示页码 ,由strPage转换成的整数
//---打算记录总数的第一种方法:查询出所有记录,移动结果集指针到末了一条,获取末了一条记录的行号
//查询所有数据 ResultSet sqlRst = sqlStmt.executeQuery(\公众select from user\"大众);
//获取记录总数
sqlRst.last(); //光标在末了一行
intRowCount = sqlRst.getRow(); //获得当前行号,即总记录数
//记算总页数
intPageCount = (int)Math.ceil(intRowCount/(intPageSize1.0));
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage - 1) intPageSize + 1);
//显示数据
int i=0;
String user_id, user_name, user_sex, user_phone, user_age;
while (i < intPageSize && !sqlRst.isAfterLast()) {
user_id = sqlRst.getString(1);
user_name = sqlRst.getString(2);
user_sex = sqlRst.getString(3);
user_phone = sqlRst.getString(4);
user_age = sqlRst.getString(5);
%>
<tr>
<td><%=user_id%></td>
<td><%=user_name%></td>
<td><%=user_sex%></td>
<td><%=user_phone%></td>
<td><%=user_age%></td>
</tr>
<%
sqlRst.next();//移动记录指针指向下一条记录
i++;//统计当前页已显示多少条记录
}
%>
其三:在做事端分页。跳到第n页才查询、显示第n页内容。要点便是根据客户端表格的“页面”打算出数据库要查询确当前页面的第一条记录的位置。优点:实时性:跳页才查询。数据量小:只加载当前页的记录进行显示。
重点在于两条语句:select count() from ...:查询得到记录总条数
select from .. limit pageNo,rowsCount:查询从第pageNo条开始的rowsCount条数据。
int pages=0; //待显示页面
int count=0; //总条数
int totalpages=0; //总页数
int limit=10; //每页显示记录条数
//打算记录总数的第二种办法:利用mysql的聚拢函数count()
ResultSet sqlRst = sqlStmt.executeQuery(\公众select count() from user\"大众);
if(sqlRst.next()){
count = sqlRst.getInt(1);//结果为count()表,只有一列。这里通过列的下标索引(1)来获取值
}
//由记录总数除以每页记录数得出总页数
totalpages = (int)Math.ceil(count/(limit1.0));
//获取跳页时传进来确当前页面参数
String strPage = request.getParameter(\公众pages\公众);
//判断当前页面参数的合法性并处理造孽页号(为空则显示第一页,小于0则显示第一页,大于总页数则显示末了一页)
if (strPage == null) {
pages = 1;
} else {
try{
pages = java.lang.Integer.parseInt(strPage);
}catch(Exception e){
pages = 1;
}
if (pages < 1){
pages = 1;
}
if (pages > totalpages){
pages = totalpages;
}
}
//由(pages-1)limit算出当前页面第一条记录,由limit查询limit条记录。则得出当前页面的记录
sqlRst = sqlStmt.executeQuery(\"大众select from user order by user_id limit \"大众 + (pages - 1) limit + \"大众,\"大众 + limit);
while (sqlRst.next()){//遍历显示}
跳页的实现:跳页是通过重定向来实现的,通过向当前网页传进待显示的pages,在跳转后根据pages重新算出页面显示的第一条,查limit条显示。
<form name=\"大众f1\公众 method=\公众POST\"大众 action=\"大众index.jsp\公众 onSubmit=\公众return checknum()\公众>
<table border=\公众0\公众 align=\"大众center\公众 >
<tr>
<td>第<%=pages%>页 共<%=totalpages%>页 <a href=\"大众index.jsp?pages=1\公众>首页</a></td>
<td><a href=\公众index.jsp?pages=<%=(pages<1)?pages:(pages-1) %>\"大众> 上一页</a></td>
<td><a href=\"大众index.jsp?pages=<%=(pages>=totalpages)?totalpages:(pages+1)%>\"大众> 下一页</a></td>
<td><a href=\"大众index.jsp?pages=<%=totalpages%>\公众>末了一页</a></td>
<td>转到第:<input type=\"大众text\"大众 name=\"大众page\公众 size=\公众8\公众>页<input type=\公众submit\"大众 value=\"大众GO\公众 name=\公众cndok\公众></td>
</tr>
</table>
</form>
附:常见数据库分页查询语句
1.oracle数据库分页
select from (select a.,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow
2.DB2数据库分页
Select from (select rownumber() over() as rc,a. from (select from 表名 order by列名) as a) where rc between startrow and endrow
3.SQL Server 2000数据库分页
Select top pagesize from 表名 where 列名 not in(select top pagesizepage 列名 from 表名 order by列名) order by列名
4.SQL Server 2005数据库分页
Select from (select 列名,row_number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow
5.MySQL数据库分页
Select from 表名 limit startrow,pagesize
(Pagesize为每页显示的记录条数)
6.PostgreSQL数据库分页
Select from 表名 limit pagesize,offset startrow
(Pagesize为每页显示的记录条数)
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6134851.html