`
xangqun
  • 浏览: 79830 次
  • 性别: Icon_minigender_1
  • 来自: 江西
社区版块
存档分类
最新评论

spring+hibernate+struts2 annotation实现分页(3)

阅读更多
这几天写了个ssh2分页实现,放到博客里留个记号,先贴代码有空再写说明了

struts2自定义标签实现
package com.xangqun.tag;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;

import com.opensymphony.xwork2.util.ValueStack;

public class PageStruts2Tag extends ComponentTagSupport{

	private static final long serialVersionUID = 1L;
	
    private int totalPage; //总页数
	
	private int currentPage; //当前页
	
    private int totalCount;  //总数
    
    private int displayNum=10;    //页面显示的页数
    
    private boolean isDisplaySelect= true;  //是否显示选择框
    
    private boolean isDisplayGoToPage= false; //是否显示输入框
    
    private String style="infoPage"; //样式id
    
	@Override
	public Component getBean(ValueStack stack, HttpServletRequest req,
			HttpServletResponse res) {
	   return new PageStrutsTwo(stack);
	}
	
	@Override
	protected void populateParams() {
		super.populateParams();
		PageStrutsTwo pst=(PageStrutsTwo)component;
		pst.setCurrentPage(currentPage);
		pst.setDisplayGoToPage(isDisplayGoToPage);
		pst.setDisplayNum(displayNum);
		pst.setDisplaySelect(isDisplaySelect);
		pst.setTotalCount(totalCount);
		pst.setTotalPage(totalPage);
		pst.setStyle(style); 
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}

	public void setDisplayNum(int displayNum) {
		this.displayNum = displayNum;
	}

	public void setDisplaySelect(boolean isDisplaySelect) {
		this.isDisplaySelect = isDisplaySelect;
	}

	public void setDisplayGoToPage(boolean isDisplayGoToPage) {
		this.isDisplayGoToPage = isDisplayGoToPage;
	}

	public void setStyle(String style) {
		this.style = style;
	}
	
}

package com.xangqun.tag;

import java.io.Writer;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.components.Component;

import com.opensymphony.xwork2.util.ValueStack;

public class PageStrutsTwo extends Component {
	
    private int totalPage; //总页数
	
	private int currentPage; //当前页
	
    private int totalCount;  //总数
    
    private int displayNum=10;   //页面显示的页数
    
    private boolean isDisplaySelect= true; //是否显示选择框
    
    private boolean isDisplayGoToPage= false; //是否显示输入框
    
    private String style="infoPage"; //样式id
    
	public PageStrutsTwo(ValueStack stack) {
		super(stack);
	}

	@Override
	public boolean start(Writer writer) {
		boolean result = super.start(writer);   
		try{
			StringBuilder str=new StringBuilder(1024);
			String cleanUrl=getCleanUrl();
			boolean isValid=true;
			isValid =(this.getStack().findValue(String.valueOf(totalPage))== null && this.getStack().findValue(String.valueOf(totalCount))== null) ? false : true;
			if (isValid) { 
				str.append("<div id='").append(style).append("'><ul>");
		        if (currentPage > 1) {
		        	str.append("<li><a href='" + getCompleteUrl(cleanUrl, currentPage - 1) +
				              "' class='upPage' title='上一页'></a></li>");
				} else {
					str.append("<li><a class='upPage' title='目前已是第一页'></a></li>");
				}
				
		        if (displayNum == 0) {
		        	str.append("<li class='pages'><span class='currentPage'>" + currentPage + "</span>/" + totalPage + "</li>");
		          } else {
		            int pagenumber = displayNum;
		            int pagecenter = pagenumber / 2 - 1;
		            int pagebet = pagenumber / 2 + 1;
		            int beginPage = 1;
		            int endPage = 1;

		            if (currentPage < pagebet) {
		              beginPage = 1;
		            } else {
		              beginPage = currentPage - pagecenter;
		            }

		            if (currentPage + pagecenter > totalPage) {
		              endPage = totalPage;
		            } else {
		              endPage = currentPage + pagecenter;
		            }

		            if (currentPage + pagecenter < pagenumber) {
		              endPage = pagenumber;
		            }

		            if (endPage - currentPage < pagecenter) {
		              beginPage = totalPage - (pagenumber - 1);
		              if (beginPage != 1) {
		                beginPage += 1;
		              }
		            }

		            if (beginPage <= 0) {
		              beginPage = 1;
		            }

		            if (endPage > totalPage) {
		              endPage = totalPage;
		            }

		            if (currentPage >= pagebet && beginPage != 1) {
		            	str.append("<li><a href='" + getCompleteUrl(cleanUrl, 1) +
		                      "' class='everyPage'>1</a></li>");
		              if (currentPage != pagebet) {
		            	  str.append("<li>...&nbsp;</li>");
		              }
		            }

		            for (int i = beginPage; i <= endPage; i++) {

		              StringBuilder item=new StringBuilder(1024);
		              if (i != currentPage) {
		                item.append("<li><a href='" + getCompleteUrl(cleanUrl, i) +
		                        "' class='everyPage'>" + i +
		                        "</a></li>");
		              } else {
		                item.append("<li><a class='nowPage'>" + i +
		                        "</a></li>");
		              }
		              str.append(item);
		            }
		          }
		          if (currentPage < totalPage) {
		        	  str.append("<li><a href='" + getCompleteUrl(cleanUrl, currentPage + 1) +
		                    "' class='downPage' title='下一页'></a></li>");
		          } else {
		        	  str.append("<li><a class='downPage' title='目前已是最后一页'></a></li>");
		          }

		          boolean isSelect = isDisplaySelect;
		          if (isDisplayGoToPage) {
		            isSelect = false;
		            str.append("<li>&nbsp;&nbsp;到第&nbsp;<input id='inputPage' value='" + currentPage + "'/>&nbsp;页</li>");
		            StringBuilder script =new StringBuilder("javascript:var goPage=this.parentNode.parentNode.getElementsByTagName('input')[0].value;if(isNaN(goPage)||goPage>"
		            + totalPage + "||goPage<1||goPage==" + currentPage + ")return;document.location='" + getCompleteUrlNoParam(cleanUrl)
		            + "page='+goPage;return false;");
		            str.append("<li><a href='javascript:;' onclick=\"" + script + "\" class='goToPage'></a></li>");
		          }

		          if (isSelect) {
		        	  str.append("<li>&nbsp;&nbsp;到第&nbsp;<select name='select2' onchange=\"window.location.href='" +
		                    getCompleteUrlNoParam(cleanUrl) +
		                    "page='+this.options[this.selectedIndex].value + ''\">");
		            for (int iCount = 1; iCount <= totalPage; iCount++) {
		              String strSelected = "";
		              if (iCount == currentPage) {
		                strSelected = "selected";
		              }
		              str.append("<option value='" + iCount + "' " + strSelected + ">-" +
		                      iCount + "-</option>");
		            }
		            str.append("</select>&nbsp;页</li>");
		          }
		          str.append("</ul></div>");
			}
			 writer.write(str.toString());
			 
		}catch (Exception e) {
		}
		
		return result;
	}

	private String getCompleteUrlNoParam(String reqUrl) {
      if (reqUrl.indexOf("?") > 0) {
        return reqUrl + "&";
      } else {
        return reqUrl + "?";
      }
    }

	private String getCompleteUrl(String reqUrl, int page) {
       if (reqUrl.indexOf("?") > 0) {
         return reqUrl + "&page=" + page;
       } else {
        return reqUrl + "?page=" + page;
       }
    }

	private String getCleanUrl() throws Exception {
		HttpServletRequest request=(HttpServletRequest)ServletActionContext.getRequest();
		Map parameters=request.getParameterMap();
		boolean isFirst=true;
		Set entries=parameters.entrySet();
		Iterator it=entries.iterator();
		//TODO
		//这里的方法可以根据需要修改下
		String reqUrl=(String)request.getAttribute("struts.request_uri");
		HttpServletResponse response=(HttpServletResponse)ServletActionContext.getResponse();
		
		while(it.hasNext()){
			Map.Entry entry = (Map.Entry) it.next();
		    String Name = (String) entry.getKey();
		    String[] Value = (String[]) entry.getValue();
		    String[] temp = new String[Value.length];
		    for (int i = 0; i < Value.length; i++) {
		        temp[i] = Value[i];
		    }
		    
		    for (int i = 0; i < Value.length; i++) {
		        temp[i] = URLEncoder.encode(temp[i], "GBK");
		    }
		    if (Name.equalsIgnoreCase("page") == false) {
		        for (int j = 0; j < temp.length; j++) {
		          if (temp[j]!=null||temp[j]!="") {
		            if (isFirst) {
		              isFirst = false;
		              reqUrl += "?" + Name + "=" + temp[j];
		            } else {
		              String param = "&" + Name + "=" + temp[j];
		              String param2 = "&" + Name + "=" + temp[j] + "&";
		              if (reqUrl.indexOf(param2) < 0) {
		                if (reqUrl.endsWith(param) == false) {
		                  reqUrl += "&" + param;
		                }
		              }
		            }
		          }
		        }
		      }
		}
		return response.encodeURL(reqUrl);
	}

	public int getTotalPage() {
		return totalPage;
	}

	public void setTotalPage(int totalPage) {
		this.totalPage = totalPage;
	}
	public int getCurrentPage() {
		return currentPage;
	}

	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	public int getDisplayNum() {
		return displayNum;
	}

	public void setDisplayNum(int displayNum) {
		this.displayNum = displayNum;
	}
	public boolean isDisplaySelect() {
		return isDisplaySelect;
	}

	public void setDisplaySelect(boolean isDisplaySelect) {
		this.isDisplaySelect = isDisplaySelect;
	}
	public boolean isDisplayGoToPage() {
		return isDisplayGoToPage;
	}

	public void setDisplayGoToPage(boolean isDisplayGoToPage) {
		this.isDisplayGoToPage = isDisplayGoToPage;
	}
	public String getStyle() {
		return style;
	}

	public void setStyle(String style) {
		this.style = style;
	}
	
}

在WEB-INF目录下新建一个tlds目录,PageTags.tld放置在tlds目录里
PageTags.tld
<?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>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>pageTags</short-name>
    <uri>/PageTags</uri>
    <display-name>pageTags</display-name>
    <description></description>
    <tag>
     <name>PageStruts2Tag</name>
     <tag-class>com.xangqun.tag.PageStruts2Tag</tag-class>
     <body-content>JSP</body-content>
     <display-name>pageStruts2Tag</display-name>
	      <attribute>
            <name>totalPage</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>int</type>
        </attribute>
        <attribute>
            <name>currentPage</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>int</type>
        </attribute>
        <attribute>
            <name>style</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
        </attribute>
        <attribute>
            <name>totalCount</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>java.lang.String</type>
        </attribute>
         <attribute>
            <name>displayNum</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>int</type>
        </attribute>
        <attribute>
            <name>isDisplaySelect</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
        <attribute>
            <name>isDisplayGoToPage</name>
            <required>false</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
    </tag>
</taglib>    

css样式自己写个就可以
<%@ page language="java" contentType="text/html; charset=gbk"
	pageEncoding="gbk"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%@ taglib uri="/PageTags" prefix="pageTags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>demo</title>
<link rel="stylesheet" type="text/css" href="css/page.css" />
</head>
<body>
<s:iterator value="pagination.list" var="p">
   ${p.name}
</s:iterator>
<pageTags:PageStruts2Tag currentPage="${pagination.currentPage}" totalPage="${pagination.totalPage}" totalCount="${pagination.totalCount}" displayNum="6" />
</body>
</html>

效果看附件(点击看原图)
  • 大小: 13.2 KB
分享到:
评论

相关推荐

    Spring2.5+Struts2.0+hibernate3.0+Dwr+jquery+displayTag

    2 利用struts2 的LoginAction-validation.xml 3 在bean里把service包;暴露DWR,写了一个验证用户名的流程 4 采用jpa作为POJO,还是减少配置 5 加入display的分页,并且是物理分页 打开后自已建表sql.txt jdbc....

    基于spring,struts(struts2),hibernate的web项目脚手架

    内置一个基于数据库的代码生成器rapid-generator,极易进行二次开发 struts1,struts2的零配置 spring集成及加强,自动搜索hibernate的entity annotation class 集成动态构造sql的工具:rapid-xsqlbuilder 集成...

    使用Annotation并对DAO层封装具有分页功能的S2SH整合实例_好资源0分送

    个人认为由Sun官方支持的EJB规范会越来越流行,此时如果使用基于Annotation的SSH框架很容易转移到Struts+EJB+Spring的项目中,而且使用Annotation,很容易实现0配置,像在这个实例中就一个配置,这样避免了配置文件...

    低清版 大型门户网站是这样炼成的.pdf

    (Struts 2+Spring 2+Hibernate 3).pdf(完整版) 网上有高清版350M的。可以去下 http://115.com/file/be5gwid8 请于下载后 24H 内及时删除!请抱着学习的态度下载此资料。 总共900多页!!!!!!! 第1篇 ...

    免费下载:自己整理的java学习资料

    自己整理的一些资料,不需要积分,希望对大家有帮助。 里面包有如下的一些java资料 Ant使用指南.pdf cvs.pdf Eclipse入门-- Eclipse的使用简介及插件开发.PDF ...spring2中文开发参考手册.chm a.txt

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

     国内知名的高端IT技术作家,已出版《Spring 2.0宝典》、《基于J2EE的Ajax宝典》、《轻量级J2EE企业应用实战》、《Struts 2权威指南》、《Ruby On Rails敏捷开发最佳实践》等著作。 目录: 第0章 学习Java...

    java开源包3

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包2

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包1

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包11

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包6

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包5

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包10

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包8

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包7

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包9

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java开源包101

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    Java资源包01

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics