String sql = "select top " + size + " * from news where newsID not in ( select top " + length + " newsID from news order by newsID desc ) order by newsID desc"; List<News> items = new ArrayList<News>(); Result rs = SqlHelper.getRs(sql); if (rs != null && rs.getRowCount() > 0) { for (int i = 0; i < rs.getRowCount(); i++) { Map map = rs.getRows()[i]; items.add(get(map)); }
} return items;
} 方法很简单 你应该能看的懂,在页面需要分页的地方获取的数据就从这个方法来拿就可以.
一种是数据库级别的分页, public List <News> findNewsByCondition(int size, int currentPage) { int length=0; if(currentPage>1){ length = size ; }else{ length = size * (currentPage-1); } String sql = "select top " + size + " * from news where newsID not in ( select top " + length + " newsID from news order by newsID desc ) order by newsID desc"; List <News> items = new ArrayList <News>(); Result rs = SqlHelper.getRs(sql); if (rs != null && rs.getRowCount() > 0) { for (int i = 0; i < rs.getRowCount(); i++) { Map map = rs.getRows()[i]; items.add(get(map)); } } return items; } 还有一中是在页面上对数据进行分页
在网页实现分页主要是传参数问题,把参数传到dao里面,而在dao主要作出要从第几条开始找,找到第几条。StringBuffer sql=new StringBuffer("select * from (select nid,sname,sdescription,nprice,simg,nmctag,nmaxid,nminid,rownum as num from t_mc where 1=1"); if(nid!=-1){ sql.append("and nid="+nid); } if(skey!=null){ sql.append("and sname like '%"+skey+"%' "); } if(prstart!=-1){ sql.append("and nprice>="+prstart);
给你举个例子:
/**
* 实现新闻的分页查询
* @param size 每页显示的大小
* @param currentPage 当前的页码
* @return 新闻列表
*/
public List<News> findNewsByCondition(int size, int currentPage) {
int length=0;
if(currentPage>1){
length = size ;
}else{
length = size * (currentPage-1);
}
String sql = "select top "
+ size
+ " * from news where newsID not in ( select top "
+ length
+ " newsID from news order by newsID desc ) order by newsID desc";
List<News> items = new ArrayList<News>();
Result rs = SqlHelper.getRs(sql);
if (rs != null && rs.getRowCount() > 0) {
for (int i = 0; i < rs.getRowCount(); i++) {
Map map = rs.getRows()[i];
items.add(get(map));
}
}
return items;
}
方法很简单 你应该能看的懂,在页面需要分页的地方获取的数据就从这个方法来拿就可以.
public List <News> findNewsByCondition(int size, int currentPage) {
int length=0;
if(currentPage>1){
length = size ;
}else{
length = size * (currentPage-1);
} String sql = "select top "
+ size
+ " * from news where newsID not in ( select top "
+ length
+ " newsID from news order by newsID desc ) order by newsID desc";
List <News> items = new ArrayList <News>();
Result rs = SqlHelper.getRs(sql);
if (rs != null && rs.getRowCount() > 0) {
for (int i = 0; i < rs.getRowCount(); i++) {
Map map = rs.getRows()[i];
items.add(get(map));
} }
return items; }
还有一中是在页面上对数据进行分页
if(nid!=-1){
sql.append("and nid="+nid);
}
if(skey!=null){
sql.append("and sname like '%"+skey+"%' ");
}
if(prstart!=-1){
sql.append("and nprice>="+prstart);
}
if(prend!=-1){
sql.append("and nprice<="+prend);
}
if(tymax!=-1){
sql.append("and nmaxid="+tymax);
}
if(tymin!=-1){
sql.append("and nminid="+tymin);
}
if(paend!=-1){
sql.append("and rownum<="+paend);
}
sql.append(")");
if(pastart!=-1){
sql.append("where num>="+pastart);
}
这是一个商品分页显示,可以参数一下。
<%@ page contentType="text/html; charset=gb2312" language="java" errorPage="../error.jsp" %>
<script language="JavaScript"><!--
function Jumping(){
document.PageForm.submit();
return ;
}function gotoPage(pagenum){
document.PageForm.jumpPage.value = pagenum;
document.PageForm.submit();
return ;
}-->
</script>每页<%=pageCtl.rowsPerPage%>行
共<%=pageCtl.maxRowCount%>行
第<%=pageCtl.curPage%>页
共<%=pageCtl.maxPage%>页
<BR>
<%if(pageCtl.curPage==1){ out.print(" 首页 上一页"); }else{ %>
<A HREF="javascript:gotoPage(1)">首页</A>
<A HREF="javascript:gotoPage(<%=pageCtl.curPage-1%>)">上一页</A>
<%}%>
<%if(pageCtl.curPage==pageCtl.maxPage){ out.print("下一页 尾页"); }else{ %>
<A HREF="javascript:gotoPage(<%=pageCtl.curPage+1%>)">下一页</A>
<A HREF="javascript:gotoPage(<%=pageCtl.maxPage%>)">尾页</A>
<%}%>
转到第<SELECT name="jumpPage" onchange="Jumping()">
<% for(int i=1;i<=pageCtl.maxPage;i++) {
if (i== pageCtl.curPage){
%>
<OPTION selected value=<%=i%>><%=i%></OPTION>
<%}else{%>
<OPTION value=<%=i%>><%=i%></OPTION>
<%}}%>
</SELECT>页
package com.ichong.idao;import java.util.List;import com.ichong.entity.News;
public interface INewsDao {
/**
* @分页查找宠物新闻
* @param page 查找第几页
* @param size 每页多少条记录
* @return
*/
List<News> getNewsByPageAndSize(int page,int size);
/**
* @获取按size条记录每页共能分多少页
* @param size
* @return
*/
int getPages(int size);
boolean addNews(News news);
boolean deleteNews(int id);
}页面中:
<%
int pagenum = 1;
int pagesum = 0;
int size = 5; if (request.getParameter("pagenum") != null) { //容错处理
try {
pagenum = Integer.parseInt(request.getParameter("pagenum")); //容错处理
if (pagenum < 1) //容错处理
pagenum = 1; //容错处理
} catch (Exception e) {
pagenum = 1; //容错处理 }
}
INewsDao nd = DaoFactory.getNewsDao();
pagesum = nd.getPages(size); if (pagenum > pagesum) { //容错处理
pagenum = pagesum; //容错处理
} //容错处理
if(pagenum <1) //容错处理
pagenum = 1; //容错处理
List<News> news = nd.getNewsByPageAndSize(pagenum, size);
%>
在读取数据的时候根据读取的页数,计算出该页显示的信息的行号,然后获取数据显示。
http://user.qzone.qq.com/409120723/blog/1240717889
这里面有六个分页方法,你好好看看,需要用哪个自己决定。
关键在于确定当前页(超链接里的参数),然后根据当前页发送请求,数据库返回相应的数据。
1.首页为1,每页显示行数自己设置。
2.根据首页和当前页可以确定上一页
3.根据数据总条数和每页显示数可以确定末页
4.根据末页和当前页可以确定下一页
/**
* 分页实体类
* @author dhw
*
*/
public class MyPage {
/**每页显示行数*/
private int row = 22;
/**当前页,默认为1*/
private int onNbr = 1;
/**上一页*/
private int upNbr;
/**下一页*/
private int downNbr;
/**末页*/
private int lastNbr;
/**总的数据量*/
private int dbRows;
public int getDbRows() {
return dbRows;
}
public void setDbRows(int dbRows) {
this.dbRows = dbRows;
// 通过总行数设置最后页和下一页
this.lastNbr = (this.dbRows%this.row==0?this.dbRows/this.row:this.dbRows/this.row+1);
this.downNbr = (this.onNbr==this.lastNbr?this.onNbr:this.onNbr+1);
}
public int getOnNbr() {
return onNbr;
}
public void setOnNbr(int onNbr) {
this.onNbr = onNbr;
// 通过当前页设置上一页
this.upNbr = this.onNbr>1?this.onNbr-1:1;
}
public int getDownNbr() {
return downNbr;
}
public int getLastNbr() {
return lastNbr;
}
public void setLastNbr(int lastNbr) {
this.lastNbr = lastNbr;
}
public int getUpNbr() {
return upNbr;
}
public void setUpNbr(int upNbr) {
this.upNbr = upNbr;
}
public void setDownNbr(int downNbr) {
this.downNbr = downNbr;
}
public int getRow() {
return row;
}
public void setRow(int row) {
this.row = row;
}}
我这里只是提供一种思路,也应该有其他方法。
<a href="queryPetList.do?onNbr=1">首页</a>
<a href="queryPetList.do?onNbr="+myPage.getUpNbr()>上一页</a>
<a href="queryPetList.do?onNbr="+myPage.getDownNbr()>下一页</a>
<a href="queryPetList.do?onNbr="+myPage.getLastNbr()>末页</a>当然还有一种方式是AJAX不刷新页面方式,那需要异步请求。
楼主可以去参考参考
直接用criteria写条件
criteria.addOrder(...);
criteria.setFirstResult(start);//开始位置
criteria.setMaxResults(COUNT);//
criteria.list();
取当前页显示的数据
用另外一个criteria来取总条数
...查询条件省略
criteria1.setProjection(Projections.rowCount());
List countlist= criteria1.list();
totalCount = Integer.parseInt(countlist.get(0).toString());//总条数
countlist.get(0).toString()这种写法是有点丑陋了 呵呵 不过 聚合函数操作嘛
必然会有个返回值的
用jdbc的话要判断结果集的大小比如每页显示12条 最后一页还有3条 这样的情况要单独处理
关键问题 整个过程很复杂 我始终理不清
从页面到业务逻辑层 在到DAO层, 在到数据库中的数据
我很难把他们串起来 .................
脑子都想破了
import java.util.*;
public class Paginate {
private int pageNo;
private int pageSize;
private int pageCount;
private int totalCount; public Paginate(int pageNo, int pageSize) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
}
public Paginate() {
super();
// TODO Auto-generated constructor stub
}
public Paginate(int pageNo, int pageSize, int pageCount, int totalCount) {
super();
this.pageNo = pageNo;
this.pageSize = pageSize;
this.pageCount = pageCount;
this.totalCount = totalCount;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List Pagging(List all)
{
// if(this.pageSize<=all.size())
// {
// return all;
// }
if(all.size()==0)
{
return null;
}
if(this.pageSize<0)
{
this.pageSize=5;
}
this.totalCount=all.size();
this.pageCount=this.totalCount/this.pageSize;
if(this.totalCount%this.pageSize!=0)
{
this.pageCount++;
}
if(pageNo<0)
{
pageNo=1;
}
if(pageNo>pageCount)
{
pageNo=pageCount;
}
List lst=new ArrayList();
for (int i = (this.pageNo-1)*this.pageSize; i < this.pageNo*this.pageSize; i++) {
if(i>=all.size())
{
break;
}
lst.add(all.get(i));
}
return lst;
}}
定义这个类 以后想给那个集合分页 就创建个对象 设置下 pageNo当前页码数 pageSize每页显示几条信息 把要分页的那个集合传进去 就ok这个是通用的 不过效率会有点低 但是现在很实用