参考网址1Q?/font>http://www.aygfsteel.com/BlogJava522935502/
参考网址2Q?/font>http://blog.csdn.net/qq522935502/
资料部分借鉴Q?a href="http://www.aygfsteel.com/rongxh7/">http://www.aygfsteel.com/rongxh7/
上节课,我们完成了一?font face="Times New Roman">SSH整合?/font>CRUD操作案例Qƈ且完善了其国际化以及(qing)校验{内容,q节课,我们l箋加以完善Q我们知道,当我们查询数据库的内容过多的时候,昄在页面上的内容就比较冗长Q所以分늚实现显的十分有必要了。分功能的实现是必不可的Q掌握一CU分|术在在实际开发前是有必要的,前两天浏览博客的时候看C一个程序员的博文写的一个分功能的实现非常好,在这里,分nl大家?/font>
在讲解分功能实C前,大家必须对分|一定的了解Q知道分늚几个要素Q总记录数Q每|C数Q共几页Q当前页{?/p>
在上个例子的基础上我们开始完善我们的E序?/p>
1.首先我们先新建立一个接?font face="Times New Roman">MemberDao.java,把所需要用到的Ҏ(gu)列出来:(x)
package cn.zbvc.dao;
import java.util.List;
import cn.zbvc.bean.User;
public interface MemberDao {
/**
* 分页查询
* @param hql 查询条g
* @param offset 开始记?br />
* @param length 一ơ查询几条记?br />
* @return 查询的记录集?br />
*/
public List<User> queryForPage(final String hql,final int offset,final int length);
/**
* 查询所有的记录?br />
* @param hql 查询条g
* @return 总记录数
*/
public int getAllRowCount(String hql);
}
2.然后我们创徏其实现类Q?font face="Times New Roman">MemberDaoImpl.java
package cn.zbvc.dao.impl;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.zbvc.bean.User;
import cn.zbvc.dao.MemberDao;
public class MemberDaoImpl extends HibernateDaoSupport implements MemberDao {
/**
* 查询所有的记录?br />
* @param hql 查询条g
* @return 总记录数
*/
public int getAllRowCount(String hql) {
return this.getHibernateTemplate().find(hql).size();
}
/**
* 分页查询
* @param hql 查询条g
* @param offset 开始记?br />
* @param length 一ơ查询几条记?br />
* @return 查询的记录集?br />
*/
@SuppressWarnings("unchecked")
public List<User> queryForPage(final String hql, final int offset, final int length) {
Session session = this.getSession();
Query q = session.createQuery(hql);
q.setFirstResult(offset);
q.setMaxResults(length);
List<User> list = q.list();
System.out.println(list.size());
session.close();
return list;
}
大家可以看到Q我们一共定义了两个Ҏ(gu)Q第一个方式是获取数据库表的总记录数Q第二个Ҏ(gu)是获取我们想要获取的某一늚数据集合Q传递的三个参数分别是:(x)查询条g、开始的记录、结束的记录?/p>
l心的读者会(x)发现Q这个类l承?font face="Times New Roman">HibernateDaoSupportc,HibernateDaoSupport?/font>Spring提供的对Hibernate支持的类Q在其参数内Q我们能像原生的Hibernate一栯?/font>query.setFirstResult(offset)?/font>query.setMaxResults(length)来实现分|询功能?/font>
3.然后我们需要徏立一个获取分信息的pageBean.java:
package cn.zbvc.util;
import java.util.List;
import cn.zbvc.bean.User;
public class PageBean {
private List<User> list; //要返回的某一늚记录列表
private int allRow; //总记录数
private int totalPage; //总页?/span>
private int currentPage; //当前?/span>
private int pageSize; //每页的记录数
private boolean isFirstPage; //是否为当前第一?/span>
private boolean isLastPage; //是否为最后一?/span>
private boolean hasPreviousPage; //是否有前一?/span>
private boolean hasNextPage; //是否有下一?/span>
Set and getҎ(gu)
PageBean中的具体Ҏ(gu)Q?br />
/**
* 初始化分信?br />
*/
public void init(){
this.isFirstPage = isFirstPage;
this.isLastPage = isLastPage;
this.hasPreviousPage = hasPreviousPage;
this.hasNextPage = hasNextPage;
}
/**
* 计算总页?nbsp; 静态方?br />
* @param pageSize 每页的记录数
* @param allRow 总记录数
* @return 总页?br />
*/
public static int countTatalPage(final int pageSize,final int allRow){
int toalPage = allRow % pageSize == 0 ? allRow/pageSize : allRow/pageSize + 1;
return toalPage;
}
/**
* 计算当前开始的记录
* @param pageSize 每页记录?br />
* @param currentPage 当前W几?br />
* @return 当前开始记录号
*/
public static int countOffset(final int pageSize,final int currentPage){
final int offset = pageSize * (currentPage - 1);
return offset;
}
/**
* 计算当前,若ؓ(f)0或者请求的URL中没?#8220;?page = ”则用1代替
* @param page 传入的参敎ͼ可能为空Q即0 则返?Q?br />
* @return
*/
public static int countCurrentPage(int page){
final int curpage = (page == 0 ? 1 : page);
return curpage;
} }
4.业务逻辑层的实现Q我们现在就只操?font face="Times New Roman">UserQ现在我们在UserService中定义一个方法:(x)
/**
* 分页查询
* @param pageSize 每页昄多少记录
* @param currentPage 当前?br />
* @return 装了分信息的bean
*/
public PageBean queryForPage(int pageSize,int page);
5.使用UserServiceImpl实现q个具体Ҏ(gu)Q?/font>
/**
* 分页查询
* @param pageSize 每页昄多少记录
* @param currentPage 当前?br />
* @return 装了分信息的bean
*/
public PageBean queryForPage(int pageSize, int page) {
final String hql = "from User user order by user.id"; //查询语句
int allRow = memberDao.getAllRowCount(hql); //总记录数
int totalPage = PageBean.countTatalPage(pageSize, allRow); //总页?/span>
final int offset = PageBean.countOffset(pageSize, page); //当前开始记?/span>
final int length = pageSize; // 每页记录?/span>
final int currentPage = PageBean.countCurrentPage(page); // 当前?/span>
List list = memberDao.queryForPage(hql, offset, length); //
//把分信息保存到Bean当中
PageBean pageBean = new PageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
return pageBean;
}
6.然后我们Z不媄(jing)响上一个例子,我们新创Z?font face="Times New Roman">ListUserAction2.java:
package cn.zbvc.action.user;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
import cn.zbvc.bean.User;
import cn.zbvc.service.UserService;
import cn.zbvc.util.PageBean;
public class ListUserAction2 extends ActionSupport {
private UserService service;//通过Spring创徏业务层对?nbsp; 使用setҎ(gu)依赖注入
private PageBean pageBean; //装了分信息和数据内容的pageBean
private List<User> listUser;//用于储存pageBean当中被封装的User信息
private int page = 1; //表示从网中q回的当前页的?nbsp; 默认? 表示默认昄W一内?/span>
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<User> getListUser() {
return listUser;
}
public void setListUser(List<User> listUser) {
this.listUser = listUser;
}
public PageBean getPageBean() {
return pageBean;
}
public void setPageBean(PageBean pageBean) {
this.pageBean = pageBean;
}
public void setService(UserService service) {
this.service = service;
}
public String execute()throws Exception{
this.pageBean = service.queryForPage(5, page);//获取装了分信息和数据的pageBean
this.listUser = this.pageBean.getList(); //获取数据
return SUCCESS;
}
}
7.配置applicationContext.xml?/font>struts.xml的相关信息,q里省略了?/font>
8.?font face="Times New Roman">listUser2.jsp面中添加分内容:(x)
<s:iterator value="pageBean">
<tr>
<td colspan="6" align="center" bgcolor="#5BA8DE">
?/span><s:property value="allRow"/>条记?nbsp;
?/span><s:property value="totalPage"/>?nbsp;
当前W?/span><s:property value="currentPage"/>?/span><br>
<s:if test="%{currentPage == 1}">
W一?nbsp; 上一?br />
</s:if>
<!-- currentPage为当前页 -->
<s:else>
<a href="listUser2.action?page=1">W一?/span></a>
<a href="listUser2.action?page=<s:property value="%{currentPage-1}"/>">上一?/span></a>
</s:else>
<s:if test="%{currentPage != totalPage}">
<a href="listUser2.action?page=<s:property value="%{currentPage+1}"/>">下一?/span></a>
<a href="listUser2.action?page=<s:property value="totalPage"/>">最后一?/span></a>
</s:if>
<s:else>
下一?nbsp; 最后一?br />
</s:else>
</td>
</tr>
</s:iterator>
9.查看效果Q?/p>

10.思考ȝ
关于分页功能实现Q应该是有有很多U解x法,我介l的q种解决Ҏ(gu)是ؓ(f)了给大家一?/p>
范例Q让大家明白分页功能实现的原理,其中Q大部分的内容借鉴了之前提到的|址。接下来的时_(d)我会(x)l箋学习(fn)关于分页功能的其它实现方式,然后分nl大Ӟ另外Q还?x)l的整理SSH的整合?/font>