java的jsp如何分页显示查询结果呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java的jsp如何分页显示查询结果呢?相关的知识,希望对你有一定的参考价值。

我是个初学java不到1个月的菜鸟,目前遇到了一个分页查询的问题让我百思不得其解。我的查询功能已经完成,由于dao层里的方法都已经写好数据也不多,所以不打算采用真分页,选择假分页。能告诉我jsp页面与servlet怎么写吗,关于查询一共多少个结果的方法我也已经写好,共多少页我也计算好了,就是不知道控制一页显示多少条数据的关键代码是怎么写的,特此求大神教我,小白感激不尽。

//分页类

public class Pager 
private int pageNow = 1;//
private int pageSize = 7;//
private int totalPage;//
private int totalSize;//

public Pager(int pageNow, int totalSize) 
this.pageNow = pageNow;
this.totalSize = totalSize;


public int getPageNow() 
return pageNow;


public void setPageNow(int pageNow) 
this.pageNow = pageNow;


public int getPageSize() 
return pageSize;


public void setPageSize(int pageSize) 
this.pageSize = pageSize;


public int getTotalPage() 

totalPage = getTotalSize() / getPageSize();
if (totalSize % pageSize != 0)
totalPage++;
return totalPage;


public void setTotalPage(int totalPage) 
this.totalPage = totalPage;


public int getTotalSize() 
return totalSize;


public void setTotalSize(int totalSize) 
this.totalSize = totalSize;


public boolean isHasFirst() 

if (pageNow == 1)
return false;
else
return true;


public void setHasFirst(boolean hasFirst) 


public boolean isHasPre() 
if (this.isHasFirst())
return true;
else
return false;


public void setHasPre(boolean hasPre) 


public boolean isHasNext() 
if (isHasLast())
return true;
else
return false;


public void setHasNext(boolean hasNext) 


public boolean isHasLast() 
if (pageNow == this.getTotalPage())
return false;
else
return true;


public void setHasLast(boolean hasLast) 


//service层
public class PageService 
@SuppressWarnings("unchecked")
public List<?> list(int pageNow, int pageSize, String hql) 
Session session = HibernateSessionFactory.getSession();
Transaction tx = session.beginTransaction();
List<Object> objects;
Query query = session.createQuery(hql);
query.setFirstResult(pageSize * (pageNow - 1));
query.setMaxResults(pageSize);
objects = query.list();
tx.commit();
return objects;


//在action中调用

public String listUser() 
String hql = "from Userinfo u";
if (ps.list(pageNow, pageSize, hql) != null) 
userinfos = (List<Userinfo>) ps.list(pageNow, pageSize, hql);
Map<String, Object> request = (Map<String, Object>) ActionContext
.getContext().get("request");
Pager page = new Pager(this.getPageNow(), us.getUserSize());
request.put("userinfos", userinfos);
request.put("page", page);
return Action.SUCCESS;
 else 
return Action.LOGIN;


//jsp中
<body>
<table width="832" border="0" cellpadding="0" cellspacing="0" id="listBook">
  <tr bgcolor="#E7E7E9">
    <td width="5%" height="40">&nbsp;</td>
    <td width="25%" colspan="2" bgcolor="#E7E7E9"><div align="center" class="STYLE10">邮箱</div></td>
    <td width="25%" colspan="2" bgcolor="#E7E7E9" class="STYLE1"><div align="center" class="STYLE10">密码</div></td>
    <td width="25%" colspan="2" bgcolor="#E7E7E9" class="STYLE1"><div align="center" class="STYLE10">权限</div></td>
    <td width="8%" bgcolor="#E7E7E9"><span class="STYLE8"></span></td>
    <td width="8%" bgcolor="#E7E7E9"><span class="STYLE8"></span></td>
  </tr>
  <s:iterator value="#request.userinfos" id="oneUser">
  <tr>
    <td height="50">
    
      <div align="center">
        <input type="checkbox" name="checkbox" value="checkbox" />
       
    </div></td>
    <td width="5%"></td>
    <td width="23%" class="STYLE4"><s:property
value="#oneUser.email" /></td>
    <td width="5%" class="STYLE4"></td>
    <td width="23%"><span class="STYLE4"><s:property
