
package com.web.utils;
import java.io.Serializable;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowCallbackHandler;
/**
* 分页代码
*
* @author Star
* @version 1.0 2008/07/08
*/
public class CutPage implements Serializable{
private static Log log = LogFactory.getLog(CutPage.class);
private int curPageNo = 0; // 当前页数,从0开始
private int size = 0; // 所有数据条数
private String url; // 页面跳转的路径
private List showList; // 当前页面需要显示的数据列表
private int pageSize = 20;// 每页显示的数据条数
private int groupSize = 1;// 多少页为一组
private String pageNavigation;// 导航条
/**
* 每次通过sql语句从数据库里面分组取出需要显示的数据
*
* @param request
* javax.servlet.http.HttpServletRequest对象
* @param sql
* String 查询数据库的sql语句
* @param pageSize
* int 每页显示的条数
* @param groupSize
* int 分成多少组
* @param url
* String 页面跳转的路径,若没有特殊的参数传递,可以传入null或"",
* 如是在aciton里面调用,并且action是继承自DispatherAction的话最好传入完整的路径
*/
public void init(HttpServletRequest request, String sql, int pageSize,
int groupSize, int pageNo, String url) {
// 上一页、下一页跳转路径
if (url != null) {
this.url = url;
} else {
this.url = request.getRequestURL() + "";
}
if (pageSize > 0)
this.pageSize = pageSize;// 每页多少条记录
if (groupSize > 0)
this.groupSize = groupSize;
// 当前第几页
if (pageNo < 0) {
this.curPageNo = 0;
} else {
this.curPageNo = pageNo;
}
int curGroup = this.curPageNo / this.groupSize + 1;
// 是否是新的一组数据,如果是则到数据库取数据
this.size = parseInt(request.getSession().getAttribute("page_all_size")
+ "", 0);
if (this.curPageNo % this.groupSize == 0
|| (request.getSession().getAttribute("cur_group") != null && parseInt(
"" + request.getSession().getAttribute("cur_group"), 1) != curGroup)
|| this.size == 0 || request.getParameter("reload") != null) {
request.getSession().setAttribute("cur_group", curGroup);
if (pageNo > 0
&& request.getSession().getAttribute("page_sql") != null) {
sql = request.getSession().getAttribute("page_sql") + "";
} else {
request.getSession().setAttribute("page_sql", sql);
}
this.size = getTotalCount(sql);
List list = getPageData(sql, (this.curPageNo / this.groupSize)
* this.pageSize * this.groupSize, this.pageSize
* this.groupSize);
request.getSession().setAttribute("page_all_size", this.size);
request.getSession().setAttribute("page_cur_list", list);
this.setShowList(list);// 设置页面上的显示数据
} else {
this.setShowList((List) request.getSession().getAttribute(
"page_cur_list"));// 设置页面上的显示数据
}
}
/**
* 每次通过sql语句从数据库里面分组取出需要显示的数据
*
* @param request
* javax.servlet.http.HttpServletRequest对象
* @param sql
* String 查询数据库的sql语句
* @param pageSize
* int 每页显示的条数
* @param groupSize
* int 分成多少组
* @param url
* String 页面跳转的路径,若没有特殊的参数传递,可以传入null或"",
* 如是在aciton里面调用,并且action是继承自DispatherAction的话最好传入完整的路径
*/
public void init(HttpServletRequest request, String sql, int pageSize,
int groupSize, String url) {
// 当前第几页
String curPage = request.getParameter("pageNo");
init(request, sql, pageSize, groupSize, parseInt(curPage, -1), url);
}
/**
* 每次通过sql语句从数据库里面分组取出需要显示的数据
*
* @param request
* javax.servlet.http.HttpServletRequest对象
* @param sql
* String 查询数据库的sql语句
* @param pageSize
* int 每页显示的条数
* @param groupSize
* int 分成多少组
* @param url
* String 页面跳转的路径,若没有特殊的参数传递,可以传入null或"",
* 如是在aciton里面调用,并且action是继承自DispatherAction的话最好传入完整的路径
*/
public void init(HttpServletRequest request, String sql, int pageSize,
int groupSize, int pageNo) {
init(request, sql, pageSize, groupSize, pageNo, "");
}
/**
* 这种方式是一次性把所有的数据取出来,再分页显示
*
* 只需传递一次数据,会有一个pageNo的参数进行传递
*
* 这种方法在jsp页面上使用很方便,但是在servlet或action里面使用时,要达到减少数据库访问的目的,则需先判断是否执行查询数据库操作,如下使用:
*
* List list = null; if(request.getParameter("pageNo") == null ||
* request.getParameter("pageNo").equals("null")){ list =
* dao.getDataFromDb();//调用自己的方法操作数据库,从数据库里面取出数据 } CutPage cp = new
* CupPage(request,list,20,"");
*
* @param request
* javax.servlet.http.HttpServletRequest对象
* @param allList
* 传进来的所有数据,第一次会放把数据放在session里面,以后在session中取数据
* @param pageSize
* 每页显示的条数
* @param url
* 页面跳转的路径,若没有特殊的参数传递,可以赋成null或"",
* 如是在aciton里面调用,并且action是继承自DispatherAction的话最好传入完整的路径
*/
public void init(HttpServletRequest request, List allList, int pageSize,
String url) {
String page_num = request.getParameter("pageNo");
this.curPageNo = parseInt(page_num, 0);// 当前页码
List list = new ArrayList();
if (allList != null) {
list = allList;
request.getSession().setAttribute("all_List", list);
} else {
list = (List) request.getSession().getAttribute("all_List");
if (list == null) {
list = new ArrayList();
}
}
this.size = list.size();// 总的数据条数
if (url != null) {
this.url = url;
} else {
this.url = request.getRequestURL() + "";
}
if (pageSize > 0)
this.pageSize = pageSize;// 每页显示的条数
setShowList(list);// 设置显示数据
}
/**
* 返回分页导航条
*
* @return pageNavigation String 分页导航条
*/
public String getPageNavigation() {
// 最终返回的分页导航条
String pageNavigation = "共有" + size + "条数据 ";
// 记录数超过一页,需要分页
if (size > pageSize) {
if (url != null && !"".equals(url)) {
if (url.indexOf("?") > -1) {
// 如果url中已经包含了其他的参数,就把curPageNo参数接在后面
url += "&";
} else {
// 如果url中没有别的参数
url += "?";
}
// 生成一个提交页面的函数
pageNavigation += "";
}
pageNavigation += "每页"
+ pageSize
+ "条 "
+ "当前第页 共" + curPageNos
+ "页 ";
// 如果不是第一页,导航条将包含"首页"和"上一页"的连接
if (curPageNo > 0) {
pageNavigation += "[首页] "
+ "[ + (curPageNo - 1) + ");return false;\\">上一页] ";
} else {
pageNavigation += "[首页] [上一页] ";
}
// 如果不是最后一页,导航条将包含"末页"和"下一页"
if (curPageNo < curPageNos - 1) {
pageNavigation += "[ + (curPageNo + 1) + ");return false;\\">下一页
+ "[ + (curPageNos - 1) + ");return false;\\">末页]";
} else {
pageNavigation += "[下一页] [末页]";
}
}
return pageNavigation;
}
/**
* 返回分页后的总页数
*
* @return pagecount int 总页数
*/
public int getPageCount() {
int pagecount = 0;
if (size % pageSize == 0) {
pagecount = size / pageSize;
} else {
pagecount = size / pageSize + 1;
}
return pagecount;
}
/**
* 返回最后一页的记录数
*
* @return lastpagesize int 最后一页的记录数
*/
public int getLastPageCount() {
int lastpagesize = 0;
if (size % pageSize == 0) {
lastpagesize = pageSize;
} else {
lastpagesize = size % pageSize;
}
return lastpagesize;
}
// 设置显示的记录列表
private void setShowList(List list) {
log.info("$$totalSize=" + this.size + "; curPageNo=" + this.curPageNo
+ "; pageSize=" + this.pageSize + "; groupSize="
+ this.groupSize);
if (list == null) {
list = new ArrayList();
}
if (pageSize >= list.size()) {
this.showList = list;
} else {
if (groupSize <= 1) {
groupSize = 1;
if (pageSize * (curPageNo + 1) > list.size()) {
if (pageSize * curPageNo > list.size()) {
this.showList = list.subList(list.size() - pageSize,
list.size());// 返回最后一页的数据
} else {
this.showList = list.subList(pageSize * curPageNo, list
.size());
}
} else {
this.showList = list.subList(pageSize * curPageNo, pageSize
* (curPageNo + 1));
}
} else {
if (pageSize * ((curPageNo % groupSize) + 1) > list.size()) {
this.showList = list.subList(pageSize
* (curPageNo % groupSize), list.size());
} else {
this.showList = list.subList(pageSize
* (curPageNo % groupSize), pageSize
* ((curPageNo % groupSize) + 1));
}
}
}
}
public List getShowList() {
return showList;
}
public int getCurPageNo() {
return curPageNo;
}
public void setCurPageNo(int curPageNo) {
this.curPageNo = curPageNo;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getGroupSize() {
return groupSize;
}
public void setGroupSize(int groupSize) {
this.groupSize = groupSize;
}
private int parseInt(Object s, int defaultValue) {
if (s != null && s.toString().matches("\\\\d+")) {
return Integer.parseInt(s.toString());
} else {
return defaultValue;
}
}
/**
* 拆解简单sql type:1-取from,2-取where,3-取orderby
*/
private String parseHql(String sql, int type) {
switch (type) {
case 1:
if (sql.indexOf("where") > 0) {
return sql.substring(0, sql.indexOf("where") - 1);
} else if (sql.indexOf("order by") > 0) {
return sql.substring(0, sql.indexOf("order by") - 1);
} else {
return null;
}
case 2:
if (sql.indexOf("where") > 0) {
if (sql.indexOf("order by") > 0) {
return sql.substring(sql.indexOf("where"), sql
.indexOf("order by") - 1);
} else {
return sql.substring(sql.indexOf("where"));
}
} else {
return null;
}
case 3:
if (sql.indexOf("order by") > 0) {
return sql.substring(sql.indexOf("order by"));
} else {
return null;
}
}
return null;
}
/**
* 获取总记录条数
*
* @param sql
* @return
*/
private int getTotalCount(String sql) {
log.debug("query sql:" + sql);
String from = parseHql(sql, 1);
String where = parseHql(sql, 2);
log.debug("parse sql result - from:" + from);
log.debug("parse sql result - where:" + where);
if (from == null) {
log.error(">sql 无效:" + sql);
return 0;
}
if (where == null)
where = "";
try {
String fromTrim = from.substring(from.indexOf("from"));
String s = "select count(1) " + fromTrim + " " + where;
log.debug("get total count sql:" + s);
return getSpringJdbcTemplate().queryForInt(s);
} catch (Exception e) {
e.printStackTrace();
return 0;
}
}
/**
* 通过sql查询一页的数据
*
* @param sql
* @param firstResult
* @param maxResults
* @return
*/
private List getPageData(final String sql, final int firstResult,
final int maxResults) {
log.debug("$$sql=" + sql + "; firstResult=" + firstResult
+ "; maxResults=" + maxResults);
try {
JdbcTemplate jt = getSpringJdbcTemplate();
return queryForList(sql + " limit " + firstResult +
+ maxResults, jt);
} catch (Exception e) {
e.printStackTrace();
}
return new ArrayList();
}
public static List queryForList(String sql, JdbcTemplate jt) {
log.debug("SpringJdbcTemplate:" + sql);
final List list = new ArrayList();
try {
jt.query(sql, new RowCallbackHandler() {
public void processRow(ResultSet rs) throws SQLException {
HashMap m = new HashMap();
ResultSetMetaData meta = rs.getMetaData();
if (meta != null) {
int colCount = meta.getColumnCount();
for (int i = 1; i <= colCount; i++) {
String fieldName = meta.getColumnName(i);
Object fieldValue = rs.getString(fieldName);
m.put(fieldName, fieldValue);
fieldName = null;
fieldValue = null;
}
}
list.add(m);
m = null;
meta = null;
}
});
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 需要实现此方法,返回一个SpringJdbcTemplate对象
*/
private JdbcTemplate getSpringJdbcTemplate() {
//TODO
return null;
}
}
方法二:
Hibernate+struts2+spring 实现分页实例
首先定义一个包含分页相关信息的分页类PageResultSet类: package cn.tutorinfo.pagination;import java.util.List;/** *该类描述了一个分页数据集 list中是查询的数据集合 ,pageInfo则描述了附加的页相关的信息 */public class PageResultSetT {private ListT list; /
首先定义一个包含分页相关信息的分页类PageResultSet类:
package cn.tutorinfo.pagination;
import java.util.List;
/**
*该类描述了一个分页数据集 list中是查询的数据集合 ,pageInfo则描述了附加的页相关的信息
*/
public class PageResultSet private List private PageInfo pageInfo; //当前页的信息 public List return list; } public void setList(List this.list = list; } public PageInfo getPageInfo() { return pageInfo; } public void setPageInfo(PageInfo pageInfo) { this.pageInfo = pageInfo; } } 其中关于页的信息类PageInfo 定义如下: package cn.tutorinfo.pagination; /** * 该类描述了分页记录集中的关于页的信息 */ public class PageInfo { private int totalRow; //总共记录数 private int totalPage; //总共页数 private int currentPage = 1; //当前页,默认为1 private int pageSize = 20; //页的大小 private boolean hasPrevious; private boolean hasNext; private boolean bof; private boolean eof; /* * 构造方法 @param totalRow 总记录数 @param pageSize 页的大小 @param page 页码 */ public PageInfo(int totalRow, int pageSize, int page) { this.totalRow = totalRow; this.pageSize = pageSize; // 根据页大小和总记录数计算出总页数 this.totalPage = countTotalPage(this.pageSize, this.totalRow); // 修正当前页 setCurrentPage(page); init(); } public int getTotalPage() { return totalPage; } public int getCurrentPage() { return this.currentPage; } // 修正计算当前页 public void setCurrentPage(int currentPage) { if(currentPage>this.totalPage){ this.currentPage=this.totalPage; }else if (currentPage<1){ this.currentPage=1; } else{ this.currentPage=currentPage; } } // 获取分页大小 public int getPageSize() { return pageSize; } // 设置分页大小 public void setPageSize(int pageSize) { this.pageSize = pageSize; } // 获取当前页记录的开始索引 public int getBeginIndex() { int beginIndex = (currentPage - 1) * pageSize; // 索引下标从0开始 return beginIndex; } // 计算总页数 public int countTotalPage(int pageSize, int totalRow) { int totalPage = totalRow % pageSize == 0 ? totalRow / pageSize : totalRow / pageSize + 1; return totalPage; } // 返回下一页的页码 public int getNextPage() { if (currentPage + 1 >= this.totalPage) { // 如果当前页已经是最后页 则返回最大页 return this.totalPage; } return currentPage + 1; } // 返回前一页的页码 public int getPreviousPage() { if (currentPage - 1 <= 1) { return 1; } else { return currentPage - 1; } } public boolean isHasPrevious() { return hasPrevious; } public boolean isHasNext() { return hasNext; } public boolean isBof() { return bof; } public boolean isEof() { return eof; } public boolean hasNext() { return currentPage < this.totalPage; } public boolean hasPrevious() { return currentPage > 1; } public boolean isFirst() { return currentPage == 1; } public boolean isLast() { return currentPage >= this.totalPage; } // 初始化信息 private void init() { this.hasNext = hasNext(); this.hasPrevious = hasPrevious(); this.bof = isFirst(); this.eof = isLast(); } } Dao接口层代码: package cn.tutorinfo.dao; import java.util.List; import cn.tutorinfo.domain.Teacher; public interface TeacherDao { //分页查询显示 public List //查询的结果记录总数 public int queryRowCount(final String hql); } DAO实现层代码: /* * 分页查询显示 * @param hql查询的的hql语句 * @param beginIndex 查询记录的起始索引位置 * @param pageSize 一次查询记录个数 * @return List */ @SuppressWarnings("unchecked") public List Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession(); Transaction transaction = null; try { transaction = session.beginTransaction(); Query query = session.createQuery(hql); query.setFirstResult(beginIndex); query.setMaxResults(pageSize); List transaction.commit(); return list; } catch (Exception e) { if (null != transaction) { transaction.rollback(); e.printStackTrace(); } } return null; } / / 查询指定HQL的结果记录总数 public int queryRowCount(final String hql) { Session session=HibernateSessionFactory.getSessionFactory().getCurrentSession(); Transaction transaction=null; try{ transaction=session.beginTransaction(); Query query=session.createQuery(hql); int result=query.list().size(); //计算个数 transaction.commit(); return result; }catch (Exception e){ if (null!=transaction){ transaction.rollback(); e.printStackTrace(); } } return 0; } 业务逻辑层接口: package cn.tutorinfo.service; import java.util.List; import cn.tutorinfo.domain.Teacher; import cn.tutorinfo.pagination.PageResultSet; public interface TeacherService { /* * @param pagesize 每页大小 * @param page 要显示数据的页 * @return 包含结果集和分页信息的数据集 */ public PageResultSet } 业务逻辑实现类: //分页获取记录值 public PageResultSet String hql = "From Teacher"; //查询HQL语句 int totalRow = teacherDao.queryRowCount(hql); // 计算总记录个数 PageInfo pageinfo = new PageInfo(totalRow, pageSize, page); //获取该页的记录 List PageResultSet pageResultSet.setList(list); pageResultSet.setPageInfo(pageinfo); return pageResultSet; } struts2 的action中调用业务逻辑实现类来获取页的信息: package cn.tutorinfo.struts; import cn.tutorinfo.domain.Teacher; import cn.tutorinfo.pagination.PageResultSet; import cn.tutorinfo.service.TeacherService; import com.opensymphony.xwork2.ActionSupport; public class ListTeacherAction extends ActionSupport { private static final long serialVersionUID = -7735757614996395820L; private int page; //接受传递的页码参数 private PageResultSet private TeacherService service; // 业务逻辑组件类由Spring注入 public int getPage() { return page; } public void setPage(int page) { this.page = page; } public PageResultSet return pageResultSet; } public void setPageResultSet(PageResultSet this.pageResultSet = pageResultSet; } public void setService(TeacherService service) { this.service = service; } @Override public String execute() throws Exception { this.pageResultSet = service.queryByPage(15,page); // 显示第page页,显示15条记录 return SUCCESS; } } 业务逻辑实现类中的Dao和Action中的业务逻辑组件类都由spring注入. okay,以上基本完成.前台jsp页面来显示经过action处理后的分页信息: 页码: 首页 第一页 首页 ">上一页 下一页 末页 调用: http://localhost:8080/appName/listTeacher.action?page=2 则显示所有教师信息中的第二页中的全部数据 方法三: 首先要定义四个变量: int pageSize:每页显示多少条记录 int pageNow:希望显示第几页 int pageCount:一共有多少页 int rowCount:一共有多少条记录 说明: pageSize是指定的 pageNow是用户选择的 rowCount是计算出来的 该计算式为 if(rowCount%pageSize==0){ pageCount=rowCount/pageSize; }else{ pageCount=rowCount/pageSize+1; } (技巧: 数据库插入: insert into 表名(字段1,2。。)select 字段1,2,...from 表名 ) 查询语句 select top pageSize字段名列表from表名where id not in (select top pageSize*(pageNow-1)id from 表名) 以我们前面的users表为例,显示第二页,该查询语句就是: select top 3 * from users where userId not in(select top 3 userId from users) (select top 3 userId from users):选出这个表的前三条 前面再选三条 <% //定义四个分页会用到的变量 int pageSize=3; int pageNow=1;//默认显示第一页 int rowCount=0;//该值从数据库中查询 int pageCount=0;//该值是通过pageSize和rowCount //接受用户希望显示的页数(pageNow) String s_pageNow=request.getParameter("pageNow"); if(s_pageNow!=null){ //接收到了pageNow pageNow=Integer.parseInt(s_pageNow); } //查询得到rowCount Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver"); Connection ct=DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;dataBaseName=System Statement sm=ct.createStatement(); ResultSet rs=sm.exeuteQuery("select count(*) form users "); if(rs.next()){ rowCount=rs.getInt(1); } //计算pageCount if(rowCount%pageSize==0){ pageCount=rowCount/pageSize; }else{ pageCount=rowCount/pageSize+1; } //查询出需要显示的记录 rs=sm.exeuteQuery("select top "+pageSize +" * from users where userId not in(select top " +pageSize*(pageNow-1)+" userId from users) "); %> //显示 <% while(rs.next()){ %> <%}%> <% //上一页 if(pageNow!=1){ out.println("上一页"); } //显示超链接 for(int i=1;i<=pageCount;i++){ out.println("["+i+"]"); } //下一页 if(pageNow!=pageCount){ out.println("下一页"); } %> 方法四: <% BasetableFactory bf=BasetableFactory.getInstance(); Collection coll=bf.ListSoft(1000,"ORDER BY uptime DESC"); //此处为从数据库中取的数据,函数需要改进,根据页数得到,如果只是实现的是假分页,则在集合显示时设置计数器,根据计数器来展示的内容,链接不需要传递页数。 int count=bf.getPageCount(); String pageCount=(String)session.getPageCount(); int pagecount=Integer.paseInt(pageCount); if(coll==null||coll.size()<0){%> <% }else{ Iterator it=coll.iterator(); while(it.hasNext()){ Soft s=(Soft)it.next(); %> <% if(pagecount>1) %> <%}%>
编号 讲师姓名 性别 讲师类别 讲师介绍 基本操作 选择: 全选 - 反选 - 不选 用户信息列表
用户ID 用户名字 密码 电邮 级别 <%=rs.getInt(1)%> <%=rs.getString(2)%> <%=rs.getString(3)%> <%=rs.getString(4)%> <%=rs.getInt(5)%>
No Product! Name: <%=s.getName()%> <%String path=bf.SearchHead("WHERE iid='"+s.getIid()+"'").getPath();if(path==null){out.print("无图片");}else{out.print("");}%> Version: <%=s.getEdition()%> Platform: <%=s.getEnvironment()%> Prices: <%=s.getPrice()%> Category: <%=bf.SearchSsort("WHERE sid="+s.getSid()).getName()%> Introduce: <%=s.getIntroduce()%>

各种分页代码
最新推荐
猜你喜欢
热门推荐