kelefa  
大千世界中,唯一缺乏的就是人类的注意力。
日历
<2009年2月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
1234567
统计
  • 随笔 - 11
  • 文章 - 0
  • 评论 - 28
  • 引用 - 0

导航

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
 在某个项目中,经过几个同事的修改, 最终得到这个支持分页的action基类, 使用非常简单:

1. 在写action类时把派生ActionSupport类改成派生这个PaginationSupportAction类
2. 实现这两个抽象方法, 其中doExecute方法就是你原来的execute方法的代码, queryCount()返回符合条件的记录数

    
/**
     * just like interface Action : public String execute()
     * 
     * 
@throws Exception
     * 
@return String the same as execute() interface
     
*/

    
protected abstract String doExecute()
            
throws Exception;

    
/**
     * query the item count
     * 
     * 
@return int
     
*/

    
protected abstract int queryCount()
            
throws Exception;
3. 在jsp显示记录的下面添加:
<%@ include file="../common/pagination.jsp"%>

下面是这两个文件的源代码:

PaginationSupportAction.java:
package com.kelefa.common.action;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.ActionSupport;

/**
 * <pre>
 *     分页action的基类,需要分页的action可继承这个类,并实现以下2个抽象方法
 *         protected abstract String doExecute() throws Exception ;
 *         protected abstract int queryCount();
 * </pre>
 * 
 * <p>
 * Copyright: Copyright (c) 2005
 * </p>
 * 
 * 
@author 杨杰荣
 * 
@version 1.0
 
*/

public abstract class PaginationSupportAction
        
