最近在学习Struts2,并使用Struts2开发系统。在网上看了好多的struts2的分页,虽然都实现了分页的功能,但是感觉不是非常好,需要我们在每次写分页的时候做很多的工作,而我认为分页应该是一个通用的组件,开发人员在开发的过程中不应该在分页上花费太多的精力。所以,一直想封装一个比较通用的分页组件,而设计分页组件的时候,怎样保证动态查询的参数不丢失,成为实现的一个难点。感谢tangshuo和shim的分享,让我实现了这样的一个分页组件。 该组件采用自定struts2标签的方式实现。
首先建立一个构建分页标签信息的类:Pages.java
/**
*构建分页标签体的类
*@authorJava软件工程师,专注于java领域新技术的研究和系统设计。 *@date2008-11-4下午02:52:19 *@version1.0 */
publicclass 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
publicboolean 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(\); }
String pageNoStr=\;
if(\.equals(urlType)){//当url的类型为目录类型时,比如http://localhost:8090/yongtree/page/1 pageNoStr=\;
if(\.equals(pageNo)){//第一页时 if(url.lastIndexOf(\)!=url.length()-1){
if(url.lastIndexOf(\)==url.length()-1){//如果有页码1,则去掉1 url=url.substring(0, url.length()-1);
}elseif(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 ) {
Iterator iter = this.getParameters().keySet().iterator(); while (iter.hasNext()) {
String key = (String) iter.next();
Object o = this.getParameters().get(key);
perUrl.append(\).append(key).append(\).append(o); } }
Integer cpageInt = Integer.valueOf(pageNo); str.append(\); if (styleClass != null) {
str.append(\+styleClass+\); } else {
str.append(\); }
//文本样式
if (theme == null || \.equals(theme)) { //当前页与总页数相等 if (pageNo.equals(total)) {
//如果total = 1,则无需分页,显示“[第1页] [共1页]” if (\.equals(total)) {
str.append(\第 \ + pageNo + \页]\); str.append(\共 \ + total + \页]\); } else {
//到达最后一页,显示“[首页] [上一页] [末页]”
str.append(\+url+pageNoStr+\+perUrl+\首页] \); str.append(\+url+pageNoStr + (cpageInt - 1)+perUrl+\上一页]\ );
str.append(\+url+pageNoStr + total+perUrl+\末页] \); } } else {
//当前页与总页数不相同 if (\.equals(pageNo)) {
//第一页,显示“[首页] [下一页] [末页]”
str.append(\+url+pageNoStr+\+perUrl+\首页]\); str.append(\+url+pageNoStr + (cpageInt + 1) +perUrl+\下一页]\);
str.append(\+url+pageNoStr + total +perUrl+\末页]\); } else {
//不是第一页,显示“[首页] [上一页] [下一页] [末页]”
str.append(\+url+pageNoStr+\+perUrl+\首页]\); str.append(\+url+pageNoStr + (cpageInt - 1)+perUrl+\上一页]\);
str.append(\+url+pageNoStr + (cpageInt + 1)+perUrl+\下一页]\);
str.append(\+url+pageNoStr + total +perUrl+\末页]\); } }
} elseif (\.equals(theme)) { //数字样式 [1 2 3 4 5 6 7 8 9 10 > >>] Integer totalInt = Integer.valueOf(total);
//如果只有一页,则无需分页 str.append(\); if (totalInt == 1) {
str.append(\); } else { if (cpageInt > 1) {
//当前不是第一组,要显示“<< <” //<<:返回前一组第一页 //<:返回前一页
str.append(\+url+pageNoStr+\+perUrl+\); str.append(\+url+pageNoStr + (cpageInt - 1)+perUrl); str.append(\ );
}else{ str.append(\ ); }
int v=(cpageInt-4)>0?(cpageInt-4):1;
int v1=(cpageInt+4) v=(v<=0?1:v); //如果为负数,则修改为1 }elseif(v==1&&v1 //10个为一组显示 for (int i = v; i <= v1; i++) { if (cpageInt == i) { //当前页要加粗显示 str.append(\+i+\); }else{ //str.append(\ str.append(\+url+pageNoStr + i +perUrl+\ + i + \); } } //如果多于1组并且不是最后一组,显示“> >>” if (cpageInt str.append(\+url+pageNoStr + (cpageInt + 1)+perUrl); str.append(\ ); str.append(\+url+pageNoStr + totalInt+perUrl); str.append(\ ); }else{ str.append(\ ); } } str.append(\); } str.append(\); writer.write(str.toString()); } catch (IOException ex) { ex.printStackTrace(); } return result; }
相关推荐: