struts自定义分页标签

标签文件(放到WEB-INF目录下):

<?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>pageTag</short-name>
<uri>/pageTag</uri>
<display-name>"pageTag"</display-name>
<description><![CDATA[用于jsp文件中的分页功能]]></description>

<tag>
<name>pages</name>
<tag-class>kaiqi.helpu.common.PageTag</tag-class>
<body-content>JSP</body-content>
<description><![CDATA[分页标签,只负责显示分页]]></description>
<attribute>
<name>currentPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[当前页]]></description>
</attribute>
<attribute>
<name>totalPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[总页数]]></description>
</attribute>
<attribute>
<name>url</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[请求的url地址]]></description>
</attribute>
<attribute>
<name>cssClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[CSS的样式类名]]></description>
</attribute>
<attribute>
<name>currentCssClass</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[当前页CSS的样式类名]]></description>
</attribute>
<attribute>
<name>showPageNumber</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[分页时需要显示的数字页码个数]]></description>
</attribute>

<attribute>
<name>firstPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[第一页]]></description>
</attribute>
<attribute>
<name>endPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[最后页]]></description>
</attribute>
<attribute>
<name>prePage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[下一页]]></description>
</attribute>
<attribute>
<name>nextPage</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<description><![CDATA[上一页]]></description>
</attribute>
</tag>
</taglib>

标签类:


/**
* 分页标签
*
*/
public class PageTag extends ComponentTagSupport
{
private String currentPage = "1"; // 当前页
private String totalPage = "1"; // 总页数
private String url; // 请求地址
private String cssClass = "pagination"; // CSS样式类
private String currentCssClass = "current"; //当前页的CSS样式
private String showPageNumber = "5"; // 需要显示的页码数

// 指定首页,末页,上一页,下一页在页面上显示时的字符串
private String firstPage = "第一页";
private String endPage = "最后页";
private String prePage = "<<";
private String nextPage = ">>";


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

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

public void setUrl(String url)
{
this.url = url;
}

public void setCssClass(String cssClass)
{
this.cssClass = cssClass;
}

public void setShowPageNumber(String showPageNumber)
{
this.showPageNumber = showPageNumber;
}

public void setFirstPage(String firstPage)
{
this.firstPage = firstPage;
}

public void setEndPage(String endPage)
{
this.endPage = endPage;
}

public void setPrePage(String prePage)
{
this.prePage = prePage;
}

public void setNextPage(String nextPage)
{
this.nextPage = nextPage;
}

public void setCurrentCssClass(String currentCssClass) {
this.currentCssClass = currentCssClass;
}

@Override
public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2)
{
return new PageManage(arg0); // 返回Pages Component,分页的逻辑处理都在这个Component中
}

// 获得参数
protected void populateParams()
{
super.populateParams();

PageManage pages = (PageManage) component;
pages.setCssClass(cssClass);
pages.setCurrentCssClass(currentCssClass);
pages.setCurrentPage(currentPage);
pages.setShowPageNumber(showPageNumber);
pages.setTotalPage(totalPage);
pages.setUrl(url);
pages.setFirstPage(firstPage);
pages.setEndPage(endPage);
pages.setNextPage(nextPage);
pages.setPrePage(prePage);
}
}


分页逻辑处理类:

