Struts2的分页处理

本文介绍了如何使用Struts2和Hibernate进行网站开发时的分页处理。遵循MVC架构,通过创建数据表tb_classes,定义分页类Pa,并在Action类中设置分页参数,结合service层的classService实现数据库查询。文章详细阐述了分页的实现步骤。
摘要由CSDN通过智能技术生成

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是关于获取这个内容的。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值