JSP分页技术实现Word格式.docx

上传人:b****3 文档编号:17397427 上传时间:2022-12-01 格式:DOCX 页数:25 大小:25.78KB
下载 相关 举报
JSP分页技术实现Word格式.docx_第1页
第1页 / 共25页
JSP分页技术实现Word格式.docx_第2页
第2页 / 共25页
JSP分页技术实现Word格式.docx_第3页
第3页 / 共25页
JSP分页技术实现Word格式.docx_第4页
第4页 / 共25页
JSP分页技术实现Word格式.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

JSP分页技术实现Word格式.docx

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

JSP分页技术实现Word格式.docx

birthday

) 

my_table 

<

120

my_rownum>

=100

[/pre]

  mySQL可以使用LIMIT子句:

    select 

LIMIT 

99,20

  DB2有rownumber()函数用于获取当前行数。

  SQL 

Server没研究过,可以参考这篇文章:

  在Web程序中分页会被频繁使用,但分页的实现细节却是编程过程中比较麻烦的事情。

大多分页显示的查询操作都同时需要处理复杂的多重查询条件,sql语句需要动态拼接组成,再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示,程序会变得很复杂并且难以理解。

因此需要一些工具类简化分页代码,使程序员专注于业务逻辑部分。

下面是我设计的两个工具类:

  PagedStatement 

封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作,并使用了PreparedStatement支持动态设置参数。

  RowSetPage 

参考PetStore的page 

page 

iterator模式, 

