LZ最近在学Struts2 + Hibernate来写网站,但是其中有一些东西是需要新学的。其中就包括分页,首先分页这个东西是比较有意思,在Struts2来写的过程中,我们可以严格按照MVC的结构和service层来完成这个工作。接下来我就来介绍这个是如何完成的。
首先我在我的mysql数据库中新建了一个数据表tb_classes,具体的表格内容如下所示
mysql> desc tb_classes;
+-----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+----------------+
| ClassID | int(11) | NO | PRI | NULL | auto_increment |
| ClassName | varchar(255) | YES | | NULL | |
+-----------+--------------+------+-----+---------+----------------+
有两个字段,分别是ClassID和ClassName。
然后我定义了一个Pa的类,用来专门存储相关的分页信息
<span style="font-size:18px;">public class Pa
{
private int everyPage; //每一页有多少条记录
private int totalCount; //总的记录数
private int totalPage; //总的页数
private int currentPage; //当前的页
private int beginIndex; //第一页
private boolean hasPrePage; //判断是否有前一页
private boolean hasNextPage; //判断是否有下一页
public Pa(int everyPage, int totalCount, int totalPage, int currentPage,
int beginIndex, boolean hasPrePage, boolean hasNextPage)
{
//super();
this.everyPage = everyPage;
this.totalCount = totalCount;
this.totalPage = totalPage;
this.currentPage = currentPage;
this.beginIndex = beginIndex;
this.hasPrePage = hasPrePage;
this.hasNextPage = hasNextPage;
}
public Pa(){}
public int getEveryPage()
{
return everyPage;
}
public void setEveryPage(int everyPage)
{
this.everyPage = everyPage;
}
public int getTotalCount()
{
return totalCount;
}
public void setTotalCount(int totalCount)
{
this.totalCount = totalCount;
}
public int getTotalPage()
{
return totalPage;
}
public void setTotalPage(int totalPage)
{
this.totalPage = totalPage;
}
public int getCurrentPage()
{
return currentPage;
}
public void setCurrentPage(int currentPage)
{
this.currentPage = currentPage;
}
public int getBeginIndex()
{
return beginIndex;
}
public void setBeginIndex(int beginIndex)
{
this.beginIndex = beginIndex;
}
public boolean isHasPrePage()
{
return hasPrePage;
}
public void setHasPrePage(boolean hasPrePage)
{
this.hasPrePage = hasPrePage;
}
public boolean isHasNextPage()
{
return hasNextPage;
}
public void setHasNextPage(boolean hasNextPage)
{
this.hasNextPage = hasNextPage;
}
}</span>
上面这个类中就是定义了这个分页需要的一些信息,关于总的页面数,总的记录数,每一页的记录数等等之类的信息。然后就是关于一个action,也就是当我点击某一个显示页面信息的时候,会有触发这个action,然后就是执行相应的操作。这个action的代码如下:
<span style="font-size:18px;">public class QueryByClassesAction extends ActionSupport
{
private int currentPage;
private ClassService classService = new ClassService();
public int getCurrentPage()
{
return currentPage;
}
public void setCurrentPage(int currentPage)
{
this.currentPage = currentPage;
}
public String Queryclasses()
{
//Classes classes = new Classes();
Pa pa = new Pa();
pa.setEveryPage(3); //设置每一页的记录数是3条
pa.setCurrentPage(currentPage); //这里默认设置为0,也就是第一页
PaRe pageresult = classService.queryByPage(pa);
List<Classes> classes = pageresult.getList();
pa = pageresult.getPa();
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("classes", classes);
session.setAttribute("pa", pa);
return SUCCESS;
}
}</span>
首先在这个action类里定义了一个Pa,用来保存一些关于分页信息,比如每一页的记录数,这里我是每一页保存每一页的记录,然后当前页面我用currentPage来设置,默认为0。然后就是用来执行去找这个,去找相应的每一页中的内容,这里定义了一个classService用来表示service层的东西,classService的代码如下:
public class ClassService
{
private classDAO classDAO = new classDAO();
public PaRe queryByPage(Pa pa)
{
pa = PaUt.createPage(pa.getEveryPage(),
classDAO.findClassCount(),pa.getCurrentPage());
List<Classes> list = classDAO.findClassByPage(pa);
PaRe result = new PaRe(pa,list);
return result;
}
}
然而这个代码中又绕了一个圈,中间又生成了一个PaUt的类,这个类是用来将我想表示的取那一页的内容完整地表示好。
public class PaUt
{
public static Pa createPage(int everyPage,int totalCount,int currentPage)
{
everyPage = getEveryPage(everyPage);
currentPage = getCurrentPage(currentPage); //当前这页
int totalPage = getTotalPage(everyPage, totalCount); //总页数
int beginIndex = getBeginIndex(everyPage, currentPage); //得到开始的那个页面的起始
boolean hasPrePage = getHasPrePage(currentPage);
boolean hasNextPage = getHasNextPage(totalPage, currentPage);
return new Pa(everyPage, totalCount, totalPage, currentPage,
beginIndex, hasPrePage, hasNextPage);
}
public static int getEveryPage(int everyPage)
{
return everyPage == 0 ? 3 : everyPage;
}
public static int getCurrentPage(int currentPage)
{ //这里就是默认如果是没有输入,那么就是默认为首页,也就是第0页
return currentPage == 0 ? 1 : currentPage;
}
public static int getTotalPage(int everyPage,int totalCount)
{ //得到总的页数
int totalPage = 0;
if(totalCount != 0 && totalCount % everyPage == 0)
{
totalPage = totalCount / everyPage;
}
else //分别考虑两种情况,就是能被整除和不能被整除的情况
{
totalPage = totalCount / everyPage + 1;
}
return totalPage; //按照每一页everyPage的记录数,可以分成的页数
}
public static int getBeginIndex(int everyPage,int currentPage)
{
return (currentPage - 1) * everyPage; //得到具体的现在想要得到的那一页的一些个起始信息条
}
public static boolean getHasPrePage(int currentPage)
{
return currentPage == 1 ? false : true; //首页
}
public static boolean getHasNextPage(int totalPage, int currentPage)
{ //判断是否还有下一页
return currentPage == totalPage || totalPage == 0 ? false : true;
}
}
这里讲刚才我没有完成的那个Pa的内容全部填充完全。然后就是关于将此页面的内容全部提交给后台的DAO层,也就是真正与数据库打交道的底层语言。
public class classDAO
{
public List<Classes> findClassByPage(Pa pa)
{
<span style="white-space:pre"> </span> Session session = HibernateSessionFactory.getSession();
<span style="white-space:pre"> </span>Query query = session.createQuery("from Classes");
<span style="white-space:pre"> </span>query.setMaxResults(pa.getEveryPage());
<span style="white-space:pre"> </span>query.setFirstResult(pa.getBeginIndex());
<span style="white-space:pre"> </span>List list = query.list();<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>System.out.println(list.size());
<span style="white-space:pre"> </span>HibernateSessionFactory.closeSession();
<span style="white-space:pre"> </span>return list;
}
}
这个DAO层的内容就是直接根据刚才PaUt所提交的显示出来而已。然后就是提供给前端页面接收,返回这个list,并且刚才上面的那个PaUt是关于获取这个内容的。