S2SH通用版分页的实现----OAx
1.BaseDao和BaseImpl的设计
public PageBean getPageBean(int pageNum, HqlHelper hqlHelper) {
// 最终版
System.out.println("--------------> BaseDaoImpl.getPageBean( int pageNum, HqlHelper hqlHelper )");
int pageSize = Configuration.getPageSize();
List<Object> parameters = hqlHelper.getParameters();
// 查询本页的数据列表
Query listQuery = getSession().createQuery(hqlHelper.getQueryListHql());
if (parameters != null && parameters.size() > 0) { // 设置参数
for (int i = 0; i < parameters.size(); i++) {
listQuery.setParameter(i, parameters.get(i));
}
}
listQuery.setFirstResult((pageNum - 1) * pageSize);
listQuery.setMaxResults(pageSize);
List list = listQuery.list(); // 执行查询
// 查询总记录数
Query countQuery = getSession().createQuery(hqlHelper.getQueryCountHql());
if (parameters != null && parameters.size() > 0) { // 设置参数
for (int i = 0; i < parameters.size(); i++) {
countQuery.setParameter(i, parameters.get(i));
}
}
Long count = (Long) countQuery.uniqueResult(); // 执行查询
return new PageBean(pageNum, pageSize, list, count.intValue());
}
-------------------------------------------------------------------------------------------------------------------
@Deprecated
public PageBean getPageBean(int pageNum, String QueryLsitHQL,
Object[] parameters) {
System.out.println("------"+clazz.getName()+" getPageBean invalid--------------");
int pageSize=Configuration.getPageSize();
//查询本页的数据列表
Query listQuery=getSession().createQuery(QueryLsitHQL);
if(parameters!=null&¶meters.length>0){
for(int i=0;i<parameters.length;i++){
listQuery.setParameter(i, parameters[i]);
}
}
listQuery.setFirstResult((pageNum-1)*pageSize);
listQuery.setMaxResults(pageSize);
List list=listQuery.list();
//查询总记录数
Query countQuery=getSession().createQuery("select count(*) "+QueryLsitHQL);
if(parameters!=null&¶meters.length>0){
for(int i=0;i<parameters.length;i++){
countQuery.setParameter(i, parameters[i]);
}
}
Long count=(Long) countQuery.uniqueResult();
return new PageBean(pageNum, pageSize,list,count.intValue());
}
-------------------------------------------------------------------------------------------------------------------
获取页码pageNum,以及大小pageSize:
pageNum:通过属性驱动通过页面请求获得
pageSize:
public class Configuration {
private static int pageSize;
static{
//TODO 读取配置文件,并初始化所有配置
pageSize=10;
}
public static int getPageSize(){
return pageSize;
}
}
===================================================================================================================
2.hql封装过滤,分页的工具类
***
* 用于辅助拼接生成HQl的工具类
* @author Administrator
*
*/
public class HqlHelper {
private String fromClause; // From子句,必须
private String whereClause = ""; // Where子句,可选
private String orderByClause = ""; // OrderBy子句,可选
private List<Object> parameters = new ArrayList<Object>(); // 参数列表
/**
* 生成From子句,默认的别名为'o'
*
* @param clazz
*/
public HqlHelper(Class clazz) {
this.fromClause = "FROM " + clazz.getSimpleName() + " o";
}
/**
* 生成From子句,使用指定的别。'
*
* @param clazz
* @param alias
* 别名
*/
public HqlHelper(Class clazz, String alias) {
this.fromClause = "FROM " + clazz.getSimpleName() + " " + alias;
}
/**
* 拼接Where子句
*
* @param condition
* @param params
*/
public HqlHelper addCondition(String condition, Object... params) {
// 拼接
if (whereClause.length() == 0) {
whereClause = " WHERE " + condition;
} else {
whereClause += " AND " + condition;
}
// 保存参数
if (params != null && params.length > 0) {
for (Object obj : params) {
parameters.add(obj);
}
}
return this;
}
/**
* 如果第1个参数为true,则拼接Where子句
*
* @param append
* @param condition
* @param params
*/
public HqlHelper addCondition(boolean append, String condition, Object... params) {
if (append) {
addCondition(condition, params);
}
return this;
}
/**
* 拼接OrderBy子句
*
* @param propertyName
* 属性名
* @param isAsc
* true表示升序,false表示降序
*/
public HqlHelper addOrder(String propertyName, boolean isAsc) {
if (orderByClause.length() == 0) {
orderByClause = " ORDER BY " + propertyName + (isAsc ? " ASC" : " DESC");
} else {
orderByClause += ", " + propertyName + (isAsc ? " ASC" : " DESC");
}
return this;
}
/**
* 如果第1个参数为true,则拼接OrderBy子句
*
* @param append
* @param propertyName
* 属性名
* @param isAsc
* true表示升序,false表示降序
*/
public HqlHelper addOrder(boolean append, String propertyName, boolean isAsc) {
if (append) {
addOrder(propertyName, isAsc);
}
return this;
}
/**
* 获取生成的查询数据列表的HQL语句
*
* @return
*/
public String getQueryListHql() {
return fromClause + whereClause + orderByClause;
}
/**
* 获取生成的查询总记录数的HQL语句(没有OrderBy子句)
*
* @return
*/
public String getQueryCountHql() {
return "SELECT COUNT(*) " + fromClause + whereClause;
}
/**
* 获取参数列表,与HQL过滤条件中的'?'一一对应
*
* @return
*/
public List<Object> getParameters() {
return parameters;
}
/**
* 查询并准备分页信息(放到栈顶)
*
* @param pageNum
* @param service
* @return
*/
public HqlHelper buildPageBeanForStruts2(int pageNum, BaseDao<?> service) {
System.out.println("===> HqlHelper.buildPageBeanForStruts2()");
PageBean pageBean = service.getPageBean(pageNum, this);
ActionContext.getContext().getValueStack().push(pageBean);
return this;
}
}
==============================================================================================================================
3.使用示例
// 构建查询条件
new HqlHelper(Topic.class, "t")//
.addCondition("t.forum=?", forum)//
.addCondition(viewType == 1, "t.type=?", Topic.TYPE_BEST) // 1表示只看精华帖
.addOrder(orderBy == 1, "t.lastUpdateTime", asc) // 1 代表只按最后更新时间排序
.addOrder(orderBy == 2, "t.postTime", asc) // 2 代表只按主题发表时间排序
.addOrder(orderBy == 3, "t.replyCount", asc) // 3 代表只按回复数量排序
.addOrder(orderBy == 0, "(CASE t.type WHEN 2 THEN 2 ELSE 0 END)", false)//
.addOrder(orderBy == 0, "t.lastUpdateTime", false) // 0 代表默认排序(所有置顶帖在前面,并按最后更新时间降序排列)
.buildPageBeanForStruts2(pageNum, replyService);
================================================================================================================================
4.页面的显示
<!--分页信息-->
<s:form action="topicAction_show?id=%{id}">
</s:form>
<%@ include file="/WEB-INF/jsp/public/pageView.jspf"%>
==================================================================================================================================
5.页面公共代码
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<div id=PageSelectorBar>
<div id=PageSelectorMemo>
页次:${currentPage}/${pageCount}页
每页显示:${pageSize }条
总记录数:${recordCount }条
</div>
<div id=PageSelectorSelectorArea>
<a href="javascript: gotoPage(1)" title="首页" style="cursor: hand;">
<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/firstPage.png"/>
</a>
<s:iterator begin="%{beginPageIndex}" end="%{endPageIndex}" var="num">
<s:if test="currentPage == #num"><%-- 当前页 --%>
<span class="PageSelectorNum PageSelectorSelected">${num}</span>
</s:if>
<s:else><%-- 非当前页 --%>
<span class="PageSelectorNum" style="cursor: hand;" onClick="gotoPage(${num});">${num}</span>
</s:else>
</s:iterator>
<a href="javascript: gotoPage(${pageCount})" title="尾页" style="cursor: hand;">
<img src="${pageContext.request.contextPath}/style/blue/images/pageSelector/lastPage.png"/>
</a>
转到:
<select id="pn" onchange="gotoPage(this.value)">
<s:iterator begin="1" end="%{pageCount}" var="num">
<option value="${num}">${num}</option>
</s:iterator>
</select>
<script type="text/javascript">
// 回显页码
$("#pn").val(${currentPage});
</script>
</div>
</div>
<script type="text/javascript">
function gotoPage( pageNum ){
// window.location.href = "forumAction_show.action?id=${id}&pageNum=" + pageNum;
$(document.forms[0]).append("<input type='hidden' name='pageNum' value='" + pageNum + "'/>");
document.forms[0].submit(); // 提交表单
}
</script>