JSP分页技术详解Word文档格式.docx

上传人:b****3 文档编号:17126775 上传时间:2022-11-28 格式:DOCX 页数:10 大小:20.67KB
下载 相关 举报
JSP分页技术详解Word文档格式.docx_第1页
第1页 / 共10页
JSP分页技术详解Word文档格式.docx_第2页
第2页 / 共10页
JSP分页技术详解Word文档格式.docx_第3页
第3页 / 共10页
JSP分页技术详解Word文档格式.docx_第4页
第4页 / 共10页
JSP分页技术详解Word文档格式.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

JSP分页技术详解Word文档格式.docx

《JSP分页技术详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《JSP分页技术详解Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。

JSP分页技术详解Word文档格式.docx

<

sqlStmt=sqlCon.createStatement(,

;

strSQL="

selectname,agefromtest"

//执行SQL语句并获取结果集

sqlRst=sqlStmt.executeQuery(strSQL);

//获取记录总数

sqlRst.last();

intRowCount=sqlRst.getRow();

//记算总页数

intPageCount=(intRowCount+intPageSize-1)/intPageSize;

//调整待显示的页码

if(intPage>

intPageCount)intPage=intPageCount;

%>

tableborder="

1"

cellspacing="

0"

cellpadding="

>

tr>

th>

姓名<

/th>

年龄<

/tr>

if(intPageCount>

0){

//将记录指针定位到待显示页的第一条记录上

sqlRst.absolute((intPage-1)*intPageSize+1);

//显示数据

i=0;

while(i<

intPageSize&

&

!

sqlRst.isAfterLast()){

td>

%=sqlRst.getString

(1)%>

/td>

%=sqlRst.getString

(2)%>

sqlRst.next();

i++;

}

/table>

  很显然,这种方法没有考虑到代码重用的问题,不仅代码数量巨大,而且在代码需要修改的情况下,将会无所适从。

使用Vector进行分页

  还见过另一些实现分页的类,是先将所有记录都select出来,然后将ResultSet中的数据都get出来,存入Vector等集合类中,再根据所需分页的大小,页数,定位到相应的位置,读取数据。

或者先使用前面提到的两种分页方法,取得所需的页面之后,再存入Vector中。

  扔开代码的效率不说,单是从程序结构和使用的方便性上讲,就是很糟糕的。

比如,这种做法支持的字段类型有限,int,double,String类型还比较好处理,如果碰到Blob,Text等类型,实现起来就很麻烦了。

这是一种更不可取的方案。

一个新的Pageable接口及其实现

  很显然,看过上面三种实现方法后,我们对新的分页机制有了一个目标,即:

不与具体数据库相关;

尽可能做到代码重用;

尽可能与原JDBC接口的使用方法保持一致;

尽可能高的效率。

  首先,我们需要提供一个与,把它命名为Pageable,接口定义如下:

publicinterfacePageableextends

/**返回总页数

*/

intgetPageCount();

/**返回当前页的记录条数

intgetPageRowsCount();

/**返回分页大小

intgetPageSize();

/**转到指定页

voidgotoPage(intpage);

/**设置分页大小

voidsetPageSize(intpageSize);

/**返回总记录行数

intgetRowsCount();

/**

*转到当前页的第一条记录

*@exception异常说明。

voidpageFirst()throws;

*转到当前页的最后一条记录

voidpageLast()throws;

/**返回当前页号

intgetCurPage();

  这是一个对,主要是增加了对分页的支持,如设置分页大小,跳转到某一页,返回总页数等等。

  接着,我们需要实现这个接口,由于这个接口继承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同,所以这里使用了一个简单的Decorator模式。

  PageableResultSet2的类声明和成员声明如下:

publicclassPageableResultSet2implementsPageable{

protectedrs=null;

protectedintrowsCount;

protectedintpageSize;

protectedintcurPage;

protectedStringcommand="

"

  可以看到,在PageableResultSet2中,包含了一个ResultSet的实例(这个实例只是实现了ResultSet接口,事实上它是由各个数据库厂商分别实现的),并且把所有由ResultSet继承来的方法都直接转发给该实例来处理。

  PageableResultSet2中继承自ResultSet的主要方法:

//……

publicbooleannext()throwsSQLException{

returnrs.next();

publicStringgetString(StringcolumnName)throwsSQLException{

try{

returnrs.getString(columnName);

catch(SQLExceptione){//这里是为了增加一些出错信息的内容便于调试

thrownewSQLException(e.toString()+"

columnName="

+columnName+"

SQL="

+this.getCommand());

//……

  只有在Pageable接口中新增的方法才需要自己的写方法处理。

/**方法注释可参考Pageable.java

publicintgetCurPage(){

returncurPage;

publicintgetPageCount(){

if(rowsCount==0)return0;

if(pageSize==0)return1;

//calculatePageCount

doubletmpD=(double)rowsCount/pageSize;

inttmpI=(int)tmpD;

if(tmpD>

tmpI)tmpI++;

returntmpI;

publicintgetPageRowsCount(){

if(pageSize==0)returnrowsCount;

if(getRowsCount()==0)return0;

if(curPage!

=getPageCount())returnpageSize;

returnrowsCount-(getPageCount()-1)*pageSize;

publicintgetPageSize(){

returnpageSize;

publicintgetRowsCount(){

returnrowsCount;

publicvoidgotoPage(intpage){

if(rs==null)

return;

if(page<

1)

page=1;

if(page>

getPageCount())

page=getPageCount();

introw=(page-1)*pageSize+1;

rs.absolute(row);

curPage=page;

catch(e){

publicvoidpageFirst()throws{

introw=(curPage-1)*pageSize+1;

publicvoidpageLast()throws{

introw=(curPage-1)*pageSize+getPageRowsCount();

publicvoidsetPageSize(intpageSize){

if(pageSize>

=0){

this.pageSize=pageSize;

curPage=1;

  PageableResultSet2的构造方法:

publicPageableResultSet2(rs)throws{

if(rs==null)thrownewSQLException("

givenResultSetisNULL"

"

user"

);

rs.last();

rowsCount=rs.getRow();

rs.beforeFirst();

this.rs=rs;

  这里只是简单的取得一个总记录数,并将记录游标移回初始位置(beforefirst),同时将参数中的ResultSet赋给成员变量。

Pageable的使用方法

  因为Pageable接口继承自ResultSet,所以在使用方法上与ResultSet一致,尤其是在不需要分页功能的时候,可以直接当成ResultSet使用。

而在需要分页时,只需要简单的setPageSize,gotoPage,即可。

PreparedStatementpstmt=null;

Pageablers=null;

……//构造SQL,并准备一个pstmt.

rs=newPageableResultSet2(pstmt.executeQuery());

//构造一个Pageable

rs.setPageSize(20);

//每页20个记录

rs.gotoPage

(2);

//跳转到第2页

for(inti=0;

i<

rs.getPageRowsCount();

i++){//循环处理

intid=rs.getInt(“ID”);

……//继续处理

%@pagecontentType="

text/html;

charset=gb2312"

%>

%@pagelanguage="

java"

import="

java.sql.*"

html>

head>

title>

JSP连接SQL数据库实现数据分页显示<

/title>

/head>

body>

h1align="

center"

/h1>

%

Class.forName("

).newInstance();

Stringurl="

jdbc:

microsoft:

DatabaseName=pubs"

Stringuser="

sa"

Stringpassword="

123"

Connectionconn=DriverManager.getConnection(url,user,password);

Statementstmt=

conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);

Stringsql="

select*fromemployee"

ResultSetrs=stmt.executeQuery(sql);

intpageSize;

//一页显示的记录数

inttotalItem;

//记录总数

inttotalPage;

//总页数

intcurPage;

//待显示页码

StringstrPage;

inti;

pageSize=10;

//设置一页显示的记录数

strPage=request.getParameter("

page"

//获得待显示页码

if(strPage==null)

{

curPage=1;

}

else

curPage=;

//将字符串转换成整形

if(curPage<

1)

rs.last();

totalItem=rs.getRow();

totalPage=(totalItem+pageSize-1)/pageSize;

if(curPage>

totalPage)curPage=totalPage;

if(totalPage>

0)

{//将记录指针到待显示页的第一条记录上

rs.absolute((curPage-1)*pageSize+1);

i=0;

<

tablewidth="

60%"

border="

align="

bordercolor="

#996699"

bgcolor="

#FFFFFF"

trbgcolor="

#CCFFFF"

tdalign="

emp_id<

fname<

minit<

lname<

job_id<

job_lvl<

pud_id<

hire_date<

%//显示数据

while(i<

pageSize&

rs.isAfterLast())

%=rs.getString

(1)%>

!

---取出表中第一个字段-->

%=rs.getString

(2)%>

%=rs.getString(3)%>

%=rs.getString(4)%>

%=rs.getString(5)%>

%=rs.getString(6)%>

%=rs.getString(7)%>

%=rs.getString(8)%>

rs.next();

i++;

palign="

共<

%=totalItem%>

个记录,分<

%=totalPage%>

页显示,当前页是:

第<

%=curPage%>

页<

br/>

%if(curPage>

1){%>

ahref="

page.jsp?

page=1"

首页<

/a>

%}%>

nbsp;

page=<

%=curPage-1%>

上一页<

for(intj=1;

j<

=totalPage;

j++)

out.print("

ahref='

page="

+j+"

'

&

%if(curPage<

totalPage){%>

%=curPage+1%>

下一页<

%if(totalPage>

末页<

rs.close();

stmt.close();

conn.close();

/body>

/html>

总结

  一个好的基础类应该是便于使用,并且具备足够的可移植性,同时要保证其功能的完善。

在上面的实现中,我们从,并实现了它。

这就保证了在使用中与JDBC原有操作的一致性,同时对原有功能没有缩减。

  同时它也是易于使用的,因为封装了一切必要的操作,所以在你的代码中唯一显得"

难看"

和"

不舒服"

的地方就是需要自己去构造一个PageableResultSet2。

不过只要你愿意,这也是可以解决的。

  当然它也有具有充分的可移植性,当你将数据库由Oracle变为Mysql或者SQLServer的时候,你仍然可以使用这些分页的代码。

它在使用中(或者说在移植的过程中)唯一的限制就是你必须要使用一个支持JDBC2的驱动(现在明白为什么我把类命名为PageableResultSet2了吧。

:

P),不过,好在JDBC2已经成为标准了,绝大多数的数据库(如Oracle,Mysql,SQLServer)都有自己的或者第三方提供的JDBC2的驱动。

  OK,这个分页的实现是否对你的编程有帮助呢?

仔细看看,其实真正自己写的代码并不多的,大部分都只是简单的转发操作。

一个合适的模式应用可以帮你很大忙。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 药学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1