首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

ssh调整开发中的分页方案(转)

2013-10-22 
ssh整合开发中的分页方案(转)? 分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP

ssh整合开发中的分页方案(转)

? 分页显示一直是web开发中一大烦琐的难题,传统的网页设计只在一个JSP或者ASP页面中书写所有关于数据库操作的代码,那样做分页可能简单一点,但当把网站分层开发后,分页就比较困难了,下面是我做Spring+Hibernate+Struts2项目时设计的分页代码,与大家分享交流。
1、DAO层接口的设计,在MemberDao接口中定义了如下两个方法:

ssh调整开发中的分页方案(转)public?interface?MemberDao{
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????//省略了其他的代码
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?分页查询
ssh调整开发中的分页方案(转)?????*?@param?hql?查询的条件
ssh调整开发中的分页方案(转)?????*?@param?offset?开始记录
ssh调整开发中的分页方案(转)?????*?@param?length?一次查询几条记录
ssh调整开发中的分页方案(转)?????*?@return
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?List?queryForPage(final?String?hql,final?int?offset,final?int?length);
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?查询所有记录数
ssh调整开发中的分页方案(转)?????*?@param?hql?查询的条件
ssh调整开发中的分页方案(转)?????*?@return?总记录数
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?int?getAllRowCount(String?hql);
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)}

?

2、DAO层实现类MemberDaoImpl对上面两个方法的实现如下:

