JSP分页技术实现Word格式.docx
《JSP分页技术实现Word格式.docx》由会员分享,可在线阅读,更多相关《JSP分页技术实现Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
![JSP分页技术实现Word格式.docx](https://file1.bdocx.com/fileroot1/2022-12/1/c59a5f60-9ac7-4c5e-aed6-e74f6fdb240b/c59a5f60-9ac7-4c5e-aed6-e74f6fdb240b1.gif)
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()<