/**
* * 分页逻辑
*
*/
public class PageManage extends Component {
private String currentPage;
private String totalPage;
private String url;
private String cssClass;
private String currentCssClass;
private String showPageNumber;
private String firstPage;
private String endPage;
private String prePage;
private String nextPage;

public String getCurrentPage() {
return currentPage;
}

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

public void setCurrentCssClass(String currentCssClass) {
this.currentCssClass = currentCssClass;
}

public String getTotalPage() {
return totalPage;
}

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

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getCssClass() {
return cssClass;
}

public void setCssClass(String cssClass) {
this.cssClass = cssClass;
}

public String getShowPageNumber() {
return showPageNumber;
}

public void setShowPageNumber(String showPageNumber) {
this.showPageNumber = showPageNumber;
}

public void setFirstPage(String firstPage) {
this.firstPage = firstPage;
}

public void setEndPage(String endPage) {
this.endPage = endPage;
}

public void setPrePage(String prePage) {
this.prePage = prePage;
}

public void setNextPage(String nextPage) {
this.nextPage = nextPage;
}

public PageManage(ValueStack arg0) {
super(arg0);
}

@Override
public boolean start(Writer writer) {
boolean result = super.start(writer);

totalPage = parse(totalPage);
currentPage = parse(currentPage);
cssClass = parse(cssClass);
currentCssClass = parse(currentCssClass);
showPageNumber = parse(showPageNumber);
endPage = parse(endPage);
firstPage = parse(firstPage);
prePage = parse(prePage);
nextPage = parse(nextPage);

return result;
}

private String parse(String value) {

String actualValue = null;

if (altSyntax()) {
if (value.startsWith("%{") && value.endsWith("}")) {
value = value.substring(2, value.length() - 1);
}
}

actualValue = (String) getStack().findValue(value, String.class);
if(actualValue == null) {
actualValue = value;
}
return actualValue;
}

@Override
public boolean end(Writer writer, String body) {
try {
StringBuilder outputStringBuilder = new StringBuilder();
StringBuilder paramStringBuilder = new StringBuilder();
boolean isValid = true;

// 从ValueStack中取出数值
if (isValid) {
Set<String> keys = getParameters().keySet();

for (String key : keys) {
paramStringBuilder.append("&");
paramStringBuilder.append(key);
paramStringBuilder.append("=");
//转换编码,否则会出现乱码
paramStringBuilder.append(java.net.URLEncoder.encode(getParameters().get(key).toString(),"utf-8"));
}
}

if (isValid) {
Integer currentPageInt = Integer.valueOf(currentPage);
Integer totalPageInt = Integer.valueOf(totalPage);
Integer showPageNumberInt = Integer.valueOf(showPageNumber);
String current = "";
String param = paramStringBuilder.toString();

if (totalPageInt != 0) {

if (totalPageInt <= showPageNumberInt) { // 总的页数小于可以被显示的页码数
if (currentPage.equals(totalPage)) { // 当前页等于总数页
if ("1".equals(totalPage)) {
// 如果totalPage = 1,则无需分页,不显示分页信息
} else { // 总数页大于1
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt - 1) + param);
outputStringBuilder.append("'>" + prePage + "</a></li>");
for (int i = 1; i <= totalPageInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("</ol>");
}
} else { // 当前页不等于总数页
if ("1".equals(currentPage)) { // 当前页为第一页
outputStringBuilder.append("<ol class='" + cssClass + "'>");
for (int i = 1; i <= totalPageInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + 1) + param);
outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");
} else { // 当前页不为第一页
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt - 1) + param);
outputStringBuilder.append("'>" + prePage + "</a></li>");
for (int i = 1; i <= totalPageInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + 1) + param);
outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");
}
}
} else { // 总页数大于可以显示的页码数
if (currentPage.equals(totalPage)) { // 当前页等于最后页
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);
if((totalPageInt % showPageNumberInt) == 0) {//最后一页显示了showPageNumberInt条
outputStringBuilder.append("?" + "currentPage=" + (totalPageInt-showPageNumberInt) +param);
} else {//最后一页显示了不到showPageNumberInt条
outputStringBuilder.append("?" + "currentPage=" + (totalPageInt-(totalPageInt %showPageNumberInt)) +param);
}
outputStringBuilder.append("'>" + prePage + "</a></li>");
/*显示可见页*/
if((totalPageInt % showPageNumberInt) == 0) {
for (int i = totalPageInt - showPageNumberInt +1; i <= totalPageInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("</ol>");
} else {
for (int i = totalPageInt - totalPageInt % showPageNumberInt +1; i <= totalPageInt; i++) {

current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("</ol>");
}

} else if(currentPage.equals("1")) { // 当前页为第一页
outputStringBuilder.append("<ol class='" + cssClass + "'>");
for (int i = 1; i <= showPageNumberInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (1 + showPageNumberInt) + param);
outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");

} else if((currentPageInt - showPageNumberInt ) < 1) {//当前页在第一大页中
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt - 1) + param);
outputStringBuilder.append("'>" + prePage + "</a></li>");
/*显示可见页*/
for (int i = 1; i <= showPageNumberInt; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
/*显示下一大页*/
if((currentPageInt % showPageNumberInt) == 0) {//当前页为该大页(第一大页)最后一页
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + 1) + param);
} else {//当前页不为该大页(第一大页)最后一页
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + (showPageNumberInt- currentPageInt % showPageNumberInt)+ 1) + param);
}

outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");

} else if ((currentPageInt - showPageNumberInt ) >= 1 && (currentPageInt + showPageNumberInt ) <= totalPageInt) {//当前页不在第一大页也不在最后一大页中
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);
/*显示前一大页*/
if((currentPageInt % showPageNumberInt) == 0) {//当前页为该大页最后一页
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt - showPageNumberInt) + param);
} else {//当前页不为该大页最后一页
outputStringBuilder.append("?" + "currentPage=" + ((currentPageInt - (currentPageInt % showPageNumberInt))) + param);
}
outputStringBuilder.append("'>" + prePage + "</a></li>");

if((currentPageInt % showPageNumberInt)!= 0) { //当前页不为该大页最后一页
/*显示可见页*/
for (int i = currentPageInt + (showPageNumberInt-currentPageInt % showPageNumberInt) + 1 - showPageNumberInt; i < currentPageInt + (showPageNumberInt-currentPageInt % showPageNumberInt) + 1; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
/*显示下一大页*/
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + (showPageNumberInt-currentPageInt % showPageNumberInt) + 1) + param);
outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
/*显示最后一页*/
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");
}else { //当前页为该大页最后一页
for (int i = currentPageInt - showPageNumberInt + 1; i <= currentPageInt ; i++) { //显示可见页
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + 1) + param);

outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");
}
} else if ((totalPageInt - currentPageInt ) < showPageNumberInt) { //当前页在最后一大页中
outputStringBuilder.append("<ol class='" + cssClass + "'>");
outputStringBuilder.append("<li>");
outputStringBuilder.append("<a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=1" + param);
outputStringBuilder.append("'>" + firstPage + "</a></li><li><a href='");
outputStringBuilder.append(url);


/*显示前一大页*/
if((currentPageInt % showPageNumberInt) == 0) {//当前页为该大页(最后一大页)最后一页
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt - showPageNumberInt) + param);
} else {//当前页不为该大页(最后一大页)最后一页
outputStringBuilder.append("?" + "currentPage=" + ((currentPageInt - (currentPageInt % showPageNumberInt))) + param);
}
outputStringBuilder.append("'>" + prePage + "</a></li>");

if((currentPageInt % showPageNumberInt)!= 0) { //当前页不为该大页(最后一大页)的最后一页
/*显示可见页*/
for (int i = currentPageInt + (showPageNumberInt-currentPageInt % showPageNumberInt) + 1 - showPageNumberInt; i < totalPageInt+1; i++) {
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
} else { //当前页为该大页最后一页
for (int i = currentPageInt - showPageNumberInt + 1; i <= currentPageInt ; i++) { //显示可见页
current = "";
if (i == currentPageInt) {
current = " class='"+currentCssClass+"' ";
}
outputStringBuilder.append("<li" + current + "><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + i + param);
outputStringBuilder.append("'>" + i + "</a></li>");
}
}
/*显示下一页*/
outputStringBuilder.append("<li><a href='");
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + (currentPageInt + 1) + param);
outputStringBuilder.append("'>" + nextPage + "</a></li><li> <a href='");
/*显示最后一页*/
outputStringBuilder.append(url);
outputStringBuilder.append("?" + "currentPage=" + totalPage + param);
outputStringBuilder.append("'>" + endPage + "</a></li></ol>");


}
}
}
}

writer.write(outputStringBuilder.toString());

} catch (IOException e) {
Logger.getLogger(PageManage.class.getName()).log(Level.SEVERE, null, e);
}
return super.end(writer, body);
}

}


jsp文件:

<%@ taglib prefix="p" uri="/pageTag"%>
<p:pages currentPage="%{currentPage}" showPageNumber="3" totalPage="%{totalPage}" url="xxx.action" currentCssClass="current">
<s:param name="condition" value="condition"></s:param>
</p:pages>

其中totalPage和currentPage需要在action中设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值