希望大家帮帮忙。谁有简单的分页框架。希望大家给发个,谢谢了。我的邮箱是chianfsb@163.com
解决方案 »
- 【求助属性】SSH开发的WEB 想要在用户发送信息的模块中增加匿名发送,如何实现
- 大伙看一个jsp查询mysql乱码问题
- 时间戳 与 标准时间如何互换?
- 我做的一个文件上传,都实现了,但是在文件下却看不到上传的文件,是为什么
- javascript调用oxc控件,怎么判断oxc控件注册是否成功,非常非常重要的一个问题
- 在使用epass1000开发JSP页面时发生问题,有人遇到过嘛?
- js代码中如何加入jsp代码?
- 关于JSP的运行环境中的resin-2.1.0
- jsp只能传送一定数量的数据,多余数据不能传送到客户端,为什么?
- 求助大神 关于级联
- 在页面中获取当前时间,并存入数据库,用什么函数?
- 关于Hibernate中的反向集合
getPageBar(String url),该方法返回一个HTML的字符串,它就是你分页栏中的HTML,
在JSP页面中<s:property value="pages.getPageBar('http://....')"/>DAO层:public List<TbTopic> findTop(final int firstResult, final int maxResults) {
final String sql = "...";
List list = this.getHibernateTemplate().executeFind(new HibernateCallback(){
public Object doInHibernate(Session s) throws HibernateException {
Query query = s.createQuery(sql);
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
return query.list();
}
});
if(list != null && !list.isEmpty()) {
return list;
} else {
return null;
}
}
建议楼主自己琢磨琢磨。 分页其实就是依靠 当前页pageIndex 每页行数pageSize 总行数count 来搞定的
每次传递不同的pageIndex值来获得分页数据 并输出到页面上显示出来~~~~
自己写一个 封装一下。 以后永远就会了。 用别人的 不好!
private int pageSize; //一页显示的记录数
private int pageCount; //总页数
private boolean isLastPage; //是否是最后一页
private boolean hasNextPage; //是否有下一页
private boolean hasPreviousPage; //是否有上一页
private List showList; //待显示的数据集合
private int pageShowNumber; //待显示的页面
private static List resultList; //总记录
private int resultListCount; //总记录数量
/**
* 构造方法
*/
public Page(int pageSize){
this.pageSize=pageSize; //设置一页的记录数
showList=new ArrayList(); //初始
this.hasNextPage=true; //初始
this.hasPreviousPage=true; //初始
this.pageShowNumber=1;
}
/**
* 设置记录集
* @return void
*/
private void setResultList(List resultList){
if(resultList!=null){
this.resultList=resultList;
}
}
/**
* 设置总页数
* @return void
*/
private void setResultListCount(){
this.pageCount=this.resultList.size()/this.pageSize;
if(this.resultList.size()%this.pageSize!=0){
this.pageCount+=1;
}
}
/**
* 设置显示页面信息
* @return void
*/
private void setShowInfo(List resultList,String pageShow,HttpServletRequest request){
HttpSession session=request.getSession();
if(this.pageCount<=1){ //如果只有一页
this.hasNextPage=false;
this.hasPreviousPage=false;
}
if(pageShow==null||pageShow.equals("")){
this.pageShowNumber=1; //如果是第一次
if(session.getAttribute("page")!=null){
this.pageShowNumber=Integer.parseInt(session.getAttribute("page").toString());
}
this.hasPreviousPage=false;
}else{
this.pageShowNumber=Integer.parseInt(pageShow);
if(this.pageShowNumber<=1){ //如果为首页
this.pageShowNumber=1;
this.hasPreviousPage=false;
}else if(this.pageShowNumber>=this.pageCount){ //如果为尾页
this.pageShowNumber=this.pageCount;
this.hasNextPage=false;
}else{
this.hasNextPage=true;
this.hasPreviousPage=true;
}
}
session.setAttribute("page", this.pageShowNumber);
}
/**
* 设置要显示的记录集
* @return 要显示的记录集List
*/
private List getResultList(){
int pageFirst=pageShowNumber*pageSize-pageSize;
if(this.resultList.size()!=0){
for(int i=pageFirst;i<pageFirst+pageSize&&i<this.resultList.size();i++){
showList.add(this.resultList.get(i));
}
return showList;
}
return null;
}
/**
* 返回待显示的记录集
* @return 待显示的记录集List
*/
public List getPageList(List resultList,String pageShow,HttpServletRequest request){
this.setResultList(resultList);
this.setResultListCount();
this.setShowInfo(resultList,pageShow,request);
return this.getResultList();
}
/**
* 返回是否有下一页
* @return 是否有下一页boolean
*/
public boolean getHasNextPage(){
return this.hasNextPage;
}
/**
* 返回是否有上一页
* @return 是否有上一页boolean
*/
public boolean getHasPreviousPage(){
return this.hasPreviousPage;
}
/**
* 返回总页数
* @return 总页数int
*/
public int getPageCount(){
return this.pageCount;
}
/**
* 返回正显示的页面
* @return 正显示的页面int
*/
public int getPageShowNumber(){
return this.pageShowNumber;
}
/**
* 返回总记录数量
* @return 总记录数量int
*/
public int getResultListCount(){
return this.resultList.size();
}
String url; //显示路径
public void setObjPage(Page objPage){
this.page=objPage;
}
public void setUrl(String url){
this.url=url;
}
public int doAfterBody() throws JspException {
// TODO Auto-generated method stub
return super.doAfterBody();
} public int doEndTag() throws JspException {
// TODO Auto-generated method stub
return super.doEndTag();
} public int doStartTag() throws JspException {
JspWriter out=pageContext.getOut();
try {
out.print("<form method='POST' action='"+this.url+"' align='center'>");
out.print("记录总数:<font color='#FF0000'>"+page.getResultListCount()+"</font>   总页数:<font color='#FF0000'>"+page.getPageCount()+"</font>   ");
out.print("当前页数:<font color='#FF0000'>"+page.getPageShowNumber()+"</font>   ");
out.print("<a href='"+this.url+"?page=1'>【首页】</a>   "); if(page.getHasPreviousPage()){
out.print("<a href='"+this.url+"?page="+(page.getPageShowNumber()-1)+"'>【上一页】</a>   ");
}
// else{
// out.print("【上一页】");
// }
if(page.getHasNextPage()){
out.print("<a href='"+this.url+"?page="+(page.getPageShowNumber()+1)+"'>【下一页】</a>   ");
}
// else{
// out.print("【下一页】");
// }
out.print("<a href='"+this.url+"?page="+page.getPageCount()+"'>【末页】</a>   ");
// out.print("转到第:<input type='text' name='page' size='6'> 页");
// out.print("<input type=submit value=GO name=cndok>");
out.print("</form>");
} catch (IOException e) {
e.printStackTrace();
}
return super.doStartTag();
}
这个两个类可以参考下
package com.dengmin.oa.utils;import java.util.List;public class PageModel { /**
* 总记录数
*/
private int total;
/**
* 当前页的记录集
*/
private List datas; public List getDatas() {
return datas;
} public void setDatas(List datas) {
this.datas = datas;
} public int getTotal() {
return total;
} public void setTotal(int total) {
this.total = total;
}
}2 底层是基于Spring+Hibernate来做的。在DAO这一层,为其增加两个方法,底层的分页查询用的是Hibernate提供的分页查询。
Java代码
public interface UserDao {
public void addUser(User user);
/**
*
* @param offset 从第几条记录开始查询
* @param pagesize 每页显示多少条记录
* @return
*/
public PageModel findAllUser(int offset, int pagesize);
} public interface UserDao { public void addUser(User user); /**
*
* @param offset 从第几条记录开始查询
* @param pagesize 每页显示多少条记录
* @return
*/
public PageModel findAllUser(int offset, int pagesize);
}3 UserDao的实现类
Java代码
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public void addUser(User user) {
this.getHibernateTemplate().save(user);
}
public PageModel findAllUser(int offset, int pagesize) {
//得到总记录数
String queryCountHql = "select count(*) from User";
Query query = getSession().createQuery(queryCountHql);
int total = ((Long)query.uniqueResult()).intValue();
List datas = getSession().createQuery("from User")
.setFirstResult(offset)
.setMaxResults(pagesize)
.list();
//得到结果集
PageModel pm = new PageModel();
pm.setTotal(total);
pm.setDatas(datas);
return pm;
}
}
ok!底层的实现工作就做好了 在控制层中UserAction从DispatchAction继承重写它的unspecified方法
通过spring注入UserDao 代码如下:
Java代码
public class UserAction extends DispatchAction {
private UserDao userDao;
@Override
protected ActionForward unspecified(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) throws Exception {
int offset = 0;
try {
offset = Integer.parseInt(request.getParameter("pager.offset"));
} catch (Exception e) {
}
//这里我按照每页显示10条
PageModel pm = userDao.findAllUser(offset, 10);
request.setAttribute("pm", pm);
return mapping.findForward("success");
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
} spring中的配置如下
Java代码
<!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean name="/userManager"
class="com.dengmin.pager.actions.UserAction" scope="prototype">
<property name="userDao" ref="userDao" />
</bean> <!-- 配置sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configLocation">
<value>classpath:hibernate.cfg.xml</value>
</property>
</bean>
<!-- 配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean> <!-- 配置事务的传播特性 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" propagation="REQUIRED" />
</tx:attributes>
</tx:advice>
<bean id="userDao" class="com.dengmin.pager.dao.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory" />
</bean> <bean name="/userManager"
class="com.dengmin.pager.actions.UserAction" scope="prototype">
<property name="userDao" ref="userDao" />
</bean>
最后是jsp页面做数据显示
这里采用了jstl和pager-taglib的标签库
首先将其引入:
Java代码
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="pg" uri="http://jsptags.com/tags/navigation/pager" %>
Html代码
<body>
<h1>User Manager</h1>
<hr/>
<table width="778" border="0" cellPadding="0" cellSpacing="1" bgcolor="#6386d6">
<tr bgcolor="#EFF3F7">
<TD align="center">ID</TD>
<TD align="center">名称</TD>
<TD align="center">密码</TD>
<TD align="center">地址</TD>
<TD align="center">创建时间</TD>
<TD align="center">相关操作</TD>
</tr>
<c:if test="${!empty pm.datas}">
<c:forEach items="${pm.datas}" var="user">
<tr bgcolor="#EFF3F7">
<td align="center">${user.id }</td>
<td align="center">${user.username }</td>
<td align="center">${user.password}</td>
<td align="center">${user.address}</td>
<td align="center">${user.createTime }</td>
<td align="center">
修改
删除</td>
</tr>
</c:forEach>
</c:if>
<c:if test="${empty pm.datas}">
<tr>
<td colspan="5" align="center" bgcolor="#EFF3F7">
没有找到相应的记录
</td>
</tr>
</c:if>
</table>
<pg:pager url="userManager.do" items="${pm.total}" export="currentPageNumber=pageNumber">
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl }">上一页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${currentPageNumber eq pageNumber}">
<font color="red">${pageNumber }</font>
</c:when>
<c:otherwise>
<a href="${pageUrl }">${pageNumber }</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl }">下一页</a>
</pg:next>
<pg:last>
<a href="${pageUrl }">尾页</a>
</pg:last>
</pg:pager>
</body> 预览效果:
最后附上pager-taglib的使用方法 pg:pager【这个标签用来设置分页的总体参数】重要参数说明:
url:分页的链接根地址,pager标签会在这个链接的基础上附加分页参数
items:总记录数,pager标签正是根据这个值来计算分页参数的
maxPageItems:每页显示的行数,默认为10
maxIndexPages:在循环输出页码的时候,最大输出多少个页码,默认是10 pg:first【第一页的标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 首页第一行的索引值
lastItem - 首页最后一行的索引值 pg:pre【上一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 前页第一行的索引值
lastItem - 前页最后一行的索引值 pg:next【下一页标签】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 下页第一行的索引值
lastItem - 下页最后一行的索引值 pg:last重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - 尾页第一行的索引值
lastItem - 尾页最后一行的索引值 pg:pages【这个标签用来循环输出页码信息】重要参数说明:
export变量的意义:
pageUrl - 分页链接URL地址(最重要的export参数)
pageNumber - 页码
firstItem - pageNumber这个页码指定的那一页的第一行的索引值
lastItem - pageNumber这个页码指定的那一页的最后一行的索引值
{
if(pageNo<=0) pageNo=1;
StringBuffer sb=new StringBuffer();
int pageNum=size%pageSize==0?size/pageSize:size/pageSize+1;
if(pageNo==pageNum)//页码为最后一页时
{
if(pageNum==1)
{
sb.append("<a href='"+href+"?pageNo="+1+"'>"+1+"</a>");
return sb.toString();
}
if(pageNum>1)
{
if(pageSize<pageNum)
{
sb.append("<a href='"+href+"?pageNo="+1+"'>首页</a>");
sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");
for(int i=pageNum-pageSize+1;i<=pageNum;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
return sb.toString();
}
if(pageSize>=pageNum)
{
for(int i=1;i<=pageNum;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
return sb.toString();
}
}
}
if(pageNo<pageNum&&pageNo>1)//页码为第pageNo页时
{
if(pageNo+pageSize<pageNum)
{
sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");
for(int i=pageNo;i<=pageNo+pageSize;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
sb.append("<a href='"+href+"?pageNo="+(pageNo+1)+"'>下页</a>");
sb.append("<a href='"+href+"?pageNo="+pageNum+"'>尾页</a>");
return sb.toString();
}
if(pageNo+pageSize>=pageNum)
{
sb.append("<a href='"+href+"?pageNo="+1+"'>首页</a>");
sb.append("<a href='"+href+"?pageNo="+(pageNo-1)+"'>上页</a>");
sb.append("<a href='"+href+"?pageNo="+(pageNo-pageSize)+"' class='along'>前"+pageSize+"页</a>");
for(int i=pageNo;i<=pageNum;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
return sb.toString();
}
}
if(pageNo==1)//页码为第1页时
{
if(pageNum==1)
{
sb.append("<a href='"+href+"?pageNo="+1+"'>"+1+"</a>");
return sb.toString();
}
if(pageNum>1)
{
if(pageNum<=pageSize)
{
for(int i=1;i<=pageNum;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
return sb.toString();
}
if(pageNum>pageSize)
{
for(int i=1;i<=pageSize;i++)
{
sb.append("<a href='"+href+"?pageNo="+i+"'>"+i+"</a>");
}
sb.append("<a href='"+href+"?pageNo="+(pageNo+pageSize)+"' class='along'>后"+pageSize+"页</a>");
sb.append("<a href='"+href+"?pageNo="+(pageNo+1)+"'>下页</a>");
sb.append("<a href='"+href+"?pageNo="+pageNum+"'>尾页</a>");
return sb.toString();
}
}
}
return sb.toString();
}这个方法用于前端显示页码。比如:总条数为:size,每页显示:pageSize,当前页码:pageNo,链接地址:href