oracle:select * from table where rownum < 5; mysql:select * from table limit 0,5; 结果放list里面 在页面循环输出就好了
public class PageBean { private int pageCount=5;//每页记录数 private int totalPage=0;//总页数 private int totalCount=0;//总记录数 private int currentPage=1;//当前页码 private boolean hasPrevious=false;//有没有上一页 private boolean hasNext=false;//有没有下一页 private int startPage=1;//起始页 private int endPage=1;//结束页 private int viewPageCount=8;//每页显示几个公页,类GOOGLE
private List list=null;//被分页的LIST //初始化分页Bean public void init(List list,int pageCount,int viewPageCount,int cupage) { //初始化参数 this.list=list; this.pageCount=pageCount; this.currentPage=cupage; this.viewPageCount=viewPageCount; //计算总记录数 totalCount=list.size(); //计算总页数 totalPage=(totalCount+pageCount-1)/pageCount; //检验当前页是否越界 if(currentPage<1) currentPage=1; if(currentPage>totalPage) currentPage=totalPage; //初始化起始页和终止页 this.setStartPage(); this.setEndPage(); //检验是否有上一页,下一页 if(currentPage+1<totalPage)hasNext=true; if(currentPage-1>1)hasPrevious=true; } //的到当前页的LIST public List getCurrentPage() {
List list=new ArrayList(); //计算起始记录和终止记录 int start=(currentPage-1)*pageCount; int endrs=start+pageCount-1; if(endrs>=totalCount)endrs=totalCount-1; int count=0; //降序填加list元素 for(int i=endrs;i>=start;i--) { list.add(count++,this.list.get(i)); // Collections.reverse(list); if(count>pageCount)break; } return list; /* int start=(currentPage-1)*pageCount; int count=1; for(int i=start;i<this.list.size();i++) { list.add(this.list.get(i)); if(count++>pageCount-1)break; } return list;*/ } /* public List getCurrentPage(int page) { if(page<1) page=1; if(page>totalPage) page=totalPage; List list=new ArrayList(); int start=(page-1)*pageCount; int count=1; for(int i=start;i<this.list.size();i++) { list.add(this.list.get(i)); if(count++>pageCount-1)break; } return list; } //取上一页LIST public List getPrevious() { if(hasPrevious) { currentPage=currentPage-1; } if(currentPage>1) { hasNext=true; hasPrevious=true; }else { hasNext=true; hasPrevious=false; } return this.getCurrentPage();
}*/ //取下一页LIST /* public List getNext() { if(hasNext) { currentPage=currentPage+1; } if(currentPage<totalPage) { hasNext=true; hasPrevious=true; }else { hasNext=false; hasPrevious=true; } return this.getCurrentPage(); }*/ // 设置始页面 public void setStartPage() {
select top 5 * from 表名 //只用查询前五条数据! int rowBegin=0; rowBegin=num*(page-1); String sql="select top 5 * from 表名 where id not in(select top "+rowBegin+" id from 表名)";//也可以进行一下排序,这是查询你要查的下几个五条的信息,也就是说page=1,是查第一 个五条,page=2是差第二个五条//循环遍历输出//做翻页就进行传递参数List list=new 类名.方法名; if(list!=null&&list.size()!=0) { for(int i=0;i<list.size();i++) { 属性类 p=(属性类)list.get(i); %> <table> <tr> <td><%=p.getName()%></td> <td><%=p.getSex()%></td> <td><%=p.getBirthday()%></td> <td><%=p.getNation()%></td> <td><%=p.getCity() %></td> </tr> </table> <% } } %>
超链接的话把数据包含在<a></a>里面就行了
mysql:select * from table limit 0,5;
结果放list里面 在页面循环输出就好了
public class PageBean
{
private int pageCount=5;//每页记录数
private int totalPage=0;//总页数
private int totalCount=0;//总记录数
private int currentPage=1;//当前页码
private boolean hasPrevious=false;//有没有上一页
private boolean hasNext=false;//有没有下一页
private int startPage=1;//起始页
private int endPage=1;//结束页
private int viewPageCount=8;//每页显示几个公页,类GOOGLE
private List list=null;//被分页的LIST
//初始化分页Bean
public void init(List list,int pageCount,int viewPageCount,int cupage)
{
//初始化参数
this.list=list;
this.pageCount=pageCount;
this.currentPage=cupage;
this.viewPageCount=viewPageCount;
//计算总记录数
totalCount=list.size();
//计算总页数
totalPage=(totalCount+pageCount-1)/pageCount;
//检验当前页是否越界
if(currentPage<1)
currentPage=1;
if(currentPage>totalPage)
currentPage=totalPage;
//初始化起始页和终止页
this.setStartPage();
this.setEndPage();
//检验是否有上一页,下一页
if(currentPage+1<totalPage)hasNext=true;
if(currentPage-1>1)hasPrevious=true;
}
//的到当前页的LIST
public List getCurrentPage()
{
List list=new ArrayList();
//计算起始记录和终止记录
int start=(currentPage-1)*pageCount;
int endrs=start+pageCount-1;
if(endrs>=totalCount)endrs=totalCount-1;
int count=0;
//降序填加list元素
for(int i=endrs;i>=start;i--)
{
list.add(count++,this.list.get(i));
// Collections.reverse(list);
if(count>pageCount)break;
}
return list;
/*
int start=(currentPage-1)*pageCount;
int count=1;
for(int i=start;i<this.list.size();i++)
{
list.add(this.list.get(i));
if(count++>pageCount-1)break;
}
return list;*/
}
/*
public List getCurrentPage(int page)
{
if(page<1)
page=1;
if(page>totalPage)
page=totalPage;
List list=new ArrayList();
int start=(page-1)*pageCount;
int count=1;
for(int i=start;i<this.list.size();i++)
{
list.add(this.list.get(i));
if(count++>pageCount-1)break;
}
return list;
}
//取上一页LIST
public List getPrevious()
{
if(hasPrevious)
{
currentPage=currentPage-1;
}
if(currentPage>1)
{
hasNext=true;
hasPrevious=true;
}else
{
hasNext=true;
hasPrevious=false;
}
return this.getCurrentPage();
}*/
//取下一页LIST
/* public List getNext()
{
if(hasNext)
{
currentPage=currentPage+1;
}
if(currentPage<totalPage)
{
hasNext=true;
hasPrevious=true;
}else
{
hasNext=false;
hasPrevious=true;
}
return this.getCurrentPage();
}*/
// 设置始页面
public void setStartPage()
{
if(currentPage-viewPageCount/2<=0)
{
this.startPage=1;
}else
{
this.startPage=currentPage-viewPageCount/2;
}
}
//设置终止页
public void setEndPage()
{ if(totalPage<=currentPage+viewPageCount/2)
{
this.endPage=this.totalPage;
}else
{
this.endPage=currentPage+viewPageCount/2;
}
}
//的到是否有下页
public boolean isHasNext()
{
return hasNext;
}
//的到是否有上一页
public boolean isHasPrevious()
{
return hasPrevious;
}
//的到终止页
public int getEndPage()
{
return endPage;
}
//的到起始页
public int getStartPage()
{
return startPage;
}
//的到当前页
public int getPageCount()
{
return pageCount;
}
//的到总记录数
public int getTotalCount()
{
return totalCount;
}
//的到总页数
public int getTotalPage()
{
return totalPage;
}
//的到显示页数如:1 2 3 4 5 6
public int getViewPageCount()
{
return viewPageCount;
}
}
在公共类中写
/**
* 通用的分页查询方法
*/
public List searchPage(String hql,Object[] values , int page , int count) {
Session session=super.getSession();
Query query=session.createQuery(hql);
if(values!=null){
for (int i = 0; i < values.length; i++) {
query.setParameter(i, values[i]);
}
}
//设置从第几条数据开始
query.setFirstResult((page-1)*count); //共返回多少条数据
query.setMaxResults(count); return query.list();
}
public int total(String hql,Object[] values)
{ try
{
Session session=super.getSession();
Query query=session.createQuery(hql);
if(values!=null){
for (int i = 0; i < values.length; i++)
{
query.setParameter(i, values[i]);
}
}
return Integer.parseInt(query.uniqueResult().toString());
}
catch (Exception e)
{
e.printStackTrace();
}
return 0;
}在Servlet中//每页显示多少条
int pageNo=5;
//总条数
int count=0;
if(request.getParameter("count")==null)
{
count=service.selectcount(startdate, enddate, sellNum, Integer.parseInt(selnetName.trim()));
}else
{
count=Integer.parseInt(request.getParameter("count"));
}
//总页数
int num=0;
//当前页数
int page=0; if(request.getParameter("page") == null)
{
page= 1;
}
else{
page= Integer.parseInt(request.getParameter("page"));
}
if(page<1)
{
page=1;
}
if(count!=0){
if(count%pageNo==0){
num=count/pageNo;
}
else{
num=count/pageNo+1;
}
}
if(page>=num)
{
page=num;
}
List list= null; if(num!=0) {
list=service.queryPage(startdate,enddate,sellNum,Integer.parseInt(selnetName.trim()), page, pageNo);
} if (list==null)
{
request.setAttribute("v", "对不起没有你要找的信息");
} request.setAttribute("SellForm", list);
request.setAttribute("page", page);
request.setAttribute("num", num);
request.setAttribute("count", count);
在页面用这些存的值去取就可以了
一是sql语法,二是分页的实现方法
用Mysql语句控制:select * from 表名 limit 5;
mystr=application.getRealPath("database/winnetdata.mdb");
mydata.setrealpath(mystr);
mydata.setSqlstr("select id,news_title from winet_news order by id desc");
mydata.initial();
sqlRst=mydata.exeQuery();
while(sqlRst.next() && i<4){
tempstr=sqlRst.getString(2);
if(tempstr.length()>30) tempstr=tempstr.substring(0,29)+"...";
out.print("<tr><td>·<a href=newshow.jsp?newsID="+sqlRst.getString(1)+" target=_blank>"+tempstr+"</a></td></tr>");
i++;
}
i=0;
sqlRst.close();
mydata.Closedb();%>
二、用SQL语句控制就可以了 select top 5 * from 表名
用Mysql语句控制:select * from 表名 limit 5;
其他内容不写了
<div style="height:200px; width:78%; margin:10px auto;padding:5px 10px 5px 10px; text-align:center;" >
<table cellspacing="3"> <tr>
<%
if(coll2!=null && !coll2.isEmpty()){
Iterator newsit=coll2.iterator();
int i=0;
while(newsit.hasNext()){
OrganizationForm organizationForm=(OrganizationForm)newsit.next();
int id=organizationForm.getId().intValue();
String name=new String(organizationForm.getName());
String url=new String("organization.do?action=organizationDetail&organizationid="+id);
if(i%3==0){
out.print(" <tr> </tr>");
}
out.print(" <td> <ul class='nav4'> <li>");
out.print(" <a href='"+url+"'>"+"·" + name+" </a>");
out.print(" </ul> </li> </td>");
i++;
}
}%>
</table>
</tr>
</div>只要看if后的东西就行了,前面的是我项目中的,直接复制给你的,if(i%3==0)这个是控制每行显示三列,这个是在表格的内容中加了连接的。
具体说明如下: 1.public int curPage ; //当前是第几页
2.public int maxPage ; //一共有多少页
3.public int maxRowCount ; //一共有多少行
4.public int rowsPerPage ; //每页有多少行
5.public yourDataType yourdata ;//装载每页的数据
关于每页所要显示的"实体数据"的载体,其实现方式多种多样,比如说在IBM电子商务系统MPE中是以bean的形式,这是一种面向对象的实现,比较的简略的实现可用java.util.Vector等,为了避免分散对核心问题的的注意力,这里用youDataType予以抽象.
6.public void countMaxPage() { //根据总行数计算总页数
if (this.maxRowCount % this.rowsPerPage==0){
this.maxPage = this.maxRowCount/this.rowsPerPage;
}else{
this.maxPage = this.maxRowCount/this.rowsPerPage + 1;
}
}
this.rowsPerPage其实应从配置文件中获得,这样做的好处是程序能在运行中读取从而实现动态(再)配置,简略的做法是直接写在程序中。
7.public PageControl(yourPersistenceLayer yourPL)
这是一个参数类型为yourPersistenceLayer的构造函数.PersistenceLayer是直接同数据库打交道的一层,不同的公司都有不同的实现,比如说Microsoft的ADO就可以看作是一PersistenceLayer,IBM在其MPE系统中也实现了一个庞大的PersistenceLayer,. 一种投机的做法是不要PersistenceLayer,或者可以说是淡化该层,这样做势必降低系统的稳定性,可重用性,可扩展性。具体可以参考附录文献.在这个构造函数中,有这样几个主要操作: this.maxRowCount = yourPL.getAvailableCount(); //得到总行数
this.yourdata = yourPL.getResult(); //得到要显示于本页的数据
this.countMaxPage(); //计算总页数 关于this.yourdata这里还有一个细节:在从数据库中获取"实体数据"时,通常有两种方式:(A)一次性获取所有数据;(B)每次根据当前页号,获取本页的数据,将其它数据予以抛弃;考虑到数据往往是大量甚至是海量的,如果一次性的获取,那么这些数据必然大量占用服务器内存资源,使系统性能大大降低,因此建议使用方法(A) 接下来的工作就可以交给servlet和jsp了
在servlet的service()方法中只需进行如下操作: PageControl pageCtl = yourBusinessObject.listData(req.getParameter("jumpPage"));
req.setAttribute("pageCtl",pageCtl); 说明:yourBusinessObject封装了商业逻辑,是位于Business Logic Layer中的一个对象,运用OOAD的方法,封装商业对象,在Persistent Layer之上组建坚实的Business Logic Layer同样是构建大型电子商务架构的关键所在。本文的关注点只是分页处理,暂不详细论述.
在每个想要实现翻页显示数据的jsp页面中,我们的工作也很简单,其代码是公式化的: <jsp:useBean id="pageCtl" class="yourpackage.PageControl" scope="request">;</jsp:useBean>;
<%if(pageCtl.maxPage!=1)){%>;
<form name="PageForm" action="/servlet/yourpackage.yourservlet" method="post">;
<%@ include file="/yourpath/pageman.jsp"%>;
</form>;
<%}%>;
说明:
1.if(pageCtl.maxPage!=1)实现了这样一个逻辑:如果所取得数据不足一页,那么就不用进行翻页显示。
2.我们注意到<%@ include file="/yourpath/pageman.jsp"%>;这使得真正的翻页部分完全得到了重用. 那么pageman.jsp到底做了些什么呢?它实现了经常做翻页处理的人耳熟能详的逻辑
(A)第一页时不能再向前翻;
(B)最后一页时不能再向后翻;
同时能够进行页面任意跳转,具体代码如下: 每页<%=pageCtl.rowsPerPage%>;行
共<%=pageCtl.maxRowCount%>;行
第<%=pageCtl.curPage%>;页
共<%=pageCtl.maxPage%>;页 ;
<%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>;页
1)从便于扩展来说,不要在jsp里面写任何java代码,一定要分层,所以,struts的引用还是必要的。
2)关于分页,各位说的都是基于具体的数据库的,比如top 5等等。这是sqlserver的语法,但对oracle,mysql等数据库就不适合。Hibernate是比较流行的数据库层中间件,封装了对主流数据库的访问和操作,所以,后台用Hibernte也理所当然了。好了,下面可以开始了。我们的代码就是基于Struts+Hibernate的。Spring也可以加进来,但与本话题相关性不大,暂时不提。
我不写大段的代码,只写出核心的部分,这样各位看起来有条理性,从整体把握。
1)Struts负责从界面获取上一页、下一页、首页、末页、每页大小之类的控制命令以及显示总页数、总条数己每页具体数据。具体分页查询在Hibernate中实现
2)Hibernate的业务类进行具体查询,参数由Struts的Action业务类传递,最核心的参数包括下面两个:
当前页序号 currentpage
每页大小 pagesize
这样就可以完成分页了。当然,如果还要条件查询,还需要传入查询条件。 在Hibernate的业务类中,你只需写入下面两行代码就可以搞定:
query.setMaxRecords(pagesize); //设置每页数据条数,query是Query的实例
querysetFirstRecord(pagenum); //设置当前页的第一行数据索引号 其中pagenum=(currentpage-1)*pagesize + 1
举例来说,第一页是1-10,第二页是11-20
可以看出规律:每页的第一条数据索引和页编号、页大小关系就是上述公式计算得到 好了,List list = query.list(); 这样你就得到了一页数据了。Hibernate为你封装了具体实现,不管是什么数据库,都可以这样写,Hibernate根据当前数据库的Dialect属性,自动转换成具体的sql,比如sqlserver就是各位说的top 10,oracle则是rownum,mysql则是limit 至于显示,就不说了吧,用struts的标签库就可以完成 主要用到的标签有:<logic:present>
<logic:iterate></logic:iterate>
</logic:present>
有遗留问题可以联系我:[email protected]
我也听到很多大虾这么说,jsp页面不要有java代码!!
最近刚学struts,logic标签还在学习!!
int rowBegin=0;
rowBegin=num*(page-1);
String sql="select top 5 * from 表名 where id not in(select top "+rowBegin+" id from 表名)";//也可以进行一下排序,这是查询你要查的下几个五条的信息,也就是说page=1,是查第一 个五条,page=2是差第二个五条//循环遍历输出//做翻页就进行传递参数List list=new 类名.方法名;
if(list!=null&&list.size()!=0)
{
for(int i=0;i<list.size();i++)
{
属性类 p=(属性类)list.get(i);
%>
<table>
<tr>
<td><%=p.getName()%></td>
<td><%=p.getSex()%></td>
<td><%=p.getBirthday()%></td>
<td><%=p.getNation()%></td>
<td><%=p.getCity() %></td>
</tr>
</table>
<%
}
}
%>