`
風一樣的男子
  • 浏览: 62468 次
  • 性别: Icon_minigender_1
  • 来自: 粤东北山卡拉
社区版块
存档分类
最新评论

最近写的一个 SSH 分页

    博客分类:
  • 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 preAdd  method...");  
        }  
        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 onclick="doPage('1')"><a>首页</a></span>  
            <span onclick="doPage('pre')"><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 onclick="doPage('${p}')" <c:if test="${p==pagination.currentPage}">class='selected'</c:if>><a>${p}</a></span>  
                </c:forEach>  
                <span onclick="doPageLabel('p_2')"><a> »</a></span>  
                </label>  
                <c:forEach var="index" begin="2" end="${count}">  
                <label id="p_${index}" class="hideLabel">  
                    <span onclick="doPageLabel('p_${index-1}')"><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 onclick="doPage('${page}')" <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 onclick="doPageLabel('p_${index+1}')"><a> »</a></span>  
                    </c:if>  
                </label>  
                </c:forEach>  
            </c:when>  
            <c:otherwise>  
                <c:forEach items="${pagination.pages}" var="page">  
                    <span onclick="doPage('${page}')" <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 onclick="doPage('next')"><a>下一页 »</a></span>  
        <!-- <span onclick="doPage('${pagination.totalPage}')"><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 onclick="doPage(document.getElementById('to_p').value)">确定</span>-->  
    </div>  
  </s:if>  
<script type="text/javascript">  
/*** 翻页*/  
function doPage(page){  
    var form=document.forms[0];  
    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>







  • 大小: 6.6 KB
  • 大小: 6 KB
0
2
分享到:
评论
7 楼 風一樣的男子 2010-04-12  
autojoke 写道
autojoke 写道
能不能把doPageLabel()函数的代码贴出来,
把用到的javascript代码也贴出来
谢谢


还有css 代码


/**
 * doPageLabel 分页导航十页切换方法
 * @param {type} target 要显示的 label
 */
 function doPageLabel(target) {
 	$('pageDiv').getElements('label[id^=p_]').removeClass('cruLabel').addClass('hideLabel');
 	$(target).removeClass('hideLabel').addClass('cruLabel');
 }


.pageDiv{padding-top:3px;height:30px;white-space:nowrap;text-align: right;float:right;}
.pageDiv A {
	moz-border-radius:3px;
	webkit-border-radius:3px;
	background-color:#eeeeee;
	display:block;
	float:left;
	font-weight:bold;
	margin:0 3px 0 0;
	padding:4px 8px;
	color:#0066AA;
	text-decoration:none;
	cursor:pointer;
}
.pageDiv span{display:block;float:left;}
.pageDiv .selected a{background-color:#3582c4;color:#FFF;}
.pageDiv a:hover {background-color:#4d96ed;color:#FFF;}
.pageDiv .cruLabel {display:; margin-top: -0.5px;}
.pageDiv .hideLabel {display:none;  margin-top: -0.5px;}


6 楼 autojoke 2010-04-12  
autojoke 写道
能不能把doPageLabel()函数的代码贴出来,
把用到的javascript代码也贴出来
谢谢


还有css 代码
5 楼 autojoke 2010-04-12  
能不能把doPageLabel()函数的代码贴出来,
把用到的javascript代码也贴出来
谢谢
4 楼 風一樣的男子 2010-01-27  
vb2005xu 写道
我很疑惑,像分页这种纯属于小widget的东西,怎么就能扯上ssh这个大旗呢..

作者不仅仅在OOP理解上有问题,在系统架设思想上也存在问题


我承认
3 楼 vb2005xu 2010-01-27  
我很疑惑,像分页这种纯属于小widget的东西,怎么就能扯上ssh这个大旗呢..

作者不仅仅在OOP理解上有问题,在系统架设思想上也存在问题
2 楼 風一樣的男子 2010-01-26  
jsjmz 写道
建议你参考一下黎活明老师写的巴巴运动网中的分页,那才叫封装

有空看看吧
起初也没想着封装
只是想着要把分页类相对独立出来
1 楼 jsjmz 2010-01-26  
建议你参考一下黎活明老师写的巴巴运动网中的分页,那才叫封装
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    SSH通用分页组件 SSH分页

    SSH分页 分页 通用分页 struts2分页

    很好的一个SSH分页小例子

    这个例子中,"ssh分页例子_1"可能是一个包含源代码的文件,包含了上述各个部分的实现,如Action类、Service接口和实现、DAO接口和实现以及对应的JSP页面。通过对这些文件的分析和学习,你可以更好地理解SSH框架如何...

    SSH 通用分页插件

    因此,分页功能成为了一个必要的优化手段。 SSH分页插件的核心功能是将数据库查询结果按照一定的页码和每页记录数进行切割,使得用户可以逐页浏览,提高用户体验并减轻服务器负担。这个插件通常会集成到SSH框架中,...

    强大ssh分页实现

    好强大的ssh分页,封装的很好,适合初学者研究下,可以更快帮助初学者掌握分页机制,学起来不是很容易,但是当你学会了就豁然开朗,其他的分页直接可以藐视了,哈。。。我就是这样学过来的 有相关教程:...

    struts hibernate spring 分页ssh分页

    综上所述,SSH分页是Java企业级开发中的一个重要技术,它涉及到了Struts的控制层、Hibernate的数据访问层和Spring的整合及服务层,是提升应用性能和用户体验的关键手段之一。通过熟练掌握SSH分页,开发者可以更高效...

    ssh分页经典代码

    2. **创建分页类**: 设计一个基础的分页类,包含当前页数、每页条数、总页数、总记录数等属性。这个类可以作为所有分页操作的基类,提供计算总页数和是否为最后一页等通用方法。 3. **编写分页服务**: 在Service层...

    SSH分页_完整例子

    SSH(Struts + Spring + Hibernate)是一个经典的Java Web开发框架,它将MVC设计模式、依赖注入和持久层管理结合在一起,提供了强大的企业级应用开发能力。在这个"SSH分页_完整例子"中,我们将深入探讨如何在SSH框架...

    ssh 分页 控件 (分页插件)

    总的来说,"ssh 分页 控件 (分页插件)"是一个便捷的工具,能够帮助SSH框架的开发者在JSP页面中轻松实现数据分页功能,提升项目开发效率和用户体验。通过对分页插件的配置和使用,我们可以更专注于业务逻辑,而不用...

    SSH+Mysql无刷新分页实例

    无刷新分页技术是现代网页设计中的一个重要特性,它允许用户在不重新加载整个页面的情况下浏览页面的不同部分。在SSH框架中实现这一功能,通常会用到AJAX(Asynchronous JavaScript and XML)技术。AJAX可以向服务器...

    SSH分页完整实例

    在Struts中,我们可以创建一个Action类来处理分页请求。这个Action类会接收前端传来的参数,如当前页数和每页显示的数量,然后调用业务层进行处理。 Spring作为应用上下文和依赖注入框架,负责管理对象的生命周期和...

    SSH分页技术详解与实例

    SSH分页技术是Java Web开发中一种常见的数据处理方法,主要应用于大数据量的展示场景,如用户在浏览商品列表或论坛帖子时,通过分页来避免一次性加载所有数据导致的性能问题和用户体验下降。SSH指的是Spring、Struts...

    SSH实现分页实例

    SSH(Struts2 + Spring + Hibernate)是一个经典的Java Web开发框架,它整合了三大主流开源框架,用于构建高效、可维护性高的企业级应用程序。在这个"SSH实现分页实例"中,我们将深入探讨如何在SSH框架下实现数据的...

    SSH分页查询方法

    "SSH分页查询方法"是指在使用Struts2、Hibernate和Spring三大Java开发框架集成开发时实现的分页功能。 首先,Struts2是一个MVC(Model-View-Controller)框架,它负责处理用户请求并将其转发到相应的控制器,进而...

    SSH分页组件

    开发者可以创建一个包含当前页数和每页记录数属性的类,并在Action中处理这些参数以计算数据库查询的开始位置和结束位置。此外,Struts的Result类型也可以配合自定义拦截器来实现动态分页链接的生成。 2. **Spring...

    SSH分页(很实用)

    SSH分页技术是Java开发中一个非常实用的功能,尤其在处理大数据量的Web应用时,它能够有效地提高用户体验,避免一次性加载过多数据导致的性能问题。SSH是指Spring、Struts和Hibernate这三大开源框架的组合,它们在...

    ssh分页完整实例数据库mysql

    总结起来,这个压缩包提供的SSH分页实例数据库MySQL连接,旨在帮助初学者掌握SSH框架在实际项目中的应用,尤其是如何利用SSH实现数据的CRUD操作和分页功能,对于提升Java Web开发技能具有很大价值。通过实践这个实例...

    用ssh实现的一个简单的分页

    这个名为"用ssh实现的一个简单的分页"的项目,旨在为初学者提供一个关于如何在SSH框架下实现分页功能的示例。分页在大型数据集的展示中至关重要,它能够提高用户体验,避免一次性加载过多数据导致的性能问题。 首先...

    ssh分页显示实例代码

    这个一个关于String+Spring+Hibernate框架,可以分页显示的实例代码.

    ssh 分页组件,含使用示例

    在给定的文件中,`Page.java`可能是一个代表分页信息的实体类,包含如当前页码、每页记录数、总记录数、总页数等属性,以及相应的getter和setter方法。这样的类有助于封装分页参数,并在前后端之间传递。 `...

    SSH分页源代码

    总的来说,这个"SSH分页源代码"实例是一个学习如何在Java Web环境中整合SSH框架,并利用它们处理分页问题的好资源。通过分析和理解源代码,开发者可以加深对SSH框架的理解,提升在实际项目中的应用能力。

Global site tag (gtag.js) - Google Analytics