value="#oneUser.password" /></span></td>
    <td width="5%" class="STYLE4"></td>
    <td width="23%"><span class="STYLE4">
    <s:if test="#oneUser.power==1">
         普通用户
    </s:if>
    <s:else>
         管理员
    </s:else>
   </span></td>
    <td><div align="right" class="STYLE1"><a href='deleteUser?userid=<s:property value="#oneUser.id"/>' class="STYLE5">删除|</a></div></td>
    <td class="STYLE1"><a href='lookUser?userid=<s:property value="#oneUser.id"/>&pageNow=<s:property value="#request.page.pageNow"/>' target="_self" class="STYLE5">修改</a></td>
  </tr>
  </s:iterator>
  
  <tr>
    <td colspan="9"><table width="832" border="0" cellspacing="0" bgcolor="#E7E7E9">
      <s:set name="page" value="#request.page"></s:set>
    
      <tr>
        <td width="70%">&nbsp;</td>
        <s:if test="#page.isHasPre()">
        <td width="10%"><a href='listUser?pageNow=<s:property value="#page.pageNow-1"/>' target="_self" class="STYLE3" >上一页</a></td>
        </s:if>
        <s:else>
         <td width="10%"><a href="listUser?pageNow=1" target="_self" class="STYLE3" >上一页</a></td>
        </s:else>
       <s:if test="#page.isHasNext()">
        <td width="10%"><a href="listUser?pageNow=<s:property value="#page.pageNow+1"/>" target="_self" class="STYLE3">下一页</a></td>
        </s:if>
       <s:else>
        <td width="10%"><a href="listUser?pageNow=<s:property value="#page.totalPage"/>" target="_self" class="STYLE3">下一页</a></td>
        </s:else>
        <td width="10%"><a href="listUser?pageNow=<s:property value="#page.totalPage"/>" target="_self" class="STYLE3">尾页</a></td>
      </tr>
    </table></td>
  </tr>
</table>
</body>
</html>

这是采用struts2+hibernate 做的,你可以参考一下

参考技术A   分页显示一般有两种实现方式:业务层分页、数据库层分页(以下会用到两个参数,提前说明下 page:请求第几页,size:每页显示多少条)

  业务层分页:从数据库取出所有数据,然后通过传过来的page和size对所有数据截取,比如一共查了100条数据,保存在list里面,要求查询第2页,每页显示10条,则可以通过list属性,取100条数据 中的第11条到第20条,可通过遍历实现。

  数据库层分页:数据库都会有分页函数(mysql 是limit函数,sqlServer是row_number()函数,可自行百度下)该方法是通过传过来的page和size在查询数据库时就开始分页,以mysql为例,查询第2页,每页显示10条,则sql语句是 ”select * from XX limit 10,10“(第一个10表示从下标为10开始查,第二个10是共读取10条)

  性能肯定是第二种分页方式好,只要搞懂分页原理,想实现分页其实很简单,只要搞清楚分页是将多条数据中的某几条挑出来
参考技术B

你可以写一个pageBean

package cn.oceanlive.pager.domain;

import java.util.List;

public class PageBean<T> 
    private int pc;// 当前页码
    private int tr;// 总记录数
    private int ps;// 每页记录数
    private String url;// 基本url(这个你可以不用要,当然要,也可以)
    private List<T> beanList;// 当前页记录

    public PageBean(int pc, int tr, int ps) 
        this.pc = pc;
        this.tr = tr;
        this.ps = ps;
    

    // 返回当前页首行的下标
    public int getIndex() 
        return (pc - 1) * ps;
    

    // 返回总页数
    public int getTp() 
        int tp = tr / ps;
        if (tr % ps != 0)
            tp++;
        return tp;
    

    public PageBean() 
    

    public int getPc() 
        return pc;
    

    public void setPc(int pc) 
        this.pc = pc;
    

    public int getTr() 
        return tr;
    

    public void setTr(int tr) 
        this.tr = tr;
    

    public int getPs() 
        return ps;
    

    public void setPs(int ps) 
        this.ps = ps;
    

    public String getUrl() 
        return url;
    

    public void setUrl(String url) 
        this.url = url;
    

    public List<T> getBeanList() 
        return beanList;
    

    public void setBeanList(List<T> beanList) 
        this.beanList = beanList;
    

追问

这个要怎么用啊?

追答   //根据条件查询,pc是当前页
    public PageBean<Book> findByCategory(String cid, int pc) 
        try 
            JdbcUtils.beginTransaction();//开启事物
            int tr = bookDao.countByCategory(cid);//获取总记录数
            int ps = PageConstants.BOOK_PAGE_SIZE;//获取每页记录数(设置一页显示几个条目)
            PageBean<Book> pb = new PageBean<Book>(pc, tr, ps);//创建PageBean
            List<Book> bookList = bookDao.findByCategory(cid, pb.getIndex(), ps);//获取本页记录(本页要显示的那几条记录)
            pb.setBeanList(bookList);//把本页记录存放到pb中
            JdbcUtils.commitTransaction();//提交事物
            return pb;//返回pagebean对象(此对象中,包含要显示的List结果集,
                       //将他放置在session或者是request域中,前台直接获取显示)
         catch(SQLException e) 
            try 
                JdbcUtils.rollbackTransaction();
             catch (SQLException e1) 
                throw new RuntimeException(e1);    
            
            throw new RuntimeException(e);
        
    

参考技术C 思路是:写个Page类,里面有 总页数,页面容量,当前页;通过页面容量和当前页,就能算出分页查询的起始页和结束页,再写个数据对象继承Page类,把数据对象在jsp和Controller来回传就行了。前端分页可以上网搜插件。kkpager很不错 参考技术D 你是在后台一次性查询数据然后再前端分页展示是吧。如果是这样建议你使用Jquery 的插件。jquery的Datetable就可以。

想用JAVA WEB 实现分页技术。请问应该怎么做

具体来说就是希望从数据库每次只取一部分结果,这样每页就显示那些结果,这样的分页技术应该怎么是实现呢?或者说有哪些资料可以参考一下?书也行。谢了

实现原理很简单,就是建立一个Page类,里面放当前访问的页数(这个是从客户浏览器传到后台的数据,所以你的分页需要用它来定位记录的条目)和每一页显示的记录行数。然后通过分页计算就可以得出下列数据。
(假定你的页数从1开始)
1、总页数 = 总记录数/每页大小,如果0!=总记录数%每页大小,那么总页数再+1
2、当前页数(从浏览器传递的参数中获得)
3、表记录的起始位置=(当前页数-1)*每页大小
4、总记录数(select count(*) from [表名] [where [条件]],从数据库中查询得到)
5、每页大小,可以固定,也可以从页面传过来

有了这几个参数之后,就用sql语句查出对应的记录就可以了。
mysql数据库用limit 表记录的起始位置,每页大小 语句添加到你的查询语句最后面
sqlserver数据库用top语句和not in 来做
oracle数据库用rownum来做

再给你一段分页对象代码,你自己先读一下

public class Page

private long totalCount = 0;// 总记录数
private int pageNumber = 1;// 当前页号,默认显示第一页
private int pageSize = 20; // 每页大小,默认每页20条
private int totalPage = 0;// 总页数,默认为0
private int startRow = 0;// 起始记录行号,默认为从表头开始

/**
* 分页计算方法,由setTotalCount调用
*/
public void pagination()
// 计算总页数
if (this.totalCount % pageSize == 0)
this.totalPage = new Long(this.totalCount / pageSize).intValue();
else
this.totalPage = new Long(this.totalCount / pageSize).intValue() + 1;
// 排除错误页号
if (this.pageNumber < 1)
this.pageNumber = 1;
if (this.pageNumber > this.totalPage)
this.pageNumber = this.totalPage;
// 计算起始行号
this.startRow = (this.pageNumber - 1) * this.pageSize;


public long getTotalCount()
return totalCount;


public void setTotalCount(long totalCount)
this.totalCount = totalCount;
this.pagination();


public int getPageNumber()
return pageNumber;


public void setPageNumber(int pageNumber)
this.pageNumber = pageNumber;


public int getPageSize()
return pageSize;


public void setPageSize(int pageSize)
this.pageSize = pageSize;


public int getTotalPage()
return totalPage;


public void setTotalPage(int totalPage)
this.totalPage = totalPage;


public int getStartRow()
return startRow;


public void setStartRow(int startRow)
this.startRow = startRow;


参考技术A

利用数据库的分页:

如MYSQL 使用limit pageNum,pagesize

EG:

   

SELECT * FROM TABLE1 WHERE ... ORDER  BY .. GROUP BY ... LIMIT 0,10

limit必须放在最后从0开始(即0是第一页),其中pageNum是当前第几页,pagesize是每页显示多少条。

ORACLE 分页:

oracle分页可使用rowid,rownum来分页,详见:http://www.cnblogs.com/hxw/archive/2005/09/11/234619.html


参考技术B mysql 用 limit
oracle 用 使用rowid,rownum来分页
sqlserver 用 top实现
1.Oracle:select * from ( select row_.*, rownum rownum_ from ( query_SQL ) row_ where rownum =< max) where rownum_ >= min2.SQL Server:select top @pagesize * from tablename where id not in (select top @pagesize*(@page-1) id from tablename order by id) order by id

3.MySQLselect * from tablename limit position, counter

4.DB2select * from (select *,rownumber() as ROW_NEXT from tablename) where ROW_NEXT between min and max
参考技术C

select * from 

(

     SELECT  row_number() OVER(ORDER by id) as rownum,id,name

        from test1  

 ) t where t.rownum between pageSize*(page-1)+1 and pageSize*page

以上是关于java的jsp如何分页显示查询结果呢?的主要内容,如果未能解决你的问题,请参考以下文章

java中如何实现分页显示

oracle数据库对查询后的结果分页如何实现和jsp分页

C#.NET里怎么实现查询分页显示呢?

如何用把Arraylist中的结果在jsp页面中用分页显示?java+jsp语言

在JSP中如何实现分页技术啊?

java jsp分页页码问题?