论坛首页 Java版

Struts2自定义分页标签,基于tangshuo的源码上改进的

浏览 1407 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-05-16 关键字: struts2, taglib, 分页

 

首先感谢tangshuo的源码,之前我也有想过写,但一直没写,
在他的源码之上,作了些改进

package cn.com.shiming.core.tag;

import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.StrutsStatics;
import org.apache.struts2.components.Component;
import org.apache.struts2.dispatcher.StrutsRequestWrapper;

import com.opensymphony.xwork2.util.ValueStack;

/**
 * 分页逻辑Bean
 * @author tangs
 */
public class Pages extends Component {
	
    private HttpServletRequest request;
    
    private String pageNo;
    private String total;
    private String styleClass;
    private String theme;
    private String includes;
    
    public String getTheme() {
        return theme;
    }
    public void setTheme(String theme) {
        this.theme = theme;
    }    
    public String getIncludes() {
		return includes;
	}
	public void setIncludes(String includes) {
		this.includes = includes;
	}
	public String getStyleClass() {
        return styleClass;
    }
    public void setStyleClass(String styleClass) {
        this.styleClass = styleClass;
    }    
    public String getPageNo() {
        return pageNo;
    }
    public void setPageNo(String pageNo) {
        this.pageNo = pageNo;
    }
    public String getTotal() {
        return total;
    }
    public void setTotal(String total) {
        this.total = total;
    }
    
    
    public Pages(ValueStack arg0, HttpServletRequest request) {
        super(arg0);
        this.request = request;
    }

    @Override
    public boolean start(Writer writer) {
    	
        boolean result = super.start(writer);
        try {
            StringBuilder str = new StringBuilder();
            Map cont=this.getStack().getContext();
            StrutsRequestWrapper req=(StrutsRequestWrapper)cont.get(StrutsStatics.HTTP_REQUEST);
            
            String url=(String)req.getAttribute("javax.servlet.forward.request_uri");
                       
            //从ValueStack中取出数值
            Object obj=this.getStack().findValue(pageNo);            
            pageNo = String.valueOf((Integer)obj);  
            obj=this.getStack().findValue(total);
            total = String.valueOf((Integer)obj);  
            
            StringBuffer perUrl=new StringBuffer("");
            if(includes!=null){
            	String[] perm=includes.split(",");
            	for(int i=0;i<perm.length;i++){
            		String permName=perm[i];
            		Object obje=this.getStack().findValue(permName);
            		 String vType=obje.getClass().toString();
            		
            		vType=vType.substring(vType.lastIndexOf(".")+1,vType.length());             		
            		perUrl.append("&"+permName);
            		if(vType.equals("String")){
            			String tmp= (String)this.getStack().findValue(permName);
            			perUrl.append("="+tmp);
            		}else if(vType.equals("Long")){
            			Long tmp= (Long)this.getStack().findValue(permName);
            			perUrl.append("="+tmp);
            		}else if(vType.equals("Float")){
            			Float tmp= (Float)this.getStack().findValue(permName);
            			perUrl.append("="+tmp);
            		}else if(vType.equals("Integer")){
            			Integer tmp= (Integer)this.getStack().findValue(permName);
            			perUrl.append("="+tmp);
            		}else if(vType.equals("Boolean")){
            			Boolean tmp= (Boolean)this.getStack().findValue(permName);
            			perUrl.append("="+tmp);
            		}
            	}            	
            }
            
            
            Integer cpageInt = Integer.valueOf(pageNo);
            str.append("<span ");
            if (styleClass != null) {
                str.append(" class='"+styleClass+"'>");
            } else {
                str.append(">");
            }
            
            //文本样式
            if (theme == null || "text".equals(theme)) {
                //当前页与总页数相等
                if (pageNo.equals(total)) {
                    //如果total = 1,则无需分页,显示“[第1页] [共1页]”
                    if ("1".equals(total)) {
                        str.append("[第 " + pageNo + " 页]");
                        str.append(" [共 " + total + " 页]");
                    } else {
                        //到达最后一页,显示“[首页] [上一页] [末页]”
                        str.append("<a href='"+url+"?pageNo=1"+perUrl+"'>[首页]</a> "); 
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt - 1)+perUrl+"'>[上一页]</a>" );
                        str.append(" <a href='"+url+"?pageNo=" + total+perUrl+"'>[末页]</a> ");
                    }
                } else {
                    //当前页与总页数不相同
                    if ("1".equals(pageNo)) {
                        //第一页,显示“[首页] [下一页] [末页]”
                        str.append("<a href='"+url+"?pageNo=1"+perUrl+"'>[首页]</a>");
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt + 1) +perUrl+"'>[下一页]</a>");                       
                        str.append("<a href='"+url+"?pageNo=" + total +perUrl+"'>[末页]</a>");
                    } else {
                        //不是第一页,显示“[首页] [上一页] [下一页] [末页]”
                        str.append("<a href='"+url+"?pageNo=1"+perUrl+"'>[首页]</a>");
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt - 1)+perUrl+"'>[上一页]</a>");
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt + 1)+perUrl+"'>[下一页]</a>");
                        str.append("<a href='"+url+"?pageNo=" + total +perUrl+"'>[末页]</a>");
                    }
                }
            } else if ("number".equals(theme)) {  //数字样式 [1 2 3 4 5 6 7 8 9 10 > >>]
                Integer totalInt = Integer.valueOf(total);
               
                //如果只有一页,则无需分页
                str.append("[ ");
                if (totalInt == 1) {
                    str.append("<strong>1</strong> ");
                } else {                    
                    if (cpageInt > 1) {
                        //当前不是第一组,要显示“<< <”
                        //<<:返回前一组第一页
                        //<:返回前一页
                        str.append("<a href='"+url+"?pageNo=1"+perUrl+"'>«</a> ");
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt - 1)+perUrl);
                        str.append("'>‹</a> " );
                    }else{                        	
                        str.append("« ‹ " );
                    }
                    
                    int v=(cpageInt-4)>0?(cpageInt-4):1;
                    int v1=(cpageInt+4)<totalInt?(cpageInt+4):totalInt;
                    if(v1==totalInt){
                    	v=totalInt-10;
                    }else if(v==1&&v1<totalInt){
                    	v1=totalInt>10?10:totalInt;
                    }
                    //10个为一组显示
                    for (int i = v; i <= v1; i++) {
                        if (cpageInt == i) { //当前页要加粗显示
                            str.append("<strong>"+i+"</strong> ");                                 
                        }else{
                        	str.append("<a href='"+url+"?pageNo=" + i +perUrl+"'>" + i + "</a> ");
                        }                            
                    }
                    //如果多于1组并且不是最后一组,显示“> >>”
                    if (cpageInt<totalInt) {
                        //>>:返回下一组最后一页
                        //>:返回下一页
                        str.append("<a href='"+url+"?pageNo=" + (cpageInt + 1)+perUrl);
                        str.append("'>›</a> " );
                        str.append("<a href='"+url+"?pageNo=" + totalInt+perUrl);
                        str.append("'>»</a> " );
                    }else{
                    	str.append("› » " );
                    }
                }
                str.append("]");
            }
            str.append("</span>");
            
            writer.write(str.toString());
            
        } catch (IOException ex) {
            Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex);
        }
        return result;
    }
}

 

package cn.com.shiming.core.tag;
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */


import com.opensymphony.xwork2.util.ValueStack;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;

/**
 * 分页标签
 * @author tangs
 */
public class PageTag extends ComponentTagSupport {
	
    private String pageNo;
    private String total;
    private String styleClass;
    private String theme;
    private String includes;
    
    public void setTheme(String theme) {
        this.theme = theme;
    }    
    public void setStyleClass(String styleClass) {
        this.styleClass = styleClass;
    }
    public void setPageNo(String pageNo) {
        this.pageNo = pageNo;
    }
    public void setTotal(String total) {
        this.total = total;
    }
    public String getIncludes() {
		return includes;
	}
	public void setIncludes(String includes) {
		this.includes = includes;
	}

	@Override
    public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) {
        return new Pages(arg0, arg1);
    }

    protected void populateParams() {
        super.populateParams();
        
        Pages pages = (Pages)component;
        pages.setPageNo(pageNo);
        pages.setIncludes(includes);
        pages.setTotal(total);
        pages.setStyleClass(styleClass);
        pages.setTheme(theme);

    }
}
 
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">  
<taglib>  
    <tlib-version>2.2.3</tlib-version>  
    <jsp-version>1.2</jsp-version>  
    <short-name>tangs</short-name>  
    <uri>/tangs</uri>  
    <display-name>"Tangs Tags"</display-name>  
       
        <tag>  
            <name>pages</name>  
            <tag-class>cn.com.shiming.core.tag.PageTag</tag-class>   
            <body-content>empty</body-content>  
            <attribute>   
                <name>pageNo</name>  
                <required>true</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute>  
            <attribute>  
                <name>total</name>  
                <required>true</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute> 
            <attribute>  
                <name>permeterName</name>  
                <required>false</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute> 
            <attribute>  
                <name>includes</name>  
                <required>false</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute>
            <attribute>  
                <name>styleClass</name>  
                <required>false</required>  
                <rtexprvalue>true</rtexprvalue>  
			</attribute>  
			<attribute>  
			    <name>theme</name>  
                <required>false</required>  
                <rtexprvalue>true</rtexprvalue>  
			</attribute> 
        </tag>  
</taglib> 


下面是测试代码:

package cn.com.shiming.action;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

public class ATestAction extends ActionSupport{

	private String test="test";
    private Integer total=40;
    private Integer pageNo=5;
    private Long test1=5L;
    private Float test2=9.8F;
    private int test3=8;    
	public String execute(){
	    return SUCCESS;
	}
	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getPageNo() {
		return pageNo;
	}

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

	public String getTest() {
		return test;
	}

	public void setTest(String test) {
		this.test = test;
	}

	public Long getTest1() {
		return test1;
	}

	public void setTest1(Long test1) {
		this.test1 = test1;
	}

	public Float getTest2() {
		return test2;
	}

	public void setTest2(Float test2) {
		this.test2 = test2;
	}

	public int getTest3() {
		return test3;
	}

	public void setTest3(int test3) {
		this.test3 = test3;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	
}

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tangs" uri="/WEB-INF/tangs.tld"%>

<html> 
<body> 
    <br> 
        共 <s:property value="total"/> 页 第 <s:property value="pageNo"/> 页<br><br>
    <tangs:pages pageNo="pageNo" total="total" includes="test,test1,test2,test3" styleClass="page" theme="number"/> 
    
</body> 
</html> 




欢迎大家拍砖。。。。。。。

 

   
最后更新时间:2008-06-11
感谢tangshuo 及shim的贡献
我在使用这个tag的时候,也做了一些修改,是基于shim的进行的修改

1.                     if ( v1 == totalInt ) {
                        v = totalInt - 10;
                        v= v<=0 ? 1: v; //prevent v would be negative
                    } else if ( v == 1 && v1 < totalInt ) {
                        v1 = totalInt > 10 ? 10 : totalInt;
                    }
增加了一个防止出现负页数的判断
2 。将include包含的参数去掉,将start的内容移到了end方法里,并且允许标签体包含JSP
这样就可以继续利用struts2的标签来传递参数,例如:
    <page:pages currentPage="taskrecordPage.currentPage" totalPage="taskrecordPage.pageCount" theme="number">
        <s:param name="searchForm.username" value="searchForm.username"/>
        <s:param name="searchForm.finished" value="searchForm.finished"/>
    </page:pages>
这里的param参数可以在 解析完标签的参数后得到
            StringBuilder paramStr = new StringBuilder("");
            if ( this.getParameters().size() != 0 ) {
                Iterator iter = this.getParameters().keySet().iterator();
                while (iter.hasNext()) {
                    String key = (String) iter.next();
                    Object o = this.getParameters().get(key);
                    paramStr.append("&").append(key).append("=").append(o);
                }
            }

不知道这样改动大家有什么意见
   
0 请登录后投票
最后更新时间:2008-09-05
楼主,请问我在查询时(按条件查询--是封装成对象的),当点击下一页时,如何保存查询的对象.
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