`

Struts分页的一个实现

阅读更多
在Web应用程序里,分页总让我们开发人员感到很头疼,倒不是因为技术上有多么困难,只是本来和业务没有太多关系的这么一个问题,你却得花不少功夫来处理。要是稍不留神,时不时出点问题就更郁闷了。我现在做的一个项目也到了该处理分页的时候了,感觉以前处理得都不好,所以这次有所改变,基本目标是在现有(未分页)的代码基础上,尽量少做修改,并且同样的代码可以应用于不同模块的分页。以下就是我用的方法:

首先,考虑分页绝大多数发生在列表时,组合查询时也需要用到。在我的项目里,列表的Action一般名字为ListXXXActioin,例如客户列表是ListClientsAction等等。在未分页前,ListXXXAction里会把所有的对象取出,通过request.setAttribute()放在request里,然后将请求转向到列表的jsp(例如listClients.jsp)显示出来(你可能会说不要在Action里放业务逻辑,但现在这不是我们考虑的重点)。而分页后,我们只取用户请求页对应的那些对象。为了最大限度的达到代码重用,我做了以下工作:

1、新建一个Pager类,该类有beginPage、endPage、currentPage、pageSize和total等int类型的属性,分别代表开始页、结束页、当前页、每页记录数和总记录数,它主要是让jsp页面显示页导航使用的。请注意currentPage属性是从0开始的。

2、新建一个AbstractListActioin类,并让所有ListXXXAction都继承它。在这个类里覆盖execute()方法,可以在这里判断权限等等,并在判断权限通过后执行一个abstract的act()方法,这个act()由ListXXXAction来实现。

3、在AbstractListAction里增加getPage()方法,用来从request得到用户请求的页码(若未请求则认为是第0页):

protected int getPage(HttpServletRequest request) {
    String p = request.getParameter("p");
    if (p == null)
        return 0;
    else
        try {
            return Integer.parseInt(p);
        } catch (NumberFormatException e) {
            return 0;
        }
}



4、在AbstractListAction里增加makePager()方法,用来向request里增加一个Pager类的实例,供jsp页面显示页导航:

protected Pager makePager(HttpServletRequest request, int total) {
    Pager pager=new Pager();
    pager.setTotal(total);
    pager.setPageSize(Config.getInstance().getPageSize());
    pager.setBeginPage(0);
    pager.setEndPage(((pager.getTotal()) - 1) / pager.getPageSize() + 1);
    pager.setCurrentPage(getPage(request));
    return pager;
}



注意在我的项目里,每页记录数是写在配置文件里的,如果你没有配置文件,上面第4行setPageSize()的参数直接填数字即可,例如pager.setPageSize(10);

5、这样,所有的ListXXXAction都可以使用getPage()得到请求的页码,并且能够方便的通过makePager()构造需要放在request里的pager对象了。现在要在从数据库取数据的代码上再做一些修改,即只取所需要的那一部分数据。由于我的项目中使用了Hibernate,所以这个修改也不是很困难。未分页前,在我的ListClientsAction里是通过构造一个Query来得到全部Client的,现在,只要在构造这个Query后再加两句(setMaxResults和setFirstResult)即可:



Query query =  ;//构造query的语句 
int total =  ;//得到总记录数 
Pager pager = makePager(request, total);//调用父类中的方法构造一个Pager实例
query.setMaxResults(pager.getPageSize());//设置每页记录数
query.setFirstResult(pager.getCurrentPage() * pager.getPageSize()); //设置开始位置
request.setAttribute(Pager.class.getName(), pager);//把pager放在request里
request.setAttribute(Client.class.getName(), query.list());

目前存在一个问题,就是在上面代码的第二句中,应该是获得总记录数,但我暂时没有特别好的办法不得到全部对象而直接得到记录数,只能很恐怖的用“int total = query.list().size();”,汗……

6、最后,我写了一个页导航的jsp页面pager.jsp,供各个显示列表的jsp来include,代码如下:



<%Pager pager=(Pager)request.getAttribute(Pager.class.getName());%>
<table width="90%" border="0" align="center" cellpadding="2" cellspacing="1" bgcolor="#CCCCCC">
<tr>
    <td bgcolor="#EEEEEE" align="right">
    <bean:message key="prompt.pager" arg0="<%=String.valueOf(pager.getTotal())%>"/>
        [
<%
for(int i=pager.getBeginPage();i<pager.getEndPage();i++){
    if(i==pager.getCurrentPage()){
    %>
        <%=(i+1)%>
    <%}else{
        String qs=request.getQueryString()==null?"":request.getQueryString();
        String op = "p="+pager.getCurrentPage();//Original page parameter expression
        String np = "p="+i;//New expression
        if(qs.indexOf(op)==-1)
            qs=np+"&"+qs;
        qs=qs.replaceAll(op,np);
        %>
        <a href="<%="?"+qs%>"><%=(i+1)%></a>
    <%}%>
    <%if(i<pager.getEndPage()-1){%>
    &nbsp;
    <%}%>
<%}%>
]

</td></tr>
</table>
我觉得有必要解释一下,在上面的代码中,关于每一页对应的url是这样处理。request.getQueryString()中可能包含“q=2”这样的页码请求,也可能不包含即缺省请求第0页,所以统一用replaceAll()方法将其去掉,然后将对应的页码请求串(如“q=3”)加在qs的前面。这样做的好处是,每个模块都可以使用这个页导航,并且不会丢失url中的其他参数(例如今后加入排序功能后,url中可能包含“direction=desc”这样的参数)。

05-4-14 Update:我发现在Tomcat4.1和Websphere5.0里,request.getRequestURL()方法得到的地址是不一样的,所以考虑到兼容性,每个页码的链接都使用相对本页的链接。

在列表jsp(listClients.jsp)中,很简单的这样include它(之所以要放在<logic:notEmpty>里,是希望在没有记录可显示的时候就不显示页导航了):

<logic:notEmpty name="<%=Client.class.getName()%>">
    <%@include file="/pager.jsp"%>
</logic:notEmpty>

经过上面几步的处理,我的客户列表已经可以实现分页了,效果见下图。如果在另外一个模块中也需要分页,比如部门列表时,只需要1、修改ListDeptsAction继承AbstractListAction,2、在ListDeptsAction里增加setMaxResults()和setFirstResults()方法,3、在listDepts.jsp中适当的位置include页导航,就可以了,改动是相当小的。



最后,如果希望组合查询的结果也能够分页,必须指定组合查询表单的method属性为“GET”,这样查询要求会被记录在url中,分页导航从而能够正常的工作(每次换页都将查询要求和请求的页码提交)。

楼主的实现方法感觉不是很好
设计时可以考虑以下原则:
1。分页不要和数据库打交道,不负责数据的获取,应该独立于业务
2。分页实际上可以看作只是产生一些查询条件
3。简单的分页模型
最简单在页面上只写<pagination:page />,这是设计前的代码模型定义
4。界面多样化
可以通过实现多个子类来实现不同的界面

分享到:
评论

相关推荐

    STRUTS2+HIBERNATE详细的分页实现代码详细的分页实现代码

    下面是一个简化的示例代码片段,展示了如何在Struts2和Hibernate中实现分页功能: ```java // PageTool类定义 public class PageTool { private int pageNum; // 当前页码 private int pageSize; // 每页显示记录...

    struts分页算法的实现

    Struts分页算法是Java Web开发中常用的一种技术,它主要用于处理大数据集合的展示,提高网页的加载速度和用户体验。在Struts框架下,我们通常会结合Servlet、JSP和数据库查询来实现分页功能。以下将详细讲解Struts...

    struts2.0实现的数据分页实现及实现分页步骤

    Struts2.0 是一个流行的Java Web开发框架,它提供了一种组织和控制MVC(Model-View-Controller)架构的方式,使得开发者可以更高效地构建动态Web应用程序。数据分页是Web应用中常见的需求,特别是在处理大量数据时,...

    使用struts实现分页

    Struts 是一个经典的Java ...通过以上这些步骤和知识点,我们可以构建一个完整的基于Struts的分页系统,提供高效、用户友好的数据浏览体验。在实际开发中,还可以根据项目需求进行定制和扩展,如添加搜索、排序等功能。

    Struts2实现分页查询

    用Struts2+mysql实现的简单信息录入,分页查询

    jsp +struts 分页经典

    本项目名为“jsp +struts 分页经典”,显然是一个利用这两种技术实现的分页展示数据的案例。下面我们将深入探讨JSP和Struts框架,以及它们在分页、查询和数据操作中的应用。 首先,JSP是Java平台上的动态网页技术,...

    Struts2 分页实现

    Struts2是一个强大的MVC(模型-视图-控制器)框架,被广泛应用于Java Web开发。在处理大量数据时,为了提高用户体验,分页显示是非常必要的。本实践项目旨在展示如何在Struts2中实现分页功能,适用于初学者学习和...

    一个高效简洁的Struts分页方法

    下面将详细解释如何在一个高效简洁的方式下实现Struts分页。 首先,我们需要理解分页的基本原理。分页通常是通过在数据库中限制查询结果的数量,每次只加载一定数量的数据(称为一页),然后根据用户的交互(如点击...

    Struts2自定义分页标签

    4. **创建分页标签库**:Struts2支持自定义标签,你可以创建一个`.tld`文件来定义分页标签。标签库应该包含开始、结束、上一页、下一页等标签,以便在视图层中方便地使用。 5. **实现标签处理类**:对应的Java类...

    Struts+Hibernate实现分页

    首先,Struts是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,它负责处理用户请求并控制应用程序的流程。而Hibernate则是一个强大的对象关系映射(ORM)工具,用于简化数据库操作,将Java对象与...

    struts1.2实现分页

    二、Struts1.2分页实现步骤 1. **配置Action**:首先,我们需要创建一个处理分页请求的Action类,该类需要接收并处理用户请求的分页参数,如当前页数和每页大小。通常,这些参数会通过HTTP请求传递。 2. **数据...

    使用 struts2实现分页

    在Java Web开发中,Struts2是一个非常流行的MVC框架,它提供了强大的功能来构建动态、数据驱动的Web应用程序。本篇文章将详细讲解如何利用Struts2和JSP实现前端的分页功能。 分页是Web应用中常见的需求,尤其在处理...

    Hibernate+Struts分页的实现

    "Hibernate+Struts分页的实现"这个话题关注的就是如何在大型数据集的场景下,结合这两种技术来有效地实施分页策略。 首先,让我们了解一下Struts框架。Struts是一个基于MVC(Model-View-Controller)设计模式的Java...

    用struts实现的分页

    通过以上步骤,你就可以在Struts框架下实现一个基本的分页功能。但请注意,实际开发中,为了代码的可复用性和维护性,通常会将分页逻辑封装到独立的组件或服务中,以减少代码的耦合度。此外,随着技术的发展,现代的...

    Struts分页.Struts分页.

    Struts框架是Java Web开发中的一个关键组件,它主要用于构建MVC(模型-视图-控制器)架构的应用程序。在大型数据展示时,分页功能是必不可少的,它能帮助用户更有效地浏览和管理大量的信息。Struts框架提供了一种...

    Struts + Hibernate 分页实现

    Struts和Hibernate是Java Web开发中的两个重要框架,它们分别负责表现层和...通过以上步骤和注意事项,我们可以实现一个高效且用户体验良好的分页功能。在实际项目中,这样的实现有助于提升应用的易用性和可维护性。

    struts分页,数据查询资料

    这个“struts分页,数据查询资料”可能包含了如何在Struts框架下实现高效、灵活的分页查询方法。 首先,Struts框架的核心是Action类,它是业务逻辑和视图之间的桥梁。在实现分页功能时,我们需要创建一个Action类,...

    struts2实现分页

    在分页实现中,我们主要利用 `&lt;s:bean&gt;` 创建 `org.apache.struts2.util.Counter` 类型的 bean 来控制循环范围。 #### 三、`&lt;s:bean&gt;` 标签的基本用法 `&lt;s:bean&gt;` 标签的基本语法如下: ```xml ... ``` - *...

    java web中的struts分页组件

    这个例子展示了如何在Struts框架中实现一个简单的分页功能。实际项目中,可能还需要考虑其他因素,比如缓存、排序、搜索等。同时,为了提高用户体验,可以加入动态加载(Ajax分页)或者无限滚动等高级特性。在处理大...

    struts1.2实现的简单分页代码

    请注意,尽管这是一个基础的分页实现,但在实际项目中,我们还需要考虑一些高级特性,如缓存、动态调整每页大小、处理非法页码请求等。此外,随着技术的发展,现代Web框架如Spring Boot和前端框架Vue、React等提供了...

Global site tag (gtag.js) - Google Analytics