浏览 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);
}
}
下面是测试代码: 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>
声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间: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); } } 不知道这样改动大家有什么意见 |
|
| 返回顶楼 | |
|
最后更新时间:2008-09-05
楼主,请问我在查询时(按条件查询--是封装成对象的),当点击下一页时,如何保存查询的对象.
|
|
| 返回顶楼 | |



