S2SH通用版分页的实现----OAx

本文介绍了一种基于Struts2、Spring和Hibernate(S2SH)框架的通用分页实现方法,通过自定义BaseDao层进行数据查询与分页逻辑封装,配合HQL辅助工具类简化了分页查询的复杂度。

                                                                                              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>
     


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值