Struts2自定义分页标签
Author:yongtree
最近在学习Struts2,并使用Struts2开发系统。在网上看了好多的struts2的分页,虽然都实现了分页的功能,但是感觉不是非常好,需要我们在每次写分页的时候做很多的工作,而我认为分页应该是一个通用的组件,开发人员在开发的过程中不应该在分页上花费太多的精力。所以,一直想封装一个比较通用的分页组件,而设计分页组件的时候,怎样保证动态查询的参数不丢失,成为实现的一个难点。感谢tangshuo和shim的分享,让我实现了这样的一个分页组件。
该组件采用自定struts2标签的方式实现。
首先建立一个构建分页标签信息的类:Pages.java
/**
* 构建分页标签体的类
* @author yongtree
* @date 2008-11-4 下午02:52:19
* @version 1.0
*/
public class Pages extends Component {
private HttpServletRequest request;
private String pageNo; //当前页码
private String total; //总页数
private String styleClass; //分页的样式
private String theme; //分页的主题
private String url; //action的路径
private String urlType; //路径的类型,主要用于URL重写的扩展
//省略get、set方法
public Pages(ValueStack arg0, HttpServletRequest request) {
super(arg0);
this.request = request;
}
@Override
public boolean end(Writer writer,String body) {
boolean result = super.start(writer);
try {
//从ValueStack中取出数值
Object obj=this.getStack().findValue(pageNo);
pageNo = String.valueOf((Integer)obj);
obj=this.getStack().findValue(total);
total = String.valueOf((Integer)obj);
StringBuilder str = new StringBuilder();
Map cont= this.getStack().getContext();
StrutsRequestWrapper req=(StrutsRequestWrapper)cont.get(StrutsStatics.HTTP_REQUEST);
if(url==null||"".equals(url)){
url=(String)req.getAttribute("javax.servlet.forward.request_uri");
}
String pageNoStr="?pageNo=";
if("dir".equals(urlType)){//当url的类型为目录类型时,比如http://localhost:8090/yongtree/page/1
pageNoStr="";
if("1".equals(pageNo)){//第一页时
if(url.lastIndexOf("/")!=url.length()-1){
if(url.lastIndexOf("1")==url.length()-1){//如果有页码1,则去掉1
url=url.substring(0, url.length()-1);
}else if(url.lastIndexOf("/")!=url.length()-1){//如果没有页码1,并且最后不是'/'时,加上'/'
url=url+"/";
}
}
}else{
url=url.substring(0, url.lastIndexOf("/")+1);
}
}
//下面这段处理主要是用来处理动态查询的参数,并拼接成url
StringBuffer perUrl=new StringBuffer("");
if ( this.getParameters().size() != 0 ) {