風一樣的男子 发表于 2013-2-7 23:54:03

最近写的一个 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]
查看完整版本: 最近写的一个 SSH 分页