extends ActionSupport
{
    
private static final Logger log = Logger
            .getLogger( PaginationSupportAction.
class );

    
protected String pageUrl;

    
protected int pageList = 15// 从action.xml传递过来的每页记录数

    
protected int pageNo = 1;

    
protected int itemCount;

    
protected int pageCount;

    
protected String preUrl;

    
protected String nextUrl;

    
protected String firstUrl;

    
protected String lastUrl;

    
protected List pageJumpParameters;

    
public PaginationSupportAction()
    
{
    }


    
private void getURL()
    
{
        
// if ( pageUrl != null ) // 在action-*****.xml里设置了
        
// pageUrl = null;

        HttpServletRequest request 
= ServletActionContext.getRequest();
        String servletPath 
= (String) request
                .getAttribute( 
"javax.servlet.include.servlet_path" );

        
if ( servletPath == null )
        
{
            servletPath 
= request.getServletPath();
        }


        
int beginIdx = servletPath.lastIndexOf( "/" );
        
int endIdx = servletPath.lastIndexOf( "." );

        StringBuffer strbuf 
= new StringBuffer();

        strbuf.append( servletPath.substring( ((beginIdx 
== -1? 0
                : (beginIdx 
+ 1)), (endIdx == -1? servletPath.length() : endIdx ) );

        
int end = servletPath.indexOf( "?", endIdx );
        
if ( end == -1 )
            end 
= servletPath.length();
        strbuf.append( servletPath.substring( endIdx, end ) );

        pageJumpParameters 
= getPageJumpParameters( "pageNo,submit,go" );
        
for ( int i = 0; i < pageJumpParameters.size(); i++ )
        
{
            Map map 
= (Map) pageJumpParameters.get( i );
            String paraName 
= (String) map.get( "paraName" );
            String paraVal 
= (String) map.get( "paraVal" );

            
if ( i == 0 )
            
{
                strbuf.append( 
"?" );
            }

            
else
            
{
                strbuf.append( 
"&" );
            }

            strbuf.append( paraName ).append( 
"=" ).append( paraVal );
        }


        pageUrl 
= strbuf.toString();

        log.debug( 
"pageUrl = " + pageUrl );
    }


    
public String execute()
            
throws Exception
    
{
        String result 
= doExecute();
        getURL();
        initParam();
        
return result;
    }


    
/**
     * just like interface Action : public String execute()
     * 
     * 
@throws Exception
     * 
@return String the same as execute() interface
     
*/

    
protected abstract String doExecute()
            
throws Exception;

    
/**
     * query the item count
     * 
     * 
@return int
     
*/

    
protected abstract int queryCount()
            
throws Exception;

    
protected void initParam()
            
throws Exception
    
{
        
if ( pageUrl.indexOf( "?" ) > -1 )
            pageUrl 
+= "&";
        
else
            pageUrl 
+= "?";

        itemCount 
= queryCount();
        pageCount 
= (itemCount + pageList - 1/ pageList;
        
if ( pageNo > pageCount )
            pageNo 
= 1;

        
if ( pageNo > 1 )
        
{
            preUrl 
= "<A href=\"" + pageUrl + "pageNo=" + (pageNo - 1) + "\">上一页</A>";
            firstUrl 
= "<A href=\"" + pageUrl + "pageNo=1\">首页</A>";
        }

        
else
        
{
            preUrl 
= "上一页";
            firstUrl 
= "首页";
        }


        
if ( pageNo < pageCount )
        
{
            nextUrl 
= "<A href=\"" + pageUrl + "pageNo=" + (pageNo + 1)
                    + "\">下一页</A>";
            lastUrl = "<A href=\"" + pageUrl + "pageNo=" + pageCount + "\">尾页</A>";
        }

        
else
        
{
            nextUrl 
= "下一页";
            lastUrl 
= "尾页";
        }

    }


    
private List<Map> getPageJumpParameters( String para_disuse )
    
{
        List
<Map> result = new LinkedList<Map>();
        
if ( para_disuse == null || para_disuse.trim().length() == 0 )
        
{
            para_disuse 
= "pageNo,submit";
        }

        HttpServletRequest request 
= ServletActionContext.getRequest();
        String para_name 
= ""// 参数名称
        Enumeration em = request.getParameterNames();
        para_disuse 
= para_disuse.toLowerCase();
        
while ( em.hasMoreElements() )
        
{
            para_name 
= (String) em.nextElement();
            
if ( para_disuse.indexOf( para_name.toLowerCase() ) == -1 ) // 先转换参数名称为小写,再比较
            {
                String para_val 
= request.getParameter( para_name ) == null ? ""
                        : request.getParameter( para_name );
                
if ( para_val.trim().length() > 0 )
                
{
                    log.debug( para_name 
+ "=" + para_val );
                    Map
<String, String> para_map = new HashMap<String, String>();
                    para_map.put( 
"paraName", para_name );
                    para_map.put( 
"paraVal", para_val.toString() );
                    result.add( para_map );
                }

            }

        }


        
return result;
    }


    
public int getItemCount()
    
{
        
return itemCount;
    }


    
public String getNextUrl()
    
{
        
return nextUrl;
    }


    
public int getPageCount()
    
{
        
return pageCount;
    }


    
public List getPageJumpParameters()
    
{
        
return pageJumpParameters;
    }


    
public int getPageList()
    
{
        
return pageList;
    }


    
public int getPageNo()
    
{
        
return pageNo;
    }


    
public String getPageUrl()
    
{
        
return pageUrl;
    }


    
public String getPreUrl()
    
{
        
return preUrl;
    }


    
public void setItemCount( int itemCount )
    
{
        
this.itemCount = itemCount;
    }


    
public void setNextUrl( String nextUrl )
    
{
        
this.nextUrl = nextUrl;
    }


    
public void setPageCount( int pageCount )
    
{
        
this.pageCount = pageCount;
    }


    
public void setPageJumpParameters( List pageJumpParameters )
    
{
        
this.pageJumpParameters = pageJumpParameters;
    }


    
public void setPageList( int pageList )
    
{
        
this.pageList = pageList;
    }


    
public void setPageNo( int pageNo )
    
{
        
this.pageNo = pageNo;
    }


    
public void setPageUrl( String pageUrl )
    
{
        
this.pageUrl = pageUrl;
    }


    
public void setPreUrl( String preUrl )
    
{
        
this.preUrl = preUrl;
    }


    
public String getFirstUrl()
    
{
        
return firstUrl;
    }


    
public void setFirstUrl( String firstUrl )
    
{
        
this.firstUrl = firstUrl;
    }


    
public String getLastUrl()
    
{
        
return lastUrl;
    }


    
public void setLastUrl( String lastUrl )
    
{
        
this.lastUrl = lastUrl;
    }

}

pagination.jsp:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="webwork" prefix="ww"%>

<TABLE class="Pager" align="center">
    
<TBODY>
        
<TR>
            
<TD class="PagerLeftTd"><ww:property value="itemCount" />&nbsp;&nbsp;<ww:property
                
value="pageNo" />/<ww:property value="pageCount" /></TD>
            
<TD nowrap></TD>
            
<TD class="SpaceWidth"></TD>
            
<TD nowrap></TD>
            
<TD class="SpaceWidth"></TD>
            
<TD nowrap><ww:property value="firstUrl" escape="false" /></TD>
            
<TD class="SpaceWidth"></TD>
            
<TD nowrap><ww:property value="preUrl" escape="false" /></TD>
            
<TD class="SpaceWidth"></TD>
            
<TD nowrap><ww:property value="nextUrl" escape="false" /></TD>
            
<TD class="SpaceWidth"></TD>
            
<TD nowrap><ww:property value="lastUrl" escape="false" /></TD>

        
</TR>
    
</TBODY>
</TABLE>
posted on 2006-12-28 08:46 杨杰荣 阅读(2705) 评论(10)  编辑  收藏 所属分类: webwork,hibernate
评论:
  • # re: 一个简单易用的webwork分页action基类  wolfsquare Posted @ 2006-12-29 14:15
    my god,居然还有人这样用ww2,解藕解藕到了你这又成藕合了.  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  杨杰荣 Posted @ 2006-12-29 14:43
    @wolfsquare
    你说的藕合是指PaginationSupportAction.java中的变量和pagination.jsp的property藕合吗, 其实任何一个webwork的action dispatcher到一个jsp时都有这个问题啊, 除非你的view都是静态内容.
    使用这个方法, 无论是post还是get的请求, 都能生成正确的分页URL, 而且不用多写一行代码, 不用考虑参数的个数, 不用考虑参数值.
    请问你是怎么不藕合的实现这个分页的呢? 多谢指教!  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  开源狂人[匿名] Posted @ 2006-12-31 08:25
    垃圾阿,这种水准就不要写日志了  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  ne Posted @ 2007-10-15 21:46
    老大,给个完整的例子可以吗?
    ne.programmer@163.com

    3q  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  爬树鱼 Posted @ 2008-01-15 11:16
    大哥,给我一个完整的例子吧,我快郁闷死了!  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  爬树鱼 Posted @ 2008-01-15 11:17
    我的邮箱shenlingao@126.com  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类  龙江 Posted @ 2008-04-15 09:20
    大哥,给我一个完整的例子吧,
    邮箱:longjiang@timesnet.cn  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类   Posted @ 2008-05-26 21:31
    太感谢了!!!!!!!!太好用了!!!!!!!!  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类[未登录]  rose Posted @ 2008-09-28 13:45
    大哥,也给我一个完整的例子吧!
    邮箱:szdrose@21cn.com  回复  更多评论   

  • # re: 一个简单易用的webwork分页action基类[未登录]   Posted @ 2009-02-06 10:02
    给我也发一份吧~~~~ljh_love2@Hotmail.com  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 杨杰荣 Powered by: 博客园 模板提供:沪江博客