分页显示详细实现步骤 1. 要实现的功能 确定页码显示样式如下: 上一页 << [9] [10] [11] 12 [13] [14] [15] [16] >> 下一页 转到:__页 GO 在上面页码中,当前页为第12页,页底最多显示8个页码: 当点击“上一页”时,显示第11页内容; 当点击“下一页”时,显示第13页内容; 当点击“<<”时,页底页码显示为从1到8,并显示第8页内容; 当点击“>>”时,页底页码显示为从17到24,若总页数小于24,则显示从17到总页数,并显示第17页内容。 在文本框中输入要跳转到的页数,点击“GO”按钮或按回车键,可显示该页内容。 2. 提高显示速度 该程序通过每个翻页操作存取最小记录集来提高显示速度。首先根据记录总数、总页数和一页显示的记录数及当前页码等来计算该页要显示的第一条记录序号startRecord和最后一条记录序号endRecord,通过startRecord和endRecord来决定RS集的内容。通过使rownum大于等于startRecord和rownum小于等于endRecord,采用嵌套查询的方法来获得RS记录集。 3. 对跳转页面的控制 用户在输入要跳转的页码后,点击GO或按回车键首先要执行函数CHECKSUBMIT,该函数对文本框中输入的页码进行合法性验证,若输入为空或输入的有非数字符号(包括小数点),则仍显示当前页面,否则,提交后将显示要跳转到的页面。 4. 代码共享问题 分页实现大多嵌入在jsp和html代码中,且同界面结合密切,提供统一的嵌入文件或bean实现难度较大,且实现起来实际代码复用程度仍然较低,参考多数实际的页面编程实例,未对代码复用给出理想的解决办法,因此给出实现步骤,可在需要分页的地方按照此方法实现。 详细步骤如下: 一、分页步骤一:定义分页用到的变量 <% int intPageSize; //一页显示的记录数 int intRowCount; //记录总数 int intPageCount; //总页数 int intPage; //待显示页码 java.lang.String strPage; int i,j,k; intPageSize = 6; //设置一页显示的记录数 %> 二、分页步骤二:计算总页数、当前页数 String sql2="select count(*) " + " from destset a,message b,person p" + " where a.message_id = b.id " + " and b.status = 1 " + " and b.servicetype=1 " + " and a.dest_id = " + person_id + " and p.id = b.creator_id "; pstmt = con.prepareStatement(sql2); rs = pstmt.executeQuery(sql2); rs.next(); intRowCount=rs.getInt(1); intPageCount = (intRowCount+intPageSize-1) / intPageSize; //取得总页码 strPage = request.getParameter("page"); //取得待显示页码 if(strPage==null) { intPage = 1; //表明在QueryString中没有page这一个参数,此时显示第一页数据 } else { intPage = java.lang.Integer.parseInt(strPage); //将字符串转换成整型 if(intPage<1) intPage = 1; if(intPage>intPageCount) intPage=intPageCount; } int startRecord=(intPage-1) * intPageSize+1; //计算要当前页显示的第一条记录序号 int endRecord=startRecord+intPageSize-1; //计算当前页显示的最后一条记录序号 %> 三、分页步骤三:修改结果集,使RS集变得最小,提高显示速度 <% String sql1 = " select a.id,a.status,b.creator_id,b.title,b.createdate,b.abstract, " + " p.name as creator_name" + " from destset a,message b,person p" + " where a.message_id = b.id " + " and b.status = 1 " + " and b.servicetype=1 " + " and a.dest_id = " + person_id + " and p.id = b.creator_id " + " order by a.destdate desc"; String sql="select * from(" + "select rownum as rw,a1.* from ("+sql1+") a1 where rownum<="+endRecord + ") m" + " where rw>="+startRecord + "order by m.id desc"; 四、分页步骤四:计算页底要显示的页码,包括开始页码和结束页码 <form name="go" method="post" target="list"> <% int outpage=8; int startpage; int endpage; if(intPage>outpage) { if(intPage%outpage==0) startpage=intPage-outpage+1; else startpage=(intPage/outpage)*outpage+1; } else startpage=1; if(intPageCount<=outpage||intPage==intPageCount) endpage=intPageCount; else if(intPage<=outpage) endpage=outpage; else { if(intPage%outpage==0) endpage=intPage; else endpage=(intPage/outpage+1)*outpage; if(endpage>intPageCount) endpage=intPageCount; } %> <%if(intPage>1) { %> <a href="list_received.jsp?page=<%=intPage-1%>" target="list">上一页</a> <% } if(startpage>outpage) { %> <a href="list_received.jsp?page=<%=startpage-1%>" target="list"><<</a> <% } for(int m=startpage;m<=endpage;m++) { if(m!=intPage) { %> <a href="list_received.jsp?page=<%=m%>" target="list"><font color="blue">[<%=m%>]</font></a> <% } else out.print(m); } if(endpage<intPageCount) { %> <a href="list_received.jsp?page=<%=endpage+1%>" target="list">>></a> <% } if(intPage<intPageCount) { %> <a href="list_received.jsp?page=<%=intPage+1%>" target="list">下一页</a> <% } %> 共<%=intPageCount%>页 转到:<input name="page" size="4" maxlength="4" οnkeydοwn="if(event.keyCode==13){checksubmit();return false;}">页<input type="submit" value="Go" size="4" οnclick="checksubmit();return false"> </form> 五、分页步骤五:定义检测跳转页数函数 function checksubmit() { var strpage; if(document.go.page.value=="") { strpage=<%=intPage%>; } else if(document.go.page.value.indexOf(".")!=-1) { strpage=<%=intPage%>; } else if(isNaN(document.go.page.value)) { strpage=<%=intPage%>; } else { strpage=document.go.page.value; } document.go.action="list_received.jsp?page="+strpage; document.go.submit(); }