设计RowSetPage用于封装查询结果(使用OracleCachedRowSet缓存查询出的一页数据,关于使用CachedRowSet封装数据库查询结果请参考JSP页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息, 

并且可以生成简单的HTML分页代码。

查询的结果封装成RowsetPage。

  下面是简单的使用示例:

//DAO查询数据部分代码:

public 

RowSetPage 

getEmployee(String 

gender, 

int 

pageNo) 

throws 

Exception{

String 

sql="

emp_id, 

emp_code, 

user_name, 

real_name 

gender 

=?

"

;

//使用Oracle数据库的分页查询实现,每页显示5条

PagedStatement 

pst 

=new 

PagedStatementOracleImpl(sql, 

pageNo, 

5);

pst.setString(1, 

gender);

return 

pst.executeQuery();

}

//Servlet处理查询请求部分代码:

pageNo;

try{

//可以通过参数pageno获得用户选择的页码

pageNo 

Integer.parseInt(request.getParameter("

pageno"

);

}catch(Exception 

ex){

//默认为第一页

pageNo=1;

request.getParameter("

gender"

request.setAttribute("

empPage"

 

myBean.getEmployee(gender, 

//JSP显示部分代码

%@ 

import 

page.RowSetPage"

%>

script 

language="

javascript"

>

function 

doQuery(){

form1.actionType.value="

doQuery"

form1.submit();

/script>

form 

name=form1 

method=get>

input 

type=hidden 

name=actionType>

性别:

type=text 

name=gender 

size=1 

value="

%=request.getParameter("

)%>

type=button 

查询 

onclick="

doQuery()"

%

empPage 

(RowSetPage)request.getAttribute("

if 

(empPage 

== 

null 

RowSetPage.EMPTY_PAGE;

table 

cellspacing="

0"

width="

90%"

tr>

td>

ID<

/td>

代码<

用户名<

姓名<

/tr>

javax.sql.RowSet 

empRS 

(javax.sql.RowSet) 

empPage.getRowSet();

(empRS!

=null) 

while 

(empRS.next() 

{

%= 

empRS.getString("

EMP_ID"

EMP_CODE"

USER_NAME"

REAL_NAME"

}// 

end 

while

//显示总页数和当前页数(pageno)以及分页代码。

//此处doQuery为页面上提交查询动作的javascript函数名, 

pageno为标识当前页码的参数名

td 

colspan=4>

.getHTML("

/table>

/form>

  效果如图:

  因为分页显示一般都会伴有查询条件和查询动作,页面应已经有校验查询条件和提交查询的javascript方法(如上面的doQuery),所以RowSetPage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascript方法。

注意在显示查询结果的时候上次的查询条件也需要保持,如<

&

lt;

同时由于页码的参数名可以指定,因此也支持在同一页面中有多个分页区。

  另一种分页代码实现是生成每一页的URL,将查询参数和页码作为QueryString附在URL后面。

这种方法的缺陷是在查询条件比较复杂时难以处理,并且需要指定处理查询动作的servlet,可能不适合某些定制的查询操作。

  如果对RowSetPage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码,RowSetPage提供了很多getter方法用于获取相关信息(如当前页码、总页数、 

总记录数和当前记录数等)。

  在实际应用中可以将分页查询和显示做成jsp 

taglib, 

进一步简化JSP代码,屏蔽Java 

Code。

附:

分页工具类的源代码, 

有注释,应该很容易理解。

1.Page.java

2.RowSetPage.java(RowSetPage继承Page)

3.PagedStatement.java

4.PagedStatementOracleImpl.java(PagedStatementOracleImpl继承PagedStatement)

您可以任意使用这些源代码,但必须保留author 

evan_zhao@字样

///////////////////////////////////

//

// 

Page.java

package 

page;

java.util.List;

java.util.ArrayList;

java.util.Collection;

java.util.Collections;

/**

Title:

分页对象<

br>

Description:

用于包含数据及分页信息的对象<

Page类实现了用于显示分页信息的基本方法,但未指定所含数据的类型,

可根据需要实现以特定方式组织数据的子类,<

如RowSetPage以RowSet封装数据,ListPage以List封装数据<

Copyright:

Copyright 

(c) 

2002 

@author 

evan_zhao@ 

@version 

1.0

*/

class 

Page 

implements 

java.io.Serializable 

static 

final 

EMPTY_PAGE 

new 

Page();

DEFAULT_PAGE_SIZE 

20;

MAX_PAGE_SIZE 

9999;

private 

myPageSize 

DEFAULT_PAGE_SIZE;

start;

avaCount,totalSize;

Object 

data;

currentPageno;

totalPageCount;

默认构造方法,只构造空页

protected 

Page(){

this.init(0,0,0,DEFAULT_PAGE_SIZE,new 

Object());

分页数据初始方法,由子类调用

@param 

start 

本页数据在数据库中的起始位置

avaCount 

本页包含的数据条数

totalSize 

数据库中总记录条数

pageSize 

本页容量

data 

本页包含的数据

void 

init(int 

start, 

avaCount, 

totalSize, 

pageSize, 

data){

this.avaCount 

=avaCount;

this.myPageSize 

pageSize;

this.start 

this.totalSize 

totalSize;

this.data=data;

//System.out.println("

avaCount:

+avaCount);

totalSize:

+totalSize);

(avaCount>

totalSize) 

//throw 

RuntimeException("

记录条数大于总条数?

this.currentPageno 

(start 

-1)/pageSize 

+1;

this.totalPageCount 

(totalSize 

-1) 

(totalSize==0 

avaCount==0){

1;

Start 

Index 

to 

No:

-"

currentPageno);

getData(){

this.data;

取本页数据容量(本页能包含的记录数)

@return 

本页能包含的记录数

getPageSize(){

this.myPageSize;

是否有下一页

boolean 

hasNextPage() 

/*

(avaCount==0 

totalSize==0){

false;

(this.getCurrentPageNo()<

this.getTotalPageCount());

是否有上一页

hasPreviousPage() 

(this.getCurrentPageNo()>

1);

获取当前页第一条数据在数据库中的位置

@return

getStart(){

获取当前页最后一条数据在数据库中的位置

getEnd(){

this.getStart() 

this.getSize() 

-1;

(end<

0) 

0;

end;

获取上一页第一条数据在数据库中的位置

记录对应的rownum

getStartOfPreviousPage() 

Math.max(start-myPageSize, 

获取下一页第一条数据在数据库中的位置

getStartOfNextPage() 

avaCount;

获取任一页第一条数据在数据库中的位置,每页条数使用默认值

页号

getStartOfAnyPage(int 

pageNo){

getStartOfAnyPage(pageNo, 

DEFAULT_PAGE_SIZE);

获取任一页第一条数据在数据库中的位置

每页包含的记录数

pageSize){

startIndex 

(pageNo-1) 

( 

1) 

No 

Index:

startIndex);

startIndex;

取本页包含的记录数

本页包含的记录数

getSize() 

取数据库中包含的总记录数

数据库中包含的总记录数

getTotalSize() 

this.totalSize;

取当前页码

当前页码

getCurrentPageNo(){

this.currentPageno;

取总页码

总页码

getTotalPageCount(){

this.totalPageCount;

*

queryJSFunctionName 

实现分页的JS脚本名字,页码变动时会自动回调该方法

pageNoParamName 

页码参数名称

getHTML(String 

queryJSFunctionName, 

pageNoParamName){

(getTotalPageCount()<

1){

type='

hidden'

name='

+pageNoParamName+"

'

value='

1'

(queryJSFunctionName 

|| 

queryJSFunctionName.trim().length()<

gotoPage"

(pageNoParamName 

pageNoParamName.trim().length()<

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

当前位置:首页 > 高中教育 > 语文

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

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