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 List<SevenOrders>splitPage(int startIndex, int pageSize) {
Session session = null;
List<SevenOrders> list= new ArrayList<SevenOrders>();
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<SevenOrders> 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 List<SevenOrders>getSoList() {
return soList;
}
public voidsetSoList(List<SevenOrders> 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配置文件
配置文件:
<?xmlversion="1.0" encoding="UTF-8" ?>
<!DOCTYPEstruts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default"namespace="/" extends="struts-default">
<actionname="ordersInfo" class="com.sp.action.OrderAction">
<resultname="success">index.jsp</result>
</action>
</package>
</struts>
5. 建立分页的JSP页面
示例代码:
<%@page language="java" import="java.util.*"pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPEHTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>全部订单信息</title>
<metahttp-equiv="pragma" content="no-cache">
<metahttp-equiv="cache-control" content="no-cache">
<metahttp-equiv="expires" content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description" content="This is my page">
</head>
<body>
<div style="margin: 0px auto;width: 750px;">
<tablewidth="80%" border="1"
style="border-collapse:collapse; text-align: center;"
cellpadding="1"cellspacing="1" align="center">
<tr>
<th>订单编号</th>
<th>收货人姓名</th>
<th>收货地址</th>
<th>订单创建日期</th>
</tr>
<s:iteratorvalue="soList">
<tr>
<td><s:propertyvalue="id" /></td>
<td><s:propertyvalue="name" /></td>
<td><s:propertyvalue="address" /></td>
<td><s:propertyvalue="createtime" /></td>
</tr>
</s:iterator>
</table>
<tablewidth="37%" style="text-align: center;" align="center">
<tr>
<!-- 当页面不在第一页时显示“首页”按钮 -->
<s:iftest="pageIndex!=1">
<td>
<button
οnclick="javascript:window.location.href='ordersInfo.action?pageIndex=1'">首页</button>
</td>
</s:if>
<td>
<button
οnclick="javascript:window.location.href='ordersInfo.action?pageIndex=<s:propertyvalue="prevPageIndex" />'">上一页</button>
</td>
<td>
<button
οnclick="javascript:window.location.href='ordersInfo.action?pageIndex=<s:propertyvalue="nextPageIndex" />'">下一页</button>
</td>
<!-- 当页面不在末页时显示“末页”按钮 -->
<s:iftest="pageIndex!=lastPageIndex">
<td>
<button
οnclick="javascript:window.location.href='ordersInfo.action?pageIndex=<s:propertyvalue="lastPageIndex" />'">末页</button>
</td>
</s:if>
</tr>
</table>
</div>
</body>
</html>
效果展示
1. 首页效果
2.末页效果
3.中间随机页效果