JAVA分页-使用多种方法实现分页技术.txt成熟不是心变老而是眼泪在眼里打转却还保持微笑。把一切平凡的事做好既不平凡把一切简单的事做对既不简单。////在struts中分页的一种实现//////////
我的项目中的分页功能 1 思
使用一个页面控制类它记录页面信息如上页下页当前页等。在查询的Action中将这个控制类和查询条件一起传递给数据库访问bean然后将这两个参数保存在用户session中。在分页控制Action中利用接收到的分页参数调用数据库访问的bean.
2,实现
(1)分页控制类 /* author nick
* Created on 2004-3-18
* file name:ageController.java * * */
ackage com.tower.util; /**
* author nick * 2004-3-18
* 用来进行翻页控制 * */
ublic class ageController {
int totalRowsAmount; //总行数
boolean rowsAmountSet; //是否设置过totalRowsAmount int ageSize=2; //每页行数 int currentage=1; //当前页码 int nextage; int reviousage;
int totalages; //总页数
boolean hasNext; //是否有下一页
boolean hasrevious; //是否有前一页 String descrition; int ageStartRow; int ageEndRow;
ublic ageController(int totalRows){ setTotalRowsAmount(totalRows); }
ublic ageController(){} /** * aram i
* 设定总行数 */
ublic void setTotalRowsAmount(int i) { if(!this.rowsAmountSet){ totalRowsAmount = i;
totalages=totalRowsAmount/ageSize+1; setCurrentage(1);
this.rowsAmountSet=true; } } /** * aram i *
* 当前页 * */
ublic void setCurrentage(int i) { currentage = i;
nextage=currentage+1; reviousage=currentage-1;
//计算当前页开始行和结束行
if(currentage*ageSize<totalRowsAmount){ ageEndRow=currentage*ageSize; ageStartRow=ageEndRow-ageSize+1;
}else{
ageEndRow=totalRowsAmount;
ageStartRow=ageSize*(totalages-1)+1; }
//是否存在前页和后页
if (nextage>totalages){ hasNext=false; }else{
hasNext=true; }
if(reviousage==0){ hasrevious=false; }else{
hasrevious=true; };
System.out.rintln(this.descrition()); } /** * return */
ublic int getCurrentage() { return currentage; } /** * return */
ublic boolean isHasNext() { return hasNext; } /** * return */
ublic boolean isHasrevious() { return hasrevious; } /** * return */
ublic int getNextage() { return nextage; } /** * return */
ublic int getageSize() { return ageSize; } /** * return */
ublic int getreviousage() { return reviousage; } /** * return */
ublic int getTotalages() { return totalages; } /** * return */
ublic int getTotalRowsAmount() { return totalRowsAmount; } /**
* aram b */
ublic void setHasNext(boolean b) { hasNext = b; } /**
* aram b */
ublic void setHasrevious(boolean b) { hasrevious = b;
} /** * aram i */
ublic void setN
extage(int i) { nextage = i; } /** * aram i */
ublic void setageSize(int i) { ageSize = i; } /** * aram i */
ublic void setreviousage(int i) { reviousage = i; } /** * aram i */
ublic void setTotalages(int i) { totalages = i; } /** * return */
ublic int getageEndRow() { return ageEndRow; } /** * return */
ublic int getageStartRow() {
return ageStartRow; }
ublic String getDescrition(){
String descrition="Total:"+this.getTotalRowsAmount()+ " items "+this.getTotalages() +" ages"; // this.currentage+" revious "+this.hasrevious + // " Next:"+this.hasNext+
// " start row:"+this.ageStartRow+ // " end row:"+this.ageEndRow; return descrition; }
ublic String descrition(){
String descrition="Total:"+this.getTotalRowsAmount()+
" items "+this.getTotalages() +" ages,Current age:"+ this.currentage+" revious "+this.hasrevious + " Next:"+this.hasNext+
" start row:"+this.ageStartRow+ " end row:"+this.ageEndRow; return descrition; }
ublic static void main(String args[]){ ageController c=new ageController(3); System.out.rintln(c.getDescrition()); // c.setCurrentage(2);
// System.out.rintln(c.descrition()); // c.setCurrentage(3);
// System.out.rintln(c.descrition()); } }
(2)查询Action的代码片断
ublic ActionForward execute( ActionMaing maing, ActionForm form,
HttServletRequest request, HttServletResonse resonse) throws Excetion {
Base queryForm= (Base) form;
if(!queryForm.getName().equals("")){ ageController c=new ageController();
EmloyeeBase service=new EmloyeeBase();
ArrayList result=(ArrayList)service.search(queryForm,c);
HttSession session=request.getSession();
session.setAttribute("queryForm",queryForm);
session.setAttribute("ageController",service.getageController());
request.setAttribute("queryResult",result);
request.setAttribute("ageController",service.getageController()); return maing.findForward("haveResult"); }else{
return maing.findForward("noResult"); } }
(3)翻页Action的代码片断
ublic ActionForward execute( ActionMaing maing, ActionForm form,
HttServletRequest request, HttServletResonse resonse) throws Excetion {
//读取翻页参数
TurnageForm turnageForm=(TurnageForm)form;
//从ageController中取出查询信息并使用bean提的调用接口处理结果
HttSession session=request.getSession();
ageController c=(ageController)session.getAttribute("ageController"); Base queryForm=(Base)session.getAttribute("queryForm");
c.setCurrentage(turnageForm.getViewage());
EmloyeeBase service=new EmloyeeBase();
ArrayList result=(ArrayList)service.search(queryForm,c);
//根据参数将数据写入 request
request.removeAttribute("queryResult"); request.removeAttribute("ageController"); request.setAttribute("queryResult",result); request.setAttribut
e("ageController",c);
//forward 到显示页面
return maing.findForward("haveResult"); }
(4)数据库访问bean中的片断
ublic Collection search(Base base, ageController c) throws SQLExcetion {
ArrayList ems = new ArrayList();
ResultSet rs = getSearchResult(base);
rs.absolute(-1);
c.setTotalRowsAmount(rs.getRow()); setageController(c); if (rs.getRow() > 0) {
rs.absolute(c.getageStartRow());
do {
System.out.rintln("in loo" + rs.getRow());
Base b = new Base();
b.setName(rs.getString("Name")); b.setIdCard(rs.getString("IDCard"));
System.out.rintln("From db:" + rs.getString("IDCard")); ems.add(b); if (!rs.next()) { break; }
} while (rs.getRow() < (c.getageEndRow() + 1)); }
return ems; }
(5)在js中翻页部分的代码片断
<bean:write name="ageController" roerty="descrition"/>
<logic:equal name="ageController" roerty="hasrevious" value="true"> <a ageController" roerty="reviousage"/>" class="a02"> revious </a>
</logic:equal>
<logic:equal name="ageController" roerty="hasNext" value="true"> <a ageController" roerty="nextage"/>" class="a02"> Next
</a>
</logic:equal>
这样一来翻页的功能可以以你喜欢的方式表现给client
版权声明本篇文章对您是否有帮助?投票:是否投票结果:
作者其它文章:
Struts处理用户表单请求的核心源代码: Struts例子的设计分析(转)- - struts简单例子的分析
使用struts,ibaits和JSTL开发简便通用的文件上传系统 Struts标记库 作者全部文章
人:fangxia 参与分: 593 专家分: 15 发表时间: 2005-03-30 14:31 思8错谢谢。。
这个文章共有 1 条共 1 页
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$$$$$$$$$$$$$$$$JS页面查询显示常用模式
1.直接使用ResultSet 2.Value Object
3.hashma key,value 4.RowSet
------------------------ 1.直接使用ResultSet 最大众化的方法
原文中忽略了这一方法偶给加上了 代码略
2.
使用Value Object。将每条记录均封装成JavaBean对象把这些对象装入Collection传送给JS显示
。这种方法的缺点是每一种查询都需要定义一个java class并且将记录数据封装成java对象时也需要很
多额外的代码。 示例代码:
//查询数据代码
Connection conn = DBUtil.getConnection(); rearedStatement st = null; ResultSet rs = null; try{
String sql=“select em_code, real_name from t_emloyee where organ_id=?”; st = conn.rearedStatement(sql); st.setString(1, “101”);
ResultSet rs = st.executeQuery(); List list = new ArrayList(); Emloyee em
; while (rs.next()){ em = new Emloyee();
em.setReakName(rs.getString(“real_name”)); em.setEmCode(rs.getString(“em_code”)); …
list.add(em); }
return list; }finally{
DBUtil.close(rs, st ,conn); }
//js显示部分代码 <%
List emList = (List)request.getAttribute(“emList”); if (emList == null) emList = Collections.EMTY_LIST; %> …
<table cellsacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr> <%
Emloyee em;
for (int i=0; i< emList.size(); i++){ em = (Emloyee) emList.get(i); %>
<tr>
<td><%= em.getEmCode()%></td> <td><%= em.getRealName()%></td> </tr> <%
}// end for %>
</table> 3.
使用hashma作为数据容器。 具体做法:
1.生成一个List对象(List list = new ArrayList() )。
2.生成一个Ma对象(Ma ma = new HashMa() )。使用Ma封装一行数据key为各字段名value
为对应的值。(ma.ut(“USER_NAME”), rs.getString(“USER_NAME”)) 3.将第2 步生成的Ma对象装入第1步的list对象中(list.add(ma) )。 4.重复2、3步直到ResultSet遍历完毕
在DBUtil. resultSetToList(ResultSet rs)方法中实现了上述过程(所有列名均使用大写)可参考使用。
HashMa ma = null;
while(rs.next(){
ma = new HashMa();
ma.ut("Field1",rs.getString("Field1")); ma.ut("Field2",rs.getString("Field2")); *****
ma.ut("fieldn",rs.getString("fieldn")); }
以上是写死的
可以使用ResultSetMetadata进行干净彻底的一次性封装 可以取到rs中所有字段名
String name = null;
ResultSetMetaData rsmd = rs.getMetaData(); int num = rsmd.getColumnCount(); int i = 0;
while(rs.next()){
for(i=1;i<=num;i++){
name = rsmd.getColumnName(i);
ma.ut("name",rs.getString("rs")); }/*end for*/ }/*end while*/
示例代码:
//查询数据部分代码: …
Connection conn = DBUtil.getConnection(); rearedStatement st = null; ResultSet rs = null; try{
String sql=“select em_code, real_name from t_emloyee where organ_id=?”; st = conn.rearedStatement(sql); st.setString(1, “101”); rs = st.executeQuery();
List list = DBUtil. resultSetToList(ResultSet rs); return list; }finally{
DBUtil.close(rs, st ,conn); }
//JS显示部分代码 <%
List emList = (List)request.getAttribute(“emList”); if (emList == null) emList = Collections.EMTY_LIST; %> …
<table cellsacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr> <%
Ma colMa;
for (int i=0; i< emList.size(); i++){ colMa = (Ma) emList.get(i); %>
<tr>
<td><%=colMa.get(“EM_CODE”)%></td> <td><%=colMa.get(“REAL_NAME”)%></td> </tr> <%
}// end for %>
</table> 4.
使用RowSet。
RowSet是JDBC2.0中提的接口,
Oracle对该接口有相应实现其中很有用的是
oracle.jdbc.rowset.OracleCachedRowSet。 OracleCachedRowSet实现了ResultSet中的所有方法但与
ResultSet不同的是OracleCachedRowSet中的数据在Connection关闭后仍然有效。
oracle的rowset实现在htt://otn.oracle.com/software/content.html的jdbc下载里有名称是
ocrs12.zi
示例代码:
//查询数据部分代码: imort javax.sql.RowSet;
imort oracle.jdbc.rowset.OracleCachedRowSet; …
Connection conn = DBUtil.getConnection(); rearedStatement st = null; ResultSet rs = null;
try{……
String sql=“select em_code, real_name from t_emloyee where organ_id=?”; st = conn.rearedStatement(sql); st.setString(1, “101”); rs = st.executeQuery();
OracleCachedRowSet ors = newOracleCachedRowSet(); //将ResultSet中的数据封装到RowSet中 ors.oulate(rs); return ors; }finally{
DBUtil.close(rs, st, conn); }
//JS显示部分代码 <%
javax.sql.RowSet emRS = (javax.sql.RowSet) request.getAttribute(“emRS”); %> …
<table cellsacing="0" width=”90%”>
<tr> <td>代码</td> <td>姓名</td> </tr> <%
if (emRS != null) while (emRS.next() ) { %>
<tr>
<td><%= emRS.get(“EM_CODE”)%></td> <td><%= emRS.get(“REAL_NAME”)%></td> </tr> <%
}// end while %>
</table>
适用场合:
1.ResultSet适合于短平快项目纯JS方案最适合
2.value object
使用于定制的查询操作,个人认为该方法比较SB而许多人却乐此不疲 如果使用struts,ibatis,hibernate等开发基本上属于此中模式 使用value object其实还是一个比较重量级的方案如果不使用 EJB或web sevice等分布式方案确实没有使用value object的必要 大家都倡导轻量级的解决方案为何不更轻松些使用方法1或3 写一大堆value bean无论是从开发工作量和维护上都是一个噩梦
3.HashMa充当数据容器
适用于多条查询语句或需要对查询结果进行处理的情况。 该方法比较不错灵活机动适用范围广 纯JSEJBWEB SERVICE均适用 4.RowSet
适合于单条查询语句适用于快速开发。
RowSet本身就是一种数据容器其功能与hashma差不多 方法3可以取代方法4
版权声明本篇文章对您是否有帮助?投票:是否投票结果:
作者其它文章:
jdbc驱动导致的中文问题 在项目中使用Struts-menu 企业管理软件的需求描述方法
web开发中的多条件查询处理技巧1则 valuelist简介 作者全部文章
人:robornet 参与分: 636 专家分: 55 来自: 阳光岛 发表时间: 2005-04-26 08:41 ??得不??何第
二?方法?第三?方法的示例代?一?呢?
人:robornet 参与分: 636 专家分: 55 来自: 阳光岛 发表时间: 2005-04-26 08:42
总结得不错为何第二种方法与第三种方法的示例代码一样呢?
人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 08:50 方法23不一样的把 2要写valuebean
3使用hashma充当数据容器
把每条记录都放到一个hashma中然后把 hashma放到list里
人:giscat 参与分: 16832 专家分: 1787 发表时间: 2005-04-26 09:03 改了一下
HashMa ma = null;
while(rs.next(){
ma = new HashMa();
ma.ut("Field1",rs.getString("Field1")); ma.ut("Field2",rs.getString("Field2")); *****
ma.ut("fieldn",rs.getString("fieldn")); }
以上是写死的
可以使用ResultSetMetadata进行干净彻底的一次性封装 可以取到rs中所有字段名
String name = null;
ResultSetMetaData rsmd = rs.getMetaData(); int num = rsmd.getColumnCount(); int i = 0;
while(rs.next()){
for(i=1;i<=num;i++){
name = rsmd.getColumnName(i);
ma.ut("name",rs.getString("rs")); }/*end for*/ }/*end while*/
这个文章共有 4 条共 1 页
上一篇文章返回〔JS/Servlet/JSF〕 下一篇文章
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
$$$$$$$$$$$$$$$$JS分页技术实现
title: JS分页技术实现
summary:使用工具类实现通用分页处理 author: evan_zhao
email: evan_zhaohotmail.com
目前比较广泛使用的分页方式是将查询结果缓存在HttSession或有状态bean中翻页的时候从缓存中取出一页数据显示。这种方法有两个主要的缺点:一是用户可能看到的是过期数据;二是如果数据量非常大时第一次查询遍历结果集会耗费很长时间并且缓存的数据也会占用大量内存效率明显下降。
其它常见的方法还有每次翻页都查询一次数据库从ResultSet中只取出一页数据(使用rs.last();rs.getRow()获得总计录条数使用rs.absolute()定位到本页起始记录)。这种方式在某些数据库(如oracle)的JDBC实现中差不多也是需要遍历所有记录实验证明在记录数很大时速度非常慢。
至于缓存结果集ResultSet的方法则完全是一种错误的做法。因为ResultSet在Statement或Connection关闭时也会被关闭如果要使ResultSet有效势必长时间占用数据库连接。
因此比较好的分页做法应该是每次翻页的时候只从数据库里检索页面大小的块区的数据。这样虽然每次翻页都需要查询数据库但查询出的记录数很少络传输数据量不大如果使用连接池更可以略过最耗时的建立数据
库连接过程。而在数据库端有各种成熟的优化技术用于提高查询速度比在应用服务器层做缓存有效多了。
在oracle数据库中查询结果的行号使用伪列ROWNUM表示(从1开始)。例如select * from emloyee where rownum<10 返回前10条记录。但因为rownum是在查询之后排序之前赋值的所以查询emloyee按birthday排序的第100到120条记录应该这么写: [re] select * from (
select my_table.*, rownum as my_rownum from ( select name, birthday from emloyee order by birthday ) my_table where rownum <120 ) where my_rownum>=100 [/re]
mySQL可以使用LIMIT子句:
select name, birthday from emloyee order by birthday LIMIT 99,20 DB2有rownumber()函数用于获取当前行数。
SQL Server没研究过可以参考这篇文章:htt://.csdn.net/develo/article/18/18627.shtm
在Web程序中分页会被频繁使用但分页的实现细节却是编程过程中比较麻烦的事情。大多分页显示的查询操作都同时需要处理复杂的多重查询条件sql语句需要动态拼接组成再加上分页需要的记录定位、总记录条数查询以及查询结果的遍历、封装和显示程序会变得很复杂并且难以理解。因此需要一些工具类简化分页代码使程序员专注于业务逻辑部分。下面是我设计的两个工具类:
agedStatement 封装了数据库连接、总记录数查询、分页查询、结果数据封装和关闭数据库连接等操作并使用了rearedStatement支持动态设置参数。 RowSetage 参考etStore的age by age iterator模式设计 RowSetage用于封装查询结果(使用OracleCachedRowSet缓存查询出的一页数据关于使用CachedRowSet封装数据库查询结果请参考JS页面查询显示常用模式)以及当前页码、总记录条数、当前记录数等信息并且可以生成简单的HTML分页代码。 agedStatement 查询的结果封装成Rowsetage。
下面是简单的使用示例:
//DAO查询数据部分代码: …
ublic RowSetage getEmloyee(String gender, int ageNo) throws Excetion{
String sql="select em_id, em_code, user_name, real_name from emloyee where gender =?";
//使用Oracle数据库的分页查询实现,每页显示5条
agedStatement st =new agedStatementOracleIml(sql, ageNo, 5); st.setString(1, gender); return st.executeQuery(); }
//Servlet处理查询请求部分代码: …
int ageNo; try{
//可以通过参数ageno获得用户选择的页码
ageNo = Integer.arseInt(request.getarameter("ageno") ); }catch(Excetion ex){ //默认为第一页 ageNo=1; }
String gender = request.getarameter("gender"
);
request.setAttribute("emage", myBean.getEmloyee(gender, ageNo) ); …
//JS显示部分代码
<% age imort = "age.RowSetage"%> …
<scrit language="javascrit"> function doQuery(){
form1.actionTye.value="doQuery"; form1.submit(); }
</scrit> …
<form name=form1 method=get> <inut tye=hidden name=actionTye> 性别: <inut tye=text name=gender size=1 value="<%=request.getarameter("gender")%>"> <inut tye=button value=" 查询" onclick="doQuery()"> <%
RowSetage emage = (RowSetage)request.getAttribute("emage"); if (emage == null ) emage = RowSetage.EMTY_AGE; %> …
<table cellsacing="0" width="90%">
<tr> <td>ID</td> <td>代码</td> <td>用户名</td> <td>姓名</td> </tr>
<%
javax.sql.RowSet emRS = (javax.sql.RowSet) emage.getRowSet(); if (emRS!=null) while (emRS.next() ) { %>
<tr>
<td><%= emRS.getString("EM_ID")%></td> <td><%= emRS.getString("EM_CODE")%></td> <td><%= emRS.getString("USER_NAME")%></td> <td><%= emRS.getString("REAL_NAME")%></td> </tr> <%
}// end while %> <tr> <%
//显示总页数和当前页数(ageno)以及分页代码。
//此处doQuery为页面上提交查询动作的javascrit函数名 ageno为标识当前页码的参数名 %> <td colsan=4><%= emage .getHTML("doQuery", "ageno")%></td> </tr> </table> </form>
效果如图:
因为分页显示一般都会伴有查询条件和查询动作页面应已经有校验查询条件和提交查询的javascrit方法(如上面的doQuery)所以 RowSetage.getHTML()生成的分页代码在用户选择新页码时直接回调前面的处理提交查询的javascrit方法。注意在显示查询结果的时候上次的查询条件也需要保持如<inut tye=text name=gender size= 1 value="<%=request.getarameter("gender")%>">。同时由于页码的参数名可以指定因此也支持在同一页面中有多个分页区。
另一种分页代码实现是生成每一页的URL将查询参数和页码作为QueryString附在URL后面。这种方法的缺陷是在查询条件比较复杂时难以处理并且需要指定处理查询动作的servlet可能不适合某些定制的查询操作。
如果对RowSetage.getHTML()生成的默认分页代码不满意可以编写自己的分页处理代码RowSetage提了很多getter方法用于获取相关信息(如当前页码、总页数、总记录数和当前记录数等)。
在实际应用中可以将分页查询和显示做成js taglib 进一步简化JS代码屏蔽Java Code。
附:分页工具类的源代码有注释应该很容易理解。
1.age.java 2.RowSetage.
java(RowSetage继承age) 3.agedStatement.java
4.agedStatementOracleIml.java(agedStatementOracleIml继承agedStatement)
您可以任意使用这些源代码但必须保留author evan_zhaohotmail.com字样
/////////////////////////////////// //
// age.java
// author: evan_zhaohotmail.com //
///////////////////////////////////
ackage age;
imort java.util.List;
imort java.util.ArrayList; imort java.util.Collection; imort java.util.Collections; /**
* Title: 分页对象<br>
* Descrition: 用于包含数据及分页信息的对象<br>
* age类实现了用于显示分页信息的基本方法但未指定所含数据的类型
* 可根据需要实现以特定方式组织数据的子类<br>
* 如RowSetage以RowSet 封装数据Listage以List封装数据<br>
* Coyright: Coyright (c) 2002 <br> * author evan_zhaohotmail.com <br> * version 1.0 */
ublic class age imlements java.io.Serializable {
ublic static final age EMTY_AGE = new age(); ublic static final int DEFAULT_AGE_SIZE = 20; ublic static final int MAX_AGE_SIZE = 9999;
rivate int myageSize = DEFAULT_AGE_SIZE;
rivate int start;
rivate int avaCount,totalSize; rivate Object data;
rivate int currentageno; rivate int totalageCount; /**
* 默认构造方法只构造空页 */
rotected age(){
this.init(0,0,0,DEFAULT_AGE_SIZE,new Object()); } /**
* 分页数据初始方法由子类调用
* aram start 本页数据在数据库中的起始位置 * aram avaCount 本页包含的数据条数 * aram totalSize 数据库中总记录条数 * aram ageSize 本页容量 * aram data 本页包含的数据 */
rotected void init(int start, int avaCount, int totalSize, int ageSize, Object data){
this.avaCount =avaCount; this.myageSize = ageSize;
this.start = start;
this.totalSize = totalSize;
this.data=data;
//System.out.rintln("avaCount:"+avaCount); //System.out.rintln("totalSize:"+totalSize); if (avaCount>totalSize) {
//throw new RuntimeExcetion("记录条数大于总条数?!"); }
this.currentageno = (start -1)/ageSize +1;
this.totalageCount = (totalSize + ageSize -1) / ageSize;
if (totalSize==0 &am;&am; avaCount==0){ this.currentageno = 1; this.totalageCount = 1; }
//System.out.rintln("Start Index to age No: " + start + "-" + currentageno); }
ublic Object getData(){ return this.data; } /**
* 取本页数据容量(本页能包含的记录数) * return 本页能包含的记录数 */ u
blic int getageSize(){ return this.myageSize; } /**
* 是否有下一页
* return 是否有下一页 */
ublic boolean hasNextage() { /*
if (avaCount==0 &am;&am; totalSize==0){ return false; }
return (start + avaCount -1) < totalSize; */
return (this.getCurrentageNo()<this.getTotalageCount()); } /**
* 是否有上一页
* return 是否有上一页
*/
ublic boolean hasreviousage() { /*
return start > 1; */
return (this.getCurrentageNo()>1); } /**
* 获取当前页第一条数据在数据库中的位置 * return */
ublic int getStart(){ return start; } /**
* 获取当前页最后一条数据在数据库中的位置 * return */
ublic int getEnd(){
int end = this.getStart() + this.getSize() -1; if (end<0) { end = 0; }
return end; } /**
* 获取上一页第一条数据在数据库中的位置 * return 记录对应的rownum */
ublic int getStartOfreviousage() { return Math.max(start-myageSize, 1); } /**
* 获取下一页第一条数据在数据库中的位置 * return 记录对应的rownum */
ublic int getStartOfNextage() { return start + avaCount; }
/**
* 获取任一页第一条数据在数据库中的位置每页条数使用默认值 * aram ageNo 页号
* return 记录对应的rownum */
ublic static int getStartOfAnyage(int ageNo){
return getStartOfAnyage(ageNo, DEFAULT_AGE_SIZE); } /**
* 获取任一页第一条数据在数据库中的位置 * aram ageNo 页号
* aram ageSize 每页包含的记录数 * return 记录对应的rownum */
ublic static int getStartOfAnyage(int ageNo, int ageSize){ int startIndex = (ageNo-1) * ageSize + 1; if ( startIndex < 1) startIndex = 1;
//System.out.rintln("age No to Start Index: " + ageNo + "-" + startIndex);
return startIndex; } /**
* 取本页包含的记录数 * return 本页包含的记录数 */
ublic int getSize() { return avaCount; } /**
* 取数据库中包含的总记录数 * return 数据库中包含的总记录数 */
ublic int getTotalSize() { return this.totalSize; } /**
* 取当前页码 * return 当前页码 */
ublic int getCurrentageNo(){ return this.currentageno; } /**
* 取总页码 * return 总页码 */
ublic int getTotalageCount(){ return this.totalag
eCount; } /** *
* aram queryJSFunctionName 实现分页的JS脚本名字页码变动时会自动回调该方法
* aram ageNoaramName 页码参数名称 * return */
ublic String getHTML(String queryJSFunctionName, String ageNoaramName){
因篇幅问题不能全部显示,请点此查看更多更全内容