Struts 2 – 分页技术详解
使用Struts 2进行分页更为简单方便,配合Action能降低代码间的耦合度,提高代码重用率。
先来看一下今天要做分页的项目结构:
1. 配置Hibernate和Struts 2开发环境
2. 创建OrderDaoImpl类并编写Dao层实现类的代码,为分页提供数据来源
示例代码:
packagecom.sp.daoimpl;
importjava.util.ArrayList;
importjava.util.List;
importorg.hibernate.Query;
importorg.hibernate.Session;
importcom.sp.entity.SevenOrders;
importcom.sp.sf.HibernateSessionFactory;
/**
* 订单DAO类
*
* 项目名称:StrutsSplitPage 类名称:OrderDaoImpl类描述: 创建人:SteveJrong创建时间:2015-10-26
* 下午5:27:31 修改人:SteveJrong修改时间:2015-10-26 下午5:27:31 修改备注:
*
* @version 1.0 Alpha
*
*/
publicclass OrderDaoImpl {
/**
* 获取总记录数的方法
*
* @return
*/
public Integer getAllCounts() {
Session session = null;
Query query = null;
Integer sum = 0;
try {
session =HibernateSessionFactory.getSession();
String hql ="select count(*) from SevenOrders";
query =session.createQuery(hql);
sum = newLong((Long) query.iterate().next()).intValue();
} catch (Exception e) {
// TODO: handleexception
e.printStackTrace();
System.err.println(e.getMessage());
} finally {
session.close();
}
return sum;
}
/**
* 分页的方法
*
* @param pageIndex
* @param pageSize
* @return
*/
@SuppressWarnings("unchecked")
public ListsplitPage(int startIndex, int pageSize) {
Session session = null;
List list= new ArrayList();
try {
session =HibernateSessionFactory.getSession();
list =session.createCriteria(SevenOrders.class)
.setFirstResult(startIndex).setMaxResults(pageSize).list();
} catch (Exception e) {
// TODO: handleexception
e.printStackTrace();
System.err.println(e.getMessage());
} finally {
session.close();
}
return list;
}
}
3. 创建继承于ActionSupport类的OrderAction类用于跳转到此Action上处理业务
示例代码:
packagecom.sp.action;
importjava.util.List;
importcom.opensymphony.xwork2.Action;
importcom.opensymphony.xwork2.ActionSupport;
importcom.sp.daoimpl.OrderDaoImpl;
importcom.sp.entity.SevenOrders;
/**
* 订单相关的Action
*
* 项目名称:StrutsSplitPage 类名称:OrderAction类描述: 创建人:SteveJrong创建时间:2015-10-26
* 下午5:27:19 修改人:SteveJrong修改时间:2015-10-26 下午5:27:19 修改备注:
*
* @version 1.0 Alpha
*
*/
publicclass OrderAction extends ActionSupport {
/**
*
*/
private static final longserialVersionUID = 1222749185637056315L;
/**
* 当前页面的索引
*/
private Integer pageIndex = 1;
/**
* 总页数
*/
private Integer totalPageSize;
/**
* 上一页的页码
*/
private Integer prevPageIndex;
/**
* 下一页的页码
*/
private Integer nextPageIndex;
/**
* 末页的页码
*/
private Integer lastPageIndex;
/**
* 每页要显示的信息条数
*/
private Integer pageSize = 2;
/**
* 订单的集合属性
*/
private List soList;
public Integer getPageIndex() {
return pageIndex;
}
public void setPageIndex(IntegerpageIndex) {
this.pageIndex = pageIndex;
}
public Integer getTotalPageSize() {
return totalPageSize;
}
public void setTotalPageSize(IntegertotalPageSize) {
this.totalPageSize =totalPageSize;
}
public Integer getPrevPageIndex() {
return prevPageIndex;
}
public void setPrevPageIndex(IntegerprevPageIndex) {
this.prevPageIndex =prevPageIndex;
}
public Integer getNextPageIndex() {
return nextPageIndex;
}
public void setNextPageIndex(IntegernextPageIndex) {
this.nextPageIndex =nextPageIndex;
}
public Integer getLastPageIndex() {
return lastPageIndex;
}
public void setLastPageIndex(IntegerlastPageIndex) {
this.lastPageIndex =lastPageIndex;
}
public Integer getPageSize() {
return pageSize;
}
public void setPageSize(IntegerpageSize) {
this.pageSize = pageSize;
}
public ListgetSoList() {
return soList;
}
public voidsetSoList(List soList) {
this.soList = soList;
}
/**
* Action默认的执行方法
*/
@Override
public String execute() throwsException {
// TODO Auto-generated methodstub
OrderDaoImpl daoImpl = newOrderDaoImpl();
// 获取总记录数
int totalItemSize =daoImpl.getAllCounts();
// 将总记录数和总页数进行取余,判断要分出多少页来才能足够显示所有的信息
if (totalItemSize % pageSize== 0) {
// 能除尽说明正好可以显示完全部数据
totalPageSize =totalItemSize / pageSize;
} else {
// 除不尽说明还需要加单独的一页才够显示全部数据
totalPageSize =totalItemSize / pageSize + 1;
}
/**
* 针对页面进行各种逻辑判断
*/
// 当pageIndex即当前页码为第1页时,设置“上一页”按钮的页码也为1,设置“下一页”按钮的页码为当前页码(pageIndex)加1
if (pageIndex <= 1) {
prevPageIndex = 1;
nextPageIndex =pageIndex + 1;
// 当pageIndex即当前页码在第2页到最大页数之间时,设置“上一页”按钮的页码为当前页码减1,设置“下一页”按钮的页码为当前页码加1
} else if (pageIndex > 1&& pageIndex < totalPageSize) {
prevPageIndex =pageIndex - 1;
nextPageIndex = pageIndex+ 1;
// 当pageIndex即当前页码已经达到了最大页数时,设置“上一页”按钮的页码为当前页码减1(因为要上翻一页就需要当前页码减1),设置“下一页”按钮的页码为当前页码
} else if (pageIndex >=totalPageSize) {
prevPageIndex =pageIndex - 1;
nextPageIndex =pageIndex;
}
// 设置“末页”按钮的页码为总页数,即最大页数
lastPageIndex =totalPageSize;
// 每次要分页时要从数据库表的第几行数据开始的固定算法(pageIndex - 1) *
// pageSize,表示当前页码减去1页后和每页要显示的条数的乘积即每次要从第几个开始显示
soList =daoImpl.splitPage((pageIndex - 1) * pageSize, pageSize);
return Action.SUCCESS;
}
}
4. 配置struts.xml配置文件
配置文件:
index.jsp
5. 建立分页的JSP页面
示例代码:
<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
全部订单信息
订单编号
收货人姓名
收货地址
订单创建日期
'">上一页
'">下一页
'">末页
1. 首页效果
2.末页效果
3.中间随机页效果