求教java分页java负载均衡解决方案案

君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
求教java分页解决方案
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口&JAVA分页-使用多种方法实现分页技术
秒后自动跳转到登录页
(奖励5下载豆)
快捷登录:
举报类型:
不规范:上传重复资源
不规范:标题与实际内容不符
不规范:资源无法下载或使用
其他不规范行为
违规:资源涉及侵权
违规:含有危害国家安全等内容
违规:含有反动/色情等内容
违规:广告内容
详细原因:
任何违反下载中心规定的资源,欢迎Down友监督举报,第一举报人可获5-10下载豆奖励。
视频课程推荐
JAVA分页-使用多种方法实现分页技术
上传时间:
技术分类:
资源评价:
(15位用户参与评价)
已被下载&179&次
我的项目中的分页功能1, 思路使用一个页面控制类,它记录页面信息,如上页,下页,当前页等。在查询的Action中,将这个控制类和查询条件一起传递给数据库访问bean,然后将这两个参数保存在用户session中。在分页控制Action中,利用接收到的分页参数调用数据库访问的bean.2,实现(1)分页控制类
本资料共包含以下附件:
JAVA分页-使用多种方法实现分页技术1.txt
(15位用户参与评价)
down友评价
51CTO下载中心常见问题:
1.如何获得下载豆?
1)上传资料
2)评论资料
3)每天在首页签到领取
4)购买VIP会员服务,无需下载豆下载资源
5)更多途径:点击此处
2.如何删除自己的资料?
下载资料意味着您已同意遵守以下协议:
1.资料的所有权益归上传用户所有
2.未经权益所有人同意,不得将资料中的内容挪作商业或盈利用途
3.51CTO下载中心仅提供资料交流平台,并不对任何资料负责
4.本站资料中如有侵权或不适当内容,请邮件与我们联系()
5.本站不保证资源的准确性、安全性和完整性, 同时也不承担用户因使用这些资料对自己和他人造成任何形式的伤害或损失
下载1874次
相关专题推荐
本专题收录Java经典编程的实例源码,
在国内的开发语言中,java凭借这简单
本套视频教程是韩顺平老师,循序渐进
北京圣思园张龙(风中叶)老师的Java
讲述Arm嵌入式Linux系统下的C语言编程
这段视频是从尚学堂科技的教学课堂上
本套视频共78集,是由郝斌老师根据多
本视频专题共180集涵盖了C语言概述中
本视频专题共107集涵盖了Java概述、数
由传智播客毕向东老师讲解的Java基础
本专题为spring视频教程,共31集。教
本专题为C语言黑客编程系列视频教程,
本专题为韩顺平讲解的Java从入门到精
本专题为Java Web项目开发案例精粹视
SSH为struts+spring+hibernate的一个
本专题为疯狂Java李刚老师讲解的Stru
意见或建议:
联系方式:
您已提交成功!感谢您的宝贵意见,我们会尽快处理& & 这里我以从一个用户表中查询用户信息为例演示其用法: 1.将PageResultSet. java 文件编译成class文件,并放入你的Web 应用程序的WEB-INF/classes/com/youngor/util目录下,可以对包名做相应修改。 2.在你的Action类中: 先从业务处理逻辑类中取出数……
声明:该文章系网友上传分享,此内容仅代表网友个人经验或观点,不代表本网站立场和观点;若未进行原创声明,则表明该文章系转载自互联网;若该文章内容涉嫌侵权,请及时向
论文写作技巧
上一篇:下一篇:
相关经验教程java简单的通用ajax分页方法 -
- ITeye技术网站
博客分类:
发表一个自己常用的分页的通用代码,实现了ajax分页。此例子是在Struts2+Hibernate+Spring框架下实现的,分页工具类是通用的,只不过查询、控制是根据使用的方法的不同而不同。
PaginationUtil.java
package com.dsh.pagination.
* ajax分页
* @author: DuanLang
* @company:oddTech
* @time: 上午11:10:36
public class PaginationUtil {
/** 设置当前页码 */
private int curPage = 1;
/** 设置每一页的行数 */
private int pageSize = 15;
/** 从数据库读取的开始记录数 */
/** 从数据库读取的行数(每一页显示的记录数) */
private int pageC
/** 总共行数(记录数) */
private int totalR
/** 总共页数 */
private int totalP
/** 分页导航条 */
private String pageB
* 根据从数据库读出的总记录数初始化相应的分页变量
* @param totalRow
public void setPagesVariable(int totalRow) {
this.setTotalRow(totalRow);
this.setTotalPage(totalRow / pageSize);
if (totalRow % pageSize & 0) {
this.setTotalPage(totalPage + 1);
if (curPage & 1) {
this.setStart((curPage - 1) * pageSize);
this.setStart(0);
this.setPageCount(pageSize);
* @return the curPage
public int getCurPage() {
return curP
* @param curPage
the curPage to set
public void setCurPage(int curPage) {
this.curPage = curP
* @return the pageSize
public int getPageSize() {
return pageS
* @param pageSize
the pageSize to set
public void setPageSize(int pageSize) {
this.pageSize = pageS
* @return the start
public int getStart() {
* @param start
the start to set
public void setStart(int start) {
this.start =
* @return the pageCount
public int getPageCount() {
return pageC
* @param pageCount
the pageCount to set
public void setPageCount(int pageCount) {
this.pageCount = pageC
* @return the totalRow
public int getTotalRow() {
return totalR
* @param totalRow
the totalRow to set
public void setTotalRow(int totalRow) {
this.totalRow = totalR
* @return the totalPage
public int getTotalPage() {
return totalP
* @param totalPage
the totalPage to set
public void setTotalPage(int totalPage) {
this.totalPage = totalP
* @return the pageBar
public String getPageBar() {
return pageB
* @param pageBar
the pageBar to set
public void setPageBar(String pageBar) {
this.pageBar = pageB
* 分页导航条(显示分页链接控制代码)
public String getToolsMenu() {
StringBuffer str = new StringBuffer("");
prev = curPage - 1;
next = curPage + 1;
if (curPage & 1) {
str.append("&a href=\"#\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value=1;this.parentNode.submit();\"&首页&/a&&");
str.append("首页&");
if (curPage & 1) {
str.append("&a href=\"#\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ prev + ";this.parentNode.submit();\"&上页&/a&&");
str.append("上页&/a&&");
if (curPage & totalPage) {
str.append("&a href=\"#\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ next + ";this.parentNode.submit();\"&下页&/a&&");
str.append("下页&");
if (totalPage & 1 && curPage != totalPage) {
str.append("&a href=\"#\"
onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ totalPage
+ ";this.parentNode.submit();\"&末页&/a&&&");
str.append("末页&&");
str.append(" 共" + totalRow + "条记录");
str.append("
每页&SELECT size=\"1\" name=\"page.pageSize\" onchange=\"this.form.getElementsByTagName('input')[0].value=1;this.form.submit();\"&");
if (pageSize == 2) {
str.append("&OPTION value=2 selected&2&/OPTION&");
str.append("&OPTION value=2&2&/OPTION&");
if (pageSize == 5) {
str.append("&OPTION value=5 selected&5&/OPTION&");
str.append("&OPTION value=5&5&/OPTION&");
if (pageSize == 10) {
str.append("&OPTION value=10 selected&10&/OPTION&");
str.append("&OPTION value=10&10&/OPTION&");
if (pageSize == 15) {
str.append("&OPTION value=15 selected&15&/OPTION&");
str.append("&OPTION value=15&15&/OPTION&");
if (pageSize == 20) {
str.append("&OPTION value=20 selected&20&/OPTION&");
str.append("&OPTION value=20&20&/OPTION&");
if (pageSize == 50) {
str.append("&OPTION value=50 selected&50&/OPTION&");
str.append("&OPTION value=50&50&/OPTION&");
if (pageSize == 100) {
str.append("&OPTION value=100 selected&100&/OPTION&");
str.append("&OPTION value=100&100&/OPTION&");
str.append("&/SELECT&");
str.append("条 分" + totalPage + "页显示 转到");
str.append("&SELECT size=\"1\" name=\"Pagelist\" onchange=\"this.form.getElementsByTagName('input')[0].value=this.this.form.submit();\"&");
for (int i = 1; i & totalPage + 1; i++) {
if (i == curPage) {
str.append("&OPTION value=" + i + " selected&" + i
+ "&/OPTION&");
str.append("&OPTION value=" + i + "&" + i + "&/OPTION&");
str.append("&/SELECT&页");
str.append("&INPUT type=\"hidden\"
value=" + curPage
+ " name=\"page.curPage\" & ");
return str.toString();
* AJAX分页导航条(显示分页链接控制代码)
public String getAJAXToolsMenu() {
StringBuffer str = new StringBuffer("");
prev = curPage - 1;
next = curPage + 1;
str.append("&span class=\"showControlPage\"&");
if (curPage & 1) {
str.append("&a href=\"javascript:\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value=1;showPages(this.parentNode.getElementsByTagName('input')[0].value,this.parentNode.getElementsByTagName('select')[0].value);\"&首页&/a&&");
str.append("首页&");
if (curPage & 1) {
str.append("&a href=\"javascript:\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ ";showPages(this.parentNode.getElementsByTagName('input')[0].value,this.parentNode.getElementsByTagName('select')[0].value);\"&上页&/a&&");
str.append("上页&/a&&");
if (curPage & totalPage) {
str.append("&a href=\"javascript:\" onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ ";showPages(this.parentNode.getElementsByTagName('input')[0].value,this.parentNode.getElementsByTagName('select')[0].value);\"&下页&/a&&");
str.append("下页&");
if (totalPage & 1 && curPage != totalPage) {
str.append("&a href=\"javascript:\"
onclick=\"this.parentNode.getElementsByTagName('input')[0].value="
+ totalPage
+ ";showPages(this.parentNode.getElementsByTagName('input')[0].value,this.parentNode.getElementsByTagName('select')[0].value);\"&末页&/a&&&");
str.append("末页&&");
str.append(" 共" + totalRow + "条记录");
str.append("
每页&SELECT size=\"1\" name=\"page.pageSize\" onchange=\"this.parentNode.getElementsByTagName('input')[0].value=1;showPages(1,this.value);\"&");
if (pageSize == 2) {
str.append("&OPTION value=2 selected&2&/OPTION&");
str.append("&OPTION value=2&2&/OPTION&");
if (pageSize == 5) {
str.append("&OPTION value=5 selected&5&/OPTION&");
str.append("&OPTION value=5&5&/OPTION&");
if (pageSize == 10) {
str.append("&OPTION value=10 selected&10&/OPTION&");
str.append("&OPTION value=10&10&/OPTION&");
if (pageSize == 15) {
str.append("&OPTION value=15 selected&15&/OPTION&");
str.append("&OPTION value=15&15&/OPTION&");
if (pageSize == 20) {
str.append("&OPTION value=20 selected&20&/OPTION&");
str.append("&OPTION value=20&20&/OPTION&");
if (pageSize == 50) {
str.append("&OPTION value=50 selected&50&/OPTION&");
str.append("&OPTION value=50&50&/OPTION&");
if (pageSize == 100) {
str.append("&OPTION value=100 selected&100&/OPTION&");
str.append("&OPTION value=100&100&/OPTION&");
str.append("&/SELECT&");
str.append("条 分" + totalPage + "页显示 转到");
str.append("&SELECT size=\"1\" name=\"Pagelist\" onchange=\"this.parentNode.getElementsByTagName('input')[0].value=this.showPages(this.value,this.parentNode.getElementsByTagName('select')[0].value);\"&");
for (int i = 1; i & totalPage + 1; i++) {
if (i == curPage) {
str.append("&OPTION value=" + i + " selected&" + i
+ "&/OPTION&");
str.append("&OPTION value=" + i + "&" + i + "&/OPTION&");
str.append("&/SELECT&页");
str.append("&INPUT type=\"hidden\"
value=" + curPage
+ " name=\"page.curPage\" & ");
str.append("&/span&");
return str.toString();
* (non-Javadoc)
* @see java.lang.Object#toString()
public String toString() {
return "PageUtil [curPage=" + curPage + ", pageSize=" + pageSize
+ ", start=" + start + ", pageCount=" + pageCount
+ ", totalRow=" + totalRow + ", totalPage=" + totalPage + "]";
这个是实现根据分页的信息(查询起始标号、要查询的记录的条数)来从数据库中读取信息。
UserDaoImpl.java
package com.dsh.pagination.dao.
import java.util.L
import java.util.M
import org.hibernate.Q
import org.springframework.orm.hibernate3.support.HibernateDaoS
import com.dsh.pagination.dao.UserD
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public List getUserByPageInfo(Map&String, Integer& pageMap) {
Query query=this.getSession().createQuery("from User");
query.setFirstResult(pageMap.get("start"));//设置数据查询的开始位置
query.setMaxResults(pageMap.get("pageCount")); //设置查询的条数
return query.list();
public int getAllUserNum() {
Query query=this.getSession().createQuery("select count(u.id) as number from User u");
int num=((Number)query.iterate().next()).intValue();
Service层就不贴出来了,基本上和Dao层差不多。下面贴出控制层代码,负责从前台获取分页的信息,和向前台发送从数据库中查询出的信息,传送是以json格式进行的。
UserActionImpl.java
package com.dsh.pagination.action.
import java.util.HashM
import java.util.L
import java.util.M
import org.apache.struts2.json.annotations.JSON;
import com.dsh.pagination.action.UserA
import com.dsh.pagination.model.U
import com.dsh.pagination.service.UserS
import com.dsh.pagination.tool.JsonU
import com.dsh.pagination.tool.PaginationU
import com.opensymphony.xwork2.ActionS
public class UserActionImpl extends ActionSupport implements UserAction {
private static final long serialVersionUID = 1L;
private UserS
private List&User&
private PaginationUtil pageU
private String pageB
public String getUserByPageInfo() {
System.out.println(pageUtil.getPageSize()+"从前台获取的数据");
int num = this.us.getUserNum();
System.out.println(num+"这是数据库中用户的个数");
pageUtil.setPagesVariable(num);
this.pageBar = pageUtil.getAJAXToolsMenu();
Map&String, Integer& pageInfo = new HashMap&String, Integer&();
pageInfo.put("start", pageUtil.getStart());// 设置数据查询的开始位置
pageInfo.put("pageCount", pageUtil.getPageCount());// 设置查询的数据条数
list = us.getUserByPageInfo(pageInfo);// 去业务层获取数据
if (list.size() & 0) {
this.users=JsonUtil.listToJson(list);
return SUCCESS;
return ERROR;
@JSON(serialize=false)
public UserService getUs() {
public void setUs(UserService us) {
@JSON(serialize=false)
public List&User& getList() {
public void setList(List&User& list) {
this.list =
@JSON(serialize=false)
public PaginationUtil getPageUtil() {
return pageU
public void setPageUtil(PaginationUtil pageUtil) {
this.pageUtil = pageU
@JSON(name="pageBar")
public String getPageBar() {
return pageB
public void setPageBar(String pageBar) {
this.pageBar = pageB
@JSON(name="users")
public String getUsers() {
public void setUsers(String users) {
this.users =
在前台我们就可以通过如下的方式进行调用了
&%@ page language="java" contentType="text/ charset=utf-8"
pageEncoding="utf-8"%&
&%@taglib prefix="s" uri="/struts-tags"%&
&!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&
&title&java通用分页显示数据&/title&
&script type="text/javascript" src="jquery.js"&&/script&
&script language="javascript" type="text/javascript"&
var curPage = 1, pageSize = 10;
$(function() {
dataInfoList();
function dataInfoList() {
submitData = "pageUtil.curPage=" + curPage + "&pageUtil.pageSize=" + pageS
$.ajax({ //一个Ajax过程
type : "post", //以post方式与后台沟通
url : "getUserByPageInfoAction.action", //与此页面沟通
dataType : "json",//返回的值以 html方式 解释
data :submitData,
beforeSend : function(XMLHttpRequest) {
$("#loadingMessage")
"&&&&&img src=\"/html/images/loading.gif\"&&span&请稍后,数据加载中!&/span&");
$("#loadingMessage").css({
display : ""
success : function(data) {//如果调用成功
var users=eval('('+data.users+')');
alert(users[0].id);
/* for(i in users){
$("#site_list").html(user[i].id);
$("#loadingMessage").css({
display : "none"
$("#pageBar").html(data.pageBar);
error : function() {
$("#loadingMessage").css({
display : ""
$("#loadingMessage")
"&span class=\"errorFont\"&数据加载遇到错误,请稍后再试&/span&");
function showPages(curPageUser, pageSizeUser) {
curPage = curPageU
pageSize = pageSizeU
dataInfoList();
&div id="site_list"&
&div class="showControlPage"&&/div&
&div id="loadingMessage"&&/div&
&div id="pageBar"&&/div&
简单的效果如下所示,我的数据库中并没用任何数据,所以效果只能显示成这样了。
共20条记录 每页2
100条 分2页显示 转到1
浏览: 210731 次
来自: 北京
java实现excel文档表格的导入导出,之前用过PageOf ...
如果也能实现Excel格式的导入导出就完美了,Spread S ...
楼主你好, 我是这么设置的:eclipse-&windo ...
学习了,嘿嘿。。
挺实用的。不用自己拼了。直接做成工具类调用。。在java中如何解决分页问题_Java_ThinkSAAS
在java中如何解决分页问题
在java中如何解决分页问题
内容来源: 网络
一个简单的JAVA分页方法
定义两个Vector,一个为储存查询所有记录的totalV,另一个储存当前页的记录currentPageV;
总的记录数:int totalSize = totalV.getSize();
每页显示的记录数:int countPerP
总页数:int totalPageNum = totalSize/countPerP
//如果总的记录数和每页记录数的余数大于零,
//那么总的页数为他们的整除结果加一
if (totalSize%countPerPage & 0 ){
totalPageNum = totalSize/countPerPage + 1;
当前的页数:pageNum;
for (int j = 0;j&totalV.size();j++){
//分页,根据当前的页数和每页显示的记录数从totalV中取出记录
//往currentPageV中添加记录;
//如果当前记录在(当前页码-1)*每页显示记录数(包括等于)
//和 当前页码*每页显示记录数(不包括等于)之间的时候;
//就属于该页的数据
if ( (j &= (pageNum - 1) * countPerPage) && (j & pageNum * countPerPage)) {
currentPageV.addElement(totalV.get(j));
//当currentPageV记录数等于每页显示记录数,
//停止往currentPageV中添加记录
if (currentPageV.size() == countPerPage) {
那么,当前页中显示的记录,就是currentPageV中的记录。
第二个分页
在使用数据库的过程中,不可避免的需要使用到分页的功能,可是JDBC的规范对此却没有很好的解决。对于这个需求很多朋友都有自己的解决方案,比如使用Vector等集合类先保存取出的数据再分页。但这种方法的可用性很差,与JDBC本身的接口完全不同,对不同类型的字段的支持也不好。这里提供了一种与JDBC兼容性非常好的方案。
JDBC和分页
Sun的JDBC规范的制定,有时很让人哭笑不得,在JDBC1.0中,对于一个结果集(ResultSet)你甚至只能执行next()操作,而无法让其向后滚动,这就直接导致在只执行一次SQL查询的情况下无法获得结果集的大小。所以,如果你使用的是JDBC1.0的驱动,那么是几乎无法实现分页的。
好在Sun的JDBC2规范中很好的弥补了这一个不足,增加了结果集的前后滚动操作,虽然仍然不能直接支持分页,但我们已经可以在这个基础上写出自己的可支持分页的ResultSet了。
和具体数据库相关的实现方法
有一些数据库,如Mysql, Oracle等有自己的分页方法,比如Mysql可以使用limit子句,Oracle可以使用ROWNUM来限制结果集的大小和起始位置。这里以Mysql为例,其典型代码如下:
// 计算总的记录条数
String SQL ="SELECT Count(*) AS total"+ this.QueryP
rs = db.executeQuery(SQL);
if (rs.next())
Total = rs.getInt(1);
// 设置当前页数和总页数
TPages = (int)Math.ceil((double)this.Total/this.MaxLine);
CPages = (int)Math.floor((double)Offset/this.MaxLine+1);
// 根据条件判断,取出所需记录
if (Total & 0) {
SQL = Query +"LIMIT"+ Offset +","+ MaxL
rs = db.executeQuery(SQL);
毫无疑问,这段代码在数据库是Mysql时将会是漂亮的,但是作为一个通用的类(事实上我后面要提供的就是一个通用类库中的一部分),需要适应不同的数据库,而基于这个类(库)的应用,也可能使用不同的数据库,所以,我们将不使用这种方法。
另一种繁琐的实现方法
我看过一些人的做法(事实上包括我在内,一开始也是使用这种方法的),即不使用任何封装,在需要分页的地方,直接操作ResultSet滚到相应的位置,再读取相应数量的记录。其典型代码如下:
sqlStmt = sqlCon.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE,
java.sql.ResultSet.CONCUR_READ_ONLY);
strSQL ="select name,age from test";
//执行SQL语句并获取结果集
sqlRst = sqlStmt.executeQuery(strSQL);
//获取记录总数
sqlRst.last();
intRowCount = sqlRst.getRow();
//记算总页数
intPageCount = (intRowCount+intPageSize-1) / intPageS
//调整待显示的页码
if(intPage&intPageCount) intPage = intPageC
&table border="1"cellspacing="0"cellpadding="0"&
&th&姓名&/th&
&th&年龄&/th&
if(intPageCount&0){
//将记录指针定位到待显示页的第一条记录上
sqlRst.absolute((intPage-1) * intPageSize + 1);
//显示数据
while(i&intPageSize && !sqlRst.isAfterLast()){
&td&&%=sqlRst.getString(1)%&&/td&
&td&&%=sqlRst.getString(2)%&&/td&
sqlRst.next();
很显然,这种方法没有考虑到代码重用的问题,不仅代码数量巨大,而且在代码需要修改的情况下,将会无所适从。
使用Vector进行分页
还见过另一些实现分页的类,是先将所有记录都select出来,然后将ResultSet中的数据都get出来,存入Vector等集合类中,再根据所需分页的大小,页数,定位到相应的位置,读取数据。或者先使用前面提到的两种分页方法,取得所需的页面之后,再存入Vector中。
扔开代码的效率不说,单是从程序结构和使用的方便性上讲,就是很糟糕的。比如,这种做法支持的字段类型有限,int, double, String类型还比较好处理,如果碰到Blob, Text等类型,实现起来就很麻烦了。这是一种更不可取的方案。
一个新的Pageable接口及其实现
很显然,看过上面三种实现方法后,我们对新的分页机制有了一个目标,即:不与具体数据库相关;尽可能做到代码重用;尽可能与原JDBC接口的使用方法保持一致;尽可能高的效率。
首先,我们需要提供一个与java.sql.ResultSet向下兼容的接口,把它命名为Pageable,接口定义如下:
public interface Pageable extends java.sql.ResultSet{
/**返回总页数
int getPageCount();
/**返回当前页的记录条数
int getPageRowsCount();
/**返回分页大小
int getPageSize();
/**转到指定页
void gotoPage(int page) ;
/**设置分页大小
void setPageSize(int pageSize);
/**返回总记录行数
int getRowsCount();
* 转到当前页的第一条记录
* @exception java.sql.SQLException 异常说明。
void pageFirst() throws java.sql.SQLE
* 转到当前页的最后一条记录
* @exception java.sql.SQLException 异常说明。
void pageLast() throws java.sql.SQLE
/**返回当前页号
int getCurPage();
这是一个对java.sql.ResultSet进行了扩展的接口,主要是增加了对分页的支持,如设置分页大小,跳转到某一页,返回总页数等等。
接着,我们需要实现这个接口,由于这个接口继承自ResultSet,并且它的大部分功能也都和ResultSet原有功能相同,所以这里使用了一个简单的Decorator模式。
PageableResultSet2的类声明和成员声明如下:
public class PageableResultSet2 implements Pageable {
protected java.sql.ResultSet rs=
protected int rowsC
protected int pageS
protected int curP
protected String command ="";
可以看到,在PageableResultSet2中,包含了一个ResultSet的实例(这个实例只是实现了ResultSet接口,事实上它是由各个数据库厂商分别实现的),并且把所有由ResultSet继承来的方法都直接转发给该实例来处理。
PageableResultSet2中继承自ResultSet的主要方法:
public boolean next() throws SQLException {
return rs.next();
public String getString(String columnName) throws SQLException {
return rs.getString(columnName);
catch (SQLException e) {//这里是为了增加一些出错信息的内容便于调试
throw new SQLException (e.toString()+"columnName="
+columnName+"SQL="+this.getCommand());
只有在Pageable接口中新增的方法才需要自己的写方法处理。
/**方法注释可参考Pageable.java
public int getCurPage() {
return curP
public int getPageCount() {
if(rowsCount==0) return 0;
if(pageSize==0) return 1;
//calculate PageCount
double tmpD=(double)rowsCount/pageS
int tmpI=(int)tmpD;
if(tmpD&tmpI) tmpI++;
return tmpI;
public int getPageRowsCount() {
if(pageSize==0) return rowsC
if(getRowsCount()==0) return 0;
if(curPage!=getPageCount()) return pageS
return rowsCount-(getPageCount()-1)*pageS
public int getPageSize() {
return pageS
public int getRowsCount() {
return rowsC
public void gotoPage(int page) {
if (rs == null)
if (page & 1)
if (page & getPageCount())
page = getPageCount();
int row = (page - 1) * pageSize + 1;
rs.absolute(row);
catch (java.sql.SQLException e) {
public void pageFirst() throws java.sql.SQLException {
int row=(curPage-1)*pageSize+1;
rs.absolute(row);
public void pageLast() throws java.sql.SQLException {
int row=(curPage-1)*pageSize+getPageRowsCount();
rs.absolute(row);
public void setPageSize(int pageSize) {
if(pageSize&=0){
this.pageSize=pageS
curPage=1;
//PageableResultSet2的构造方法:
public PageableResultSet2(java.sql.ResultSet rs) throws java.sql.SQLException {
if(rs==null) throw new SQLException("given ResultSet is NULL","user");
rs.last();
rowsCount=rs.getRow();
rs.beforeFirst();
/*如果要提高效率,可以利用select count(*) 语句取得所有记录数,注释掉
构造函数的rs.last();rowsCount=rs.getRow();rs.beforeFirst();三句。
在调用构造函数后调用此方法获得所有的记录,参数是select count(*)后的结果集
public void setRowsCount(java.sql.ResultSet rs)throws java.sql.SQLException {
if(rs==null) throw new SQLException("given ResultSet is NULL","user");
rowCount=rs.getInt(1);
这里只是简单的取得一个总记录数,并将记录游标移回初始位置(before first),同时将参数中的ResultSet赋给成员变量。
Pageable的使用方法
因为Pageable接口继承自ResultSet,所以在使用方法上与ResultSet一致,尤其是在不需要分页功能的时候,可以直接当成ResultSet使用。而在需要分页时,只需要简单的setPageSize, gotoPage,即可。
PreparedStatement pstmt=
Pageable rs=
……//构造SQL,并准备一个pstmt.
rs=new PageableResultSet2(pstmt.executeQuery());//构造一个Pageable
rs.setPageSize(20);//每页20个记录
rs.gotoPage(2);//跳转到第2页
for(int i=0; i&rs.getPageRowsCount(); i++){//循环处理
int id=rs.getInt(“ID”);
……//继续处理
rs.next();
一个好的基础类应该是便于使用,并且具备足够的可移植性,同时要保证其功能的完善。在上面的实现中,我们从java.sql.ResultSet接口继承出Pageable,并实现了它。这就保证了在使用中与JDBC原有操作的一致性,同时对原有功能没有缩减。
同时它也是易于使用的,因为封装了一切必要的操作,所以在你的代码中唯一显得"难看"和"不舒服"的地方就是需要自己去构造一个PageableResultSet2。不过只要你愿意,这也是可以解决的。
当然它也有具有充分的可移植性,当你将数据库由Oracle变为Mysql或者SQLServer的时候,你仍然可以使用这些分页的代码。它在使用中(或者说在移植的过程中)唯一的限制就是你必须要使用一个支持JDBC2的驱动(现在明白为什么我把类命名为PageableResultSet2了吧。:P),不过,好在JDBC2已经成为标准了,绝大多数的数据库(如Oracle, Mysql, SQLServer)都有自己的或者第三方提供的JDBC2的驱动。
OK,这个分页的实现是否对你的编程有帮助呢?仔细看看,其实真正自己写的代码并不多的,大部分都只是简单的转发操作。一个合适的模式应用可以帮你很大忙。
这里只是简单的取得一个总记录数,并将记录游标移回初始位置(before first),同时将参数中的ResultSet赋给成员变量。
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信}

我要回帖

更多关于 java负载均衡解决方案 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信