实现新闻信息分页显示功能
项目结构图
使用到jar包
struts-2.5.10 、 hibernate-release-5.2.2.Final 、spring-framework-4.3.8.RELEASE-dist
如何实现三个框架的整合我会在另外一个文章上面写,这篇文章主要是写一个分页显示新闻这个功能怎么实现的。那么就接下来走进正题吧。
首先,我们需要根据页数去显示信息,那么我就在CategoryAction中写一个需要根据页数取数据的方法。
下面所有代码都在原有的代码的基础上添加的
CategoryAction.java
记得在struts.xml中配置action
private int currPage;//需要提供的页数
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public String findallbypage()
{ //思路1.必须在先在categoryService中调用findbyPage(currPage)才能获取数据
/*思路2.那么我们应该拿些什么数据呢?
每一页应该显示些什么?
1 当前页数
2 每页最多显示的纪录
3 总的纪录数
4 总的页数
5 总的页数
*/
//思路3.得到数据怎么存放,那么就要新建一个PageBean 封装数据了。
//思路5.在categoryService的接口中添加这个方法在categoryService实现类中实现这个方法把数据进行封装。
PageBean<Category> pageBean= categoryService.findbyPage(currPage);
//将pageBean存放在值栈中
ActionContext.getContext().getValueStack().push(pageBean);
return "page"; //返回一个字符串对应result。
}
PageBean.java
import java.util.List;
/*
*类的说明:分页封装类
* */
public class PageBean<T> {
private int currPage;//当前页数
private int pageSize;//每页最多显示的纪录
private int totalCount;//总的纪录数
private int totalPage;//总的页数
//思路4.因为需要分页显示不同对象使用到泛型
private List<T> list;//每页显示的数据,T的值是所需数据的对象
/*
此处省略各个属性的get() set()方法必须写
*/
CategoryService.java
public interface CategoryService {
/*
..
..
*/
public PageBean<Category> findbyPage(int currPage);
}
CategoryServiceImpl .java //实现类
public class CategoryServiceImpl implements CategoryService {
/*
..
..
*/
//分页查询类别的方法
public PageBean<Category> findbyPage(int currPage) {
PageBean<Category> pageBean =new PageBean<Category>();
//数据封装
//封装当前的页数CurrPage
pageBean.setCurrPage(currPage);
//封装每页最多显示的纪录数 设置一个Pagesize的值
int pageSize = 2;
pageBean.setPageSize(pageSize);
//封装总的记录数TotalCount
int totalCount =categoryDao.findCount();//findCount()方法在DAO接口上新建
pageBean.setTotalCount(totalCount);
//封装总的页数totalPage
double tc=totalCount;
Double totalPage=Math.ceil(tc/pageSize);
pageBean.setTotalPage(totalPage.intValue());
//封装每页显示的数据list
int begin=(currPage-1)*pageSize;
//在DAO接口上新建finbypage(begin,pageSize)@begin:从第几页开始
List<Category> list=categoryDao.finbypage(begin,pageSize);
pageBean.setList(list);
return pageBean;
}
CategoryDao .java//Dao接口
public interface CategoryDao {
/*
..
..
*/
public List<Category> finbypage(int begin, int pageSize);
public int findCount();
}
CategoryDaoImpl .java /DAO实现类
public class CategoryDaoImpl extends HibernateDaoSupport implements CategoryDao{
/*
..
*/
/*
* 分页查询部门
* */
public List<Category> finbypage(int begin, int pageSize) {
DetachedCriteria criteria =DetachedCriteria.forClass(Category.class);
//重点是调用findByCriteria(?,?,?);这个方法取得数据。
List<Category> list=(List<Category>) this.getHibernateTemplate().findByCriteria(criteria, begin, pageSize);
return list;
}
public int findCount() {
String hql="select count(*) from Category";
List<Long> list=(List<Long>) this.getHibernateTemplate().find(hql);
if(list.size()>0)
{
return list.get(0).intValue();
}
return 0;
}
JSP页面显示代码:直接调用的是PageBean封装类中的属性。currPage pageSize totalCount totalPage list
<table border="1">
<s:iterator value="list" var="c">
<tr>
<td><s:property value ="#c.categoryName"/>
</td>
</tr>
</s:iterator>
</table>
<table>
<tr>
<td>
<span>第<s:property value="currPage"/>/<s:property value="totalPage"/>页</span>
<span>总的记录数:<s:property value="totalCount"/> 每页显示:<s:property value="pageSize"/></span>
</td>
</tr>
<tr>
<td>
<span>
<s:if test="currPage!=1">
<a href="/Newproject/findallbypageAction.action?currPage=1">[首页]</a>
<a href="/Newproject/findallbypageAction.action?currPage=<s:property value="currPage-1"/>">[上一页]</a>
</s:if>
<s:if test="currPage!=totalPage">
<a href="/Newproject/findallbypageAction.action?currPage=<s:property value="currPage+1"/>">[下一页]</a>
<a href="/Newproject/findallbypageAction.action?currPage=<s:property value="totalPage"/>">[尾页]</a>
</s:if>
</span>
</td>
</tr>
</table>
项目运行的结果
总结一下
初学者来说认真的了解一下上面PageBean封装的想法是非常重要的。而且非常有用,认真思考一下如果需要取多个数据放在同一个action中那么我们是不是可以使用Bean类去封装数据呢。
分页显示的这个PageBean不只可以用在查询新闻类型上,而且还可以使用在新闻查询数据的上面,代码量因为一个泛型就可以不用再写另外的Bean类去显示相似功能。