ssh调整开发中的分页方案(转)public?class?MemberDaoImpl?extends?HibernateDaoSupport?implements?MemberDao?{
ssh调整开发中的分页方案(转)???????//省略了其他的代码????
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?分页查询
ssh调整开发中的分页方案(转)?????*?@param?hql?查询的条件
ssh调整开发中的分页方案(转)?????*?@param?offset?开始记录
ssh调整开发中的分页方案(转)?????*?@param?length?一次查询几条记录
ssh调整开发中的分页方案(转)?????*?@return
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?List?queryForPage(final?String?hql,final?int?offset,final?int?length){
ssh调整开发中的分页方案(转)????????List?list?=?getHibernateTemplate().executeFind(new?HibernateCallback(){
ssh调整开发中的分页方案(转)????????????public?Object?doInHibernate(Session?session)?throws?HibernateException,SQLException{
ssh调整开发中的分页方案(转)????????????????Query?query?=?session.createQuery(hql);
ssh调整开发中的分页方案(转)????????????????query.setFirstResult(offset);
ssh调整开发中的分页方案(转)????????????????query.setMaxResults(length);
ssh调整开发中的分页方案(转)????????????????List?list?=?query.list();
ssh调整开发中的分页方案(转)????????????????return?list;
ssh调整开发中的分页方案(转)????????????}
ssh调整开发中的分页方案(转)????????});
ssh调整开发中的分页方案(转)????????return?list;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?查询所有记录数
ssh调整开发中的分页方案(转)?????*?@return?总记录数
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?int?getAllRowCount(String?hql){
ssh调整开发中的分页方案(转)????????return?getHibernateTemplate().find(hql).size();
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)}

??????? 细心的读者会发现,这个类继承了HibernateDaoSupport类,HibernateDaoSupport是Spring提供的对Hibernate支持的类,getHibernateTemplate().executeFind(new HibernateCallback(){....})方法中的参数,我们使用了接口回调,在其参数内,我们能像原生的Hibernate一样调用query.setFirstResult(offset)和query.setMaxResults(length)来实现分页查询功能。

3、下面我们来新建一个保存分页信息的类PageBean,具体代码如下:

ssh调整开发中的分页方案(转)public?class?PageBean?{
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????private?List?list;????????//要返回的某一页的记录列表
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????private?int?allRow;?????????//总记录数
ssh调整开发中的分页方案(转)????private?int?totalPage;????????//总页数
ssh调整开发中的分页方案(转)????private?int?currentPage;????//当前页
ssh调整开发中的分页方案(转)????private?int?pageSize;????????//每页记录数
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????private?boolean?isFirstPage;????//是否为第一页
ssh调整开发中的分页方案(转)????private?boolean?isLastPage;????????//是否为最后一页
ssh调整开发中的分页方案(转)????private?boolean?hasPreviousPage;????//是否有前一页
ssh调整开发中的分页方案(转)????private?boolean?hasNextPage;????????//是否有下一页
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????public?List?getList()?{
ssh调整开发中的分页方案(转)????????return?list;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?void?setList(List?list)?{
ssh调整开发中的分页方案(转)????????this.list?=?list;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?int?getAllRow()?{
ssh调整开发中的分页方案(转)????????return?allRow;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?void?setAllRow(int?allRow)?{
ssh调整开发中的分页方案(转)????????this.allRow?=?allRow;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?int?getTotalPage()?{
ssh调整开发中的分页方案(转)????????return?totalPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?void?setTotalPage(int?totalPage)?{
ssh调整开发中的分页方案(转)????????this.totalPage?=?totalPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?int?getCurrentPage()?{
ssh调整开发中的分页方案(转)????????return?currentPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?void?setCurrentPage(int?currentPage)?{
ssh调整开发中的分页方案(转)????????this.currentPage?=?currentPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?int?getPageSize()?{
ssh调整开发中的分页方案(转)????????return?pageSize;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?void?setPageSize(int?pageSize)?{
ssh调整开发中的分页方案(转)????????this.pageSize?=?pageSize;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?初始化分页信息
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?void?init(){
ssh调整开发中的分页方案(转)????????this.isFirstPage?=?isFirstPage();
ssh调整开发中的分页方案(转)????????this.isLastPage?=?isLastPage();
ssh调整开发中的分页方案(转)????????this.hasPreviousPage?=?isHasPreviousPage();
ssh调整开发中的分页方案(转)????????this.hasNextPage?=?isHasNextPage();
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?以下判断页的信息,只需getter方法(is方法)即可
ssh调整开发中的分页方案(转)?????*?@return
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????public?boolean?isFirstPage()?{
ssh调整开发中的分页方案(转)????????return?currentPage?==?1;????//?如是当前页是第1页
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?boolean?isLastPage()?{
ssh调整开发中的分页方案(转)????????return?currentPage?==?totalPage;????//如果当前页是最后一页
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?boolean?isHasPreviousPage()?{
ssh调整开发中的分页方案(转)????????return?currentPage?!=?1;????????//只要当前页不是第1页
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????public?boolean?isHasNextPage()?{
ssh调整开发中的分页方案(转)????????return?currentPage?!=?totalPage;????//只要当前页不是最后1页
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?计算总页数,静态方法,供外部直接通过类名调用
ssh调整开发中的分页方案(转)?????*?@param?pageSize?每页记录数
ssh调整开发中的分页方案(转)?????*?@param?allRow?总记录数
ssh调整开发中的分页方案(转)?????*?@return?总页数
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?static?int?countTotalPage(final?int?pageSize,final?int?allRow){
ssh调整开发中的分页方案(转)????????int?totalPage?=?allRow?%?pageSize?==?0???allRow/pageSize?:?allRow/pageSize+1;
ssh调整开发中的分页方案(转)????????return?totalPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?计算当前页开始记录
ssh调整开发中的分页方案(转)?????*?@param?pageSize?每页记录数
ssh调整开发中的分页方案(转)?????*?@param?currentPage?当前第几页
ssh调整开发中的分页方案(转)?????*?@return?当前页开始记录号
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?static?int?countOffset(final?int?pageSize,final?int?currentPage){
ssh调整开发中的分页方案(转)????????final?int?offset?=?pageSize*(currentPage-1);
ssh调整开发中的分页方案(转)????????return?offset;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?计算当前页,若为0或者请求的URL中没有"?page=",则用1代替
ssh调整开发中的分页方案(转)?????*?@param?page?传入的参数(可能为空,即0,则返回1)
ssh调整开发中的分页方案(转)?????*?@return?当前页
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?static?int?countCurrentPage(int?page){
ssh调整开发中的分页方案(转)????????final?int?curPage?=?(page==0?1:page);
ssh调整开发中的分页方案(转)????????return?curPage;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)}


4、Service层接口的设计:

ssh调整开发中的分页方案(转)public?interface?MemberService?{
ssh调整开发中的分页方案(转)????//省略其他的代码
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?分页查询
ssh调整开发中的分页方案(转)?????*?@param?currentPage?当前第几页
ssh调整开发中的分页方案(转)?????*?@param?pageSize?每页大小
ssh调整开发中的分页方案(转)?????*?@return?封闭了分页信息(包括记录集list)的Bean
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?PageBean?queryForPage(int?pageSize,int?currentPage);
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)}


5、Service层实现类的部分内码如下:

ssh调整开发中的分页方案(转)public?class?MemberServiceImpl?implements?MemberService?{
ssh调整开发中的分页方案(转)??
ssh调整开发中的分页方案(转)??//通过applicationContext.xml配置文件注入MemberDao的值
ssh调整开发中的分页方案(转)????private?MemberDao?memberDao;
ssh调整开发中的分页方案(转)????public?void?setMemberDao(MemberDao?memberDao)?{
ssh调整开发中的分页方案(转)????????this.memberDao?=?memberDao;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????/**
ssh调整开发中的分页方案(转)?????*?分页查询
ssh调整开发中的分页方案(转)?????*?@param?currentPage?当前第几页
ssh调整开发中的分页方案(转)?????*?@param?pageSize?每页大小
ssh调整开发中的分页方案(转)?????*?@return?封闭了分页信息(包括记录集list)的Bean
ssh调整开发中的分页方案(转)?????*/
ssh调整开发中的分页方案(转)????public?PageBean?queryForPage(int?pageSize,int?page){
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????????final?String?hql?=?"from?Member";????????//查询语句
ssh调整开发中的分页方案(转)????????int?allRow?=?memberDao.getAllRowCount(hql);????//总记录数
ssh调整开发中的分页方案(转)????????int?totalPage?=?PageBean.countTotalPage(pageSize,?allRow);????//总页数
ssh调整开发中的分页方案(转)????????final?int?offset?=?PageBean.countOffset(pageSize,?page);????//当前页开始记录
ssh调整开发中的分页方案(转)????????final?int?length?=?pageSize;????//每页记录数
ssh调整开发中的分页方案(转)????????final?int?currentPage?=?PageBean.countCurrentPage(page);
ssh调整开发中的分页方案(转)????????List<Member>?list?=?memberDao.queryForPage(hql,offset,?length);????????//"一页"的记录
ssh调整开发中的分页方案(转)????????
ssh调整开发中的分页方案(转)????????//把分页信息保存到Bean中
ssh调整开发中的分页方案(转)????????PageBean?pageBean?=?new?PageBean();
ssh调整开发中的分页方案(转)????????pageBean.setPageSize(pageSize);????
ssh调整开发中的分页方案(转)????????pageBean.setCurrentPage(currentPage);
ssh调整开发中的分页方案(转)????????pageBean.setAllRow(allRow);
ssh调整开发中的分页方案(转)????????pageBean.setTotalPage(totalPage);
ssh调整开发中的分页方案(转)????????pageBean.setList(list);
ssh调整开发中的分页方案(转)????????pageBean.init();
ssh调整开发中的分页方案(转)????????return?pageBean;
ssh调整开发中的分页方案(转)????}


6、在Struts2中调用queryForPageMemberService层的queryForPage()方法即可return一个包含分页信息、符合条件的结果集list, 代码如下:

ssh调整开发中的分页方案(转)public?class?ListMember?extends?ActionSupport{
ssh调整开发中的分页方案(转)????//通过applicationContext.xml配置文件注入memberService的值
ssh调整开发中的分页方案(转)????private?MemberService?memberService;
ssh调整开发中的分页方案(转)????public?void?setMemberService(MemberService?memberService)?{
ssh调整开发中的分页方案(转)????????this.memberService?=?memberService;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????private?int?page;????//第几页
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????private?PageBean?pageBean;????//包含分布信息的bean
ssh调整开发中的分页方案(转)????
ssh调整开发中的分页方案(转)????public?int?getPage()?{
ssh调整开发中的分页方案(转)????????return?page;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????public?void?setPage(int?page)?{????????//若URL中无此参数,会默认为第1页
ssh调整开发中的分页方案(转)????????this.page?=?page;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????public?PageBean?getPageBean()?{
ssh调整开发中的分页方案(转)????????return?pageBean;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????public?void?setPageBean(PageBean?pageBean)?{
ssh调整开发中的分页方案(转)????????this.pageBean?=?pageBean;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)
ssh调整开发中的分页方案(转)????@Override
ssh调整开发中的分页方案(转)????public?String?execute()?throws?Exception?{
ssh调整开发中的分页方案(转)????????//分页的pageBean,参数pageSize表示每页显示记录数,page为当前页
ssh调整开发中的分页方案(转)????????this.pageBean?=?memberService.queryForPage(2,?page);
ssh调整开发中的分页方案(转)????????return?SUCCESS;
ssh调整开发中的分页方案(转)????}
ssh调整开发中的分页方案(转)}


7、最后在listMember.jsp页面中,用到了Struts2标签:

ssh调整开发中的分页方案(转)<s:iterator?value="pageBean.list">
ssh调整开发中的分页方案(转)????????????<s:property?value="title"/>
ssh调整开发中的分页方案(转)????????????<a?href="getArticle.action?id=<s:property?value="id"/>">modify</a>
ssh调整开发中的分页方案(转)????????????<a?href="deleteArticle.action?id=<s:property?value="id"/>"?onclick="return?askDel()"/>delete</a><br/>
ssh调整开发中的分页方案(转)????????</s:iterator>
ssh调整开发中的分页方案(转)????????共<s:property?value="pageBean.allRow"/>?条记录
ssh调整开发中的分页方案(转)????????共<s:property?value="pageBean.totalPage"/>?页
ssh调整开发中的分页方案(转)????????当前第<s:property?value="pageBean.currentPage"/>页<br/>
ssh调整开发中的分页方案(转)????????
ssh调整开发中的分页方案(转)????????<s:if?test="%{pageBean.currentPage?==?1}">
ssh调整开发中的分页方案(转)????????????第一页?上一页
ssh调整开发中的分页方案(转)????????</s:if>
ssh调整开发中的分页方案(转)????????<s:else>
ssh调整开发中的分页方案(转)????????????<a?href="listMyArticle.action?page=1">第一页</a>
ssh调整开发中的分页方案(转)????????????<a?href="listMyArticle.action?page=<s:property?value="%{pageBean.currentPage-1}"/>">上一页</a>
ssh调整开发中的分页方案(转)????????</s:else>
ssh调整开发中的分页方案(转)????????<s:if?test="%{pageBean.currentPage?!=?pageBean.totalPage}">
ssh调整开发中的分页方案(转)????????????<a?href="listMyArticle.action?page=<s:property?value="%{pageBean.currentPage+1}"/>">下一页</a>
ssh调整开发中的分页方案(转)????????????<a?href="listMyArticle.action?page=<s:property?value="pageBean.totalPage"/>">最后一页</a>
ssh调整开发中的分页方案(转)????????</s:if>
ssh调整开发中的分页方案(转)????????<s:else>
ssh调整开发中的分页方案(转)????????????下一页?最后一页
ssh调整开发中的分页方案(转)????????</s:else>?到这里,Hibernate+Spring+Struts2整合开发中的分页问题就已经解决了,在我上述过程中,省略了许多Hibernate,Spring,Struts2的配置,那不是本文的重点,大家可以参考有关的书与资料,由于篇幅有限,在此就不一一列举。在以后的文章中,我也会详细地跟大家讲述SSH整合开发。

热点排行