最近写的一个 SSH 分页
公司抛弃很久以前的代码框架(简单使用Hibernate+Struts1,Hibernate 只是用来做 saveOrUpdate、remove、get,分页查询还是用SQL的),新项目代码SSH2框架让我搞,将SSH2 分页设计记录一下。因为分页要考虑 Struts2 及 Flex 里使用,所以页码也直接在分页类里算了。然后对应 jsp、flex 表现做一个分页导航(Flex 不是我做,不怎么会呢)。DAO 中分页方法:
/** * get appCodes by Pagination * * @param appCode * @param pagination */ @SuppressWarnings("unchecked") public Pagination getAppCodes(final AppCode appCode, final Pagination pagination) { HibernateCallback callback = new HibernateCallback() { @Override public Object doInHibernate(Session session) throws HibernateException, SQLException { int totalRow = 0; List<AppCode> objList = new ArrayList<AppCode>(); try { Criteria criteria = session.createCriteria(AppCode.class); // 只查状态有效的 criteria.add(Restrictions.eq("status", CConstants.VALID)); totalRow = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult(); criteria.setProjection(null); pagination.setTotalRow(totalRow); objList = criteria.addOrder(Order.asc("category")).addOrder(Order.asc("codeId")).setFirstResult(pagination.getStartRow()).setMaxResults(pagination.getPageSize()).list(); pagination.setObjList(objList); } catch (Exception e) { log.error("uh oh, getappCodes by Pagination failed..."); e.printStackTrace(); } return pagination; } }; return (Pagination) getHibernateTemplate().execute(callback); }
Service 对应方法:
/** * get appCodes by Pagination * @param appCode * @param pagination */ public Pagination getAppCodes(AppCode appCode, Pagination pagination) { return appCodeDao.getAppCodes(appCode, pagination); } /* 因为同事说 Flex 那边封装多个 Map 参数的方法给他调用,而且方法签名都一样,所以多了以下方法 */ /** * get appCodes by Pagination for Flex * @param map * @param pagination */ public Pagination query(Map<String, String> map, Pagination pagination) { if (map.isEmpty()) { return getAppCodes(new AppCode(), pagination); } AppCode appCode = new AppCode(); if (StringUtils.isNotEmpty(map.get("id"))) { appCode.setId(map.get("id")); } if (StringUtils.isNotEmpty(map.get("codeId"))) { appCode.setCodeId(map.get("codeId")); } if (StringUtils.isNotEmpty(map.get("codeName"))) { appCode.setCodeName(map.get("codeName")); } if (StringUtils.isNotEmpty(map.get("category"))) { appCode.setCategory(map.get("category")); } if (StringUtils.isNotEmpty(map.get("categoryDesc"))) { appCode.setCategoryDesc(map.get("categoryDesc")); } if (StringUtils.isNotEmpty(map.get("description"))) { appCode.setDescription(map.get("description")); } if (StringUtils.isNotEmpty(map.get("status"))) { appCode.setStatus(map.get("status")); } if (StringUtils.isNotEmpty(map.get("createDate"))) { appCode.setCreateDate(DateTypeConverter.convertFromString(map.get("createDate"))); } return getAppCodes(appCode, pagination); }
Struts2 Action 代码:
@SuppressWarnings("serial")public class AppCodeAction extends BaseAction{ @Resource(name="appCodeService") private AppCodeService appCodeService; private AppCode appCode; public AppCode getAppCode() { return appCode; } public void setAppCode(AppCode appCode) { this.appCode = appCode; } public String query() { if (LOG.isDebugEnabled()) { LOG.debug("Entering query method..."); } if (this.pagination == null) { this.pagination = new Pagination(CConstants.PAGE_SIZE); } if (this.appCode == null) { this.appCode = new AppCode(); } try{ this.pagination = appCodeService.getAppCodes(appCode, pagination); }catch (Exception e) { addActionError(getText("search.exception", new String []{getText("AppCode")})); return ERROR; } return SUCCESS; }}
BaseAction 代码
import com.opensymphony.xwork2.ActionSupport;import com.tjsoft.util.Pagination;@SuppressWarnings("serial")public class BaseAction extends ActionSupport { /** 分页类 */ protected Pagination pagination; public Pagination getPagination() { return pagination; } public void setPagination(Pagination pagination) { this.pagination = pagination; } public String preAdd(){ if (LOG.isDebugEnabled()) { LOG.debug("entering preAddmethod..."); } return INPUT; } }
分页导航代码:
<%@ page contentType="text/html; charset=UTF-8"%><%@ include file="/pages/taglibs.jsp" %><s:if test="#request.pagination.totalPage>0"> <div class="pageDiv" id="pageDiv"> <!-- 总记录数 <span>${pagination.totalRow}</span>--> <!-- 当前页/总页数 <span>${pagination.currentPage}/${pagination.totalPage}</span>--> <!-- 当前页不是第一页时生成首页和上一页 --> <c:if test="${pagination.currentPage>1}"> <span ><a>首页</a></span> <span ><a>« 上一页</a></span> </c:if> <!-- 计算要分几次显示页码,每次显示10页 --> <c:choose> <c:when test="${pagination.totalPage %10 > 0}"> <c:set var="count" value="${pagination.totalPage/pagination.pageSize+1}" /> </c:when> <c:otherwise> <c:set var="count" value="${pagination.totalPage/pagination.pageSize}" /> </c:otherwise> </c:choose> <!-- count > 1 --> <c:choose> <c:when test="${count - 1 > 1}"> <!-- 1~10页先生成 --> <label id="p_1" class="cruLabel"> <c:forEach var="p" begin="1" end="10"> <span<c:if test="${p==pagination.currentPage}">class='selected'</c:if>><a>${p}</a></span> </c:forEach> <span ><a> »</a></span> </label> <c:forEach var="index" begin="2" end="${count}"> <label id="p_${index}" class="hideLabel"> <span ><a>« </a></span> <c:forEach items="${pagination.pages}" var="page" begin="${(index-1)*pagination.pageSize}" end="${index*pagination.pageSize-1}"> <c:if test="${page>10}"> <span<c:if test="${page==pagination.currentPage}">class='selected'</c:if>><a>${page}</a></span> </c:if> </c:forEach> <c:if test="${count - index > 1}"> <span ><a> »</a></span> </c:if> </label> </c:forEach> </c:when> <c:otherwise> <c:forEach items="${pagination.pages}" var="page"> <span<c:if test="${page==pagination.currentPage}">class='selected'</c:if>><a>${page}</a></span> </c:forEach> </c:otherwise> </c:choose> <!-- 当前页不是最后页时生成下一页 末页 --> <c:if test="${pagination.currentPage!=pagination.totalPage}"> <span ><a>下一页 »</a></span> <!-- <span ><a>末页</a></span>--> </c:if> <!--<span>转到</span> <select id="to_p"> <c:forEach items="${pagination.pages}" var="tp"> <option value="${tp}" <c:if test="${tp eq pagination.currentPage}"> selected="selected" </c:if> >${tp}</option> </c:forEach> </select> <span>页</span> <span >确定</span>--> </div> </s:if><script type="text/javascript">/*** 翻页*/function doPage(page){ var form=document.forms; if('${pagination.currentPage}'===page){ return; }else if("next"===page){ if('${pagination.currentPage}'=='${pagination.totalPage}')return; form.action='<s:url />?pagination.currentPage='+(new Number('${pagination.currentPage}')+1); }else if("pre"===page){ if('${pagination.currentPage}'==1)return; form.action='<s:url />?pagination.currentPage='+(new Number('${pagination.currentPage}')-1); }else { form.action='<s:url />?pagination.currentPage='+page; } form.submit();}</script>
http://dl.iteye.com/upload/attachment/198986/515edc88-c097-34dc-a48d-32b1ece95b9e.jpg
http://dl.iteye.com/upload/attachment/198984/0c7e6325-776b-34ff-913d-eb2a2f2c92e9.jpg
页:
[1]