`
hpowersoft
  • 浏览: 1351 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Struts2中实现自定义分页标签

阅读更多
Struts2中实现自定义标签很简单,主要分为3步:

    1.创建taglib文件(.tld),编写标签声明。

    2.编写自定义标签类。

    3.在页面中使用标签。

    下面以一个自定义的分页标签为例,进行说明。

    其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下ComponentTagSupport类的继承关系就明了了:

Java代码 
java.lang.Object   
  extended by javax.servlet.jsp.tagext.TagSupport   
      extended by javax.servlet.jsp.tagext.BodyTagSupport   
          extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport   
              extended by org.apache.struts2.views.jsp.ComponentTagSupport 
java.lang.Object
  extended by javax.servlet.jsp.tagext.TagSupport
      extended by javax.servlet.jsp.tagext.BodyTagSupport
          extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport
              extended by org.apache.struts2.views.jsp.ComponentTagSupport

继承ComponentTagSupport类是为了获得标签中的属性值,并包装成Component对象。继承Component类是为了从Struts2中的ValueStack中获得相对应的值。

1.声明自定义标签。

首先,需要创建一个tld文件,这是一个标准的XML文件,这个文件中就包含有对自定义标签的声明,声明指出了标签的名字,实现标签的类,标签的属性等信息。当在页面中使用该标签时,web服务器就会从这个文件中找出相对应的标签类,并实例化后执行。这个文件其实与struts.xml文件的作用相类似。

tangs.tld

Xml代码 
<?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>tangs</short-name>  
    <uri>/tangs</uri>  
    <display-name>"Tangs Tags"</display-name>  
       
        <tag>  
            <name>pages</name>  
            <tag-class>com.tangs.tag.PageTag</tag-class>   //标签类   
            <body-content>empty</body-content>  
            <attribute>   //标签中的属性   
                <name>cpage</name>  //属性名   
                <required>true</required>  //是否必须   
                <rtexprvalue>true</rtexprvalue>  //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定   
            </attribute>  
            <attribute>  
                <name>total</name>  
                <required>true</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute>  
            <attribute>  
                <name>url</name>  
                <required>true</required>  
                <rtexprvalue>true</rtexprvalue>  
            </attribute>  
        </tag>  
</taglib> 
2.编写标签类

PageTag.java

Java代码 
package com.tangs.tag;   
  
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 cpage;  //当前页   
    private String total;  //总页数   
    private String url;  //请求地址   
  
    public void setCpage(String cpage) {   
        this.cpage = cpage;   
    }   
  
    public void setTotal(String total) {   
        this.total = total;   
    }   
  
    public void setUrl(String url) {   
        this.url = url;   
    }   
  
    @Override  
    public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) {   
        return new Pages(arg0); //返回Pages Component,分页的逻辑处理都在这个Component中   
    }   
  
    //获得参数   
    protected void populateParams() {   
        super.populateParams();   
           
        Pages pages = (Pages)component;   
        pages.setCpage(cpage);   
        pages.setTotal(total);   
        pages.setUrl(url);   
    }   

package com.tangs.tag;

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 cpage;  //当前页
    private String total;  //总页数
    private String url;  //请求地址

    public void setCpage(String cpage) {
        this.cpage = cpage;
    }

    public void setTotal(String total) {
        this.total = total;
    }

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

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

    //获得参数
    protected void populateParams() {
        super.populateParams();
       
        Pages pages = (Pages)component;
        pages.setCpage(cpage);
        pages.setTotal(total);
        pages.setUrl(url);
    }
}
    Pages.java

Java代码 
package com.tangs.tag;   
  
import com.opensymphony.xwork2.util.ValueStack;   
import java.io.IOException;   
import java.io.Writer;   
import java.util.logging.Level;   
import java.util.logging.Logger;   
import org.apache.struts2.components.Component;   
  
/**  
* 分页逻辑Bean  
* @author tangs  
*/  
public class Pages extends Component {   
    private String cpage;   
    private String total;   
    private String url;   
  
    public String getCpage() {   
        return cpage;   
    }   
  
    public void setCpage(String cpage) {   
        this.cpage = cpage;   
    }   
  
    public String getTotal() {   
        return total;   
    }   
  
    public void setTotal(String total) {   
        this.total = total;   
    }   
  
    public String getUrl() {   
        return url;   
    }   
  
    public void setUrl(String url) {   
        this.url = url;   
    }   
       
       
    public Pages(ValueStack arg0) {   
        super(arg0);   
    }   
  
    @Override  
    public boolean start(Writer writer) {   
        boolean result = super.start(writer);   
        try {   
            StringBuilder str = new StringBuilder();   
            boolean isValid = true;   
               
            //从ValueStack中取出数值   
            if (isValid) {   
                if (total.startsWith("%{") && total.endsWith("}")) {   
                    total = total.substring(2, total.length() -1);   
                    total = (String)this.getStack().findValue(total);   
                    isValid = total == null ? false : true;   
                } else {   
                    isValid = false;   
                }   
            }   
            if (isValid) {   
                if (cpage.startsWith("%{") && cpage.endsWith("}")) {   
                    cpage = cpage.substring(2, cpage.length() - 1);   
                    cpage = (String)this.getStack().findValue(cpage);   
                    isValid = cpage == null ? false : true;   
                } else {   
                    isValid = false;   
                }   
            }   
            if (isValid) {   
                if (url.startsWith("%{") && url.endsWith("}")) {   
                    url = url.substring(2, url.length() - 1);   
                    url = (String)this.getStack().findValue(url);   
                    isValid = url == null ? false : true;   
                } else {   
                    isValid = false;   
                }   
            }   
  
            if (isValid) {   
                Integer cpageInt = Integer.valueOf(cpage);   
                //当前页与总页数相等   
                if (cpage.equals(total)) {   
                    //如果total = 1,则无需分页,显示“[第1页] [共1页]”   
                    if ("1".equals(total)) {   
                        str.append("[第 " + cpage + " 页]");   
                        str.append(" [共 " + total + " 页]");   
                    } else {   
                        //到达最后一页,显示“[首页] [上一页] [末页]”   
                        str.append("<a href='");   
                        str.append(url);   
                        str.append("?cpage=1&total="+total+"&url="+url);   
                        str.append("'>[首页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);   
                        str.append("'>[上一页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);   
                        str.append("'>[末页]</a>");   
                    }   
                } else {   
                    //当前页与总页数不相同   
                    if ("1".equals(cpage)) {   
                        //第一页,显示“[首页] [下一页] [末页]”   
                        str.append("<a href='");   
                        str.append(url);   
                        str.append("?cpage=1&total="+total+"&url="+url);   
                        str.append("'>[首页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);   
                        str.append("'>[下一页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);   
                        str.append("'>[末页]</a>");   
                    } else {   
                        //不是第一页,显示“[首页] [上一页] [下一页] [末页]”   
                        str.append("<a href='");   
                        str.append(url);   
                        str.append("?cpage=1&total="+total+"&url="+url);   
                        str.append("'>[首页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);   
                        str.append("'>[上一页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);   
                        str.append("'>[下一页]</a> <a href='");   
                        str.append(url);   
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);   
                        str.append("'>[末页]</a>");   
                    }   
                }   
            }   
              
            writer.write(str.toString());   
               
        } catch (IOException ex) {   
            Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex);   
        }   
        return result;   
    }   

package com.tangs.tag;

import com.opensymphony.xwork2.util.ValueStack;
import java.io.IOException;
import java.io.Writer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.struts2.components.Component;

/**
* 分页逻辑Bean
* @author tangs
*/
public class Pages extends Component {
    private String cpage;
    private String total;
    private String url;

    public String getCpage() {
        return cpage;
    }

    public void setCpage(String cpage) {
        this.cpage = cpage;
    }

    public String getTotal() {
        return total;
    }

    public void setTotal(String total) {
        this.total = total;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
   
   
    public Pages(ValueStack arg0) {
        super(arg0);
    }

    @Override
    public boolean start(Writer writer) {
        boolean result = super.start(writer);
        try {
            StringBuilder str = new StringBuilder();
            boolean isValid = true;
           
            //从ValueStack中取出数值
            if (isValid) {
                if (total.startsWith("%{") && total.endsWith("}")) {
                    total = total.substring(2, total.length() -1);
                    total = (String)this.getStack().findValue(total);
                    isValid = total == null ? false : true;
                } else {
                    isValid = false;
                }
            }
            if (isValid) {
                if (cpage.startsWith("%{") && cpage.endsWith("}")) {
                    cpage = cpage.substring(2, cpage.length() - 1);
                    cpage = (String)this.getStack().findValue(cpage);
                    isValid = cpage == null ? false : true;
                } else {
                    isValid = false;
                }
            }
            if (isValid) {
                if (url.startsWith("%{") && url.endsWith("}")) {
                    url = url.substring(2, url.length() - 1);
                    url = (String)this.getStack().findValue(url);
                    isValid = url == null ? false : true;
                } else {
                    isValid = false;
                }
            }

            if (isValid) {
                Integer cpageInt = Integer.valueOf(cpage);
                //当前页与总页数相等
                if (cpage.equals(total)) {
                    //如果total = 1,则无需分页,显示“[第1页] [共1页]”
                    if ("1".equals(total)) {
                        str.append("[第 " + cpage + " 页]");
                        str.append(" [共 " + total + " 页]");
                    } else {
                        //到达最后一页,显示“[首页] [上一页] [末页]”
                        str.append("<a href='");
                        str.append(url);
                        str.append("?cpage=1&total="+total+"&url="+url);
                        str.append("'>[首页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
                        str.append("'>[上一页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);
                        str.append("'>[末页]</a>");
                    }
                } else {
                    //当前页与总页数不相同
                    if ("1".equals(cpage)) {
                        //第一页,显示“[首页] [下一页] [末页]”
                        str.append("<a href='");
                        str.append(url);
                        str.append("?cpage=1&total="+total+"&url="+url);
                        str.append("'>[首页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
                        str.append("'>[下一页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);
                        str.append("'>[末页]</a>");
                    } else {
                        //不是第一页,显示“[首页] [上一页] [下一页] [末页]”
                        str.append("<a href='");
                        str.append(url);
                        str.append("?cpage=1&total="+total+"&url="+url);
                        str.append("'>[首页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
                        str.append("'>[上一页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
                        str.append("'>[下一页]</a> <a href='");
                        str.append(url);
                        str.append("?cpage=" + total + "&total=" + total+"&url="+url);
                        str.append("'>[末页]</a>");
                    }
                }
            }
          
            writer.write(str.toString());
           
        } catch (IOException ex) {
            Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex);
        }
        return result;
    }
}
3.服务端

服务端主要是获得请求然后转向显示的页面

DisplayAction.java

Java代码 
/*  
* To change this template, choose Tools | Templates  
* and open the template in the editor.  
*/  
  
package com.tangs.action;   
  
import com.opensymphony.xwork2.ActionSupport;   
  
/**  
*  
* @author tangs  
*/  
public class DisplayAction extends ActionSupport {   
    private String cpage;   
    private String total;   
    private String url;   
  
    public String list() {   
           
        //Get data from server   
        //...   
        //这里没有做任何逻辑,直接跳转到了页面   
        return SUCCESS;   
    }   
    public String getCpage() {   
        return cpage;   
    }   
  
    public void setCpage(String cpage) {   
        this.cpage = cpage;   
    }   
  
    public String getTotal() {   
        return total;   
    }   
  
    public void setTotal(String total) {   
        this.total = total;   
    }   
  
    public String getUrl() {   
        return url;   
    }   
  
    public void setUrl(String url) {   
        this.url = url;   
    }   
       
       

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package com.tangs.action;

import com.opensymphony.xwork2.ActionSupport;

/**
*
* @author tangs
*/
public class DisplayAction extends ActionSupport {
    private String cpage;
    private String total;
    private String url;

    public String list() {
       
        //Get data from server
        //...
        //这里没有做任何逻辑,直接跳转到了页面
        return SUCCESS;
    }
    public String getCpage() {
        return cpage;
    }

    public void setCpage(String cpage) {
        this.cpage = cpage;
    }

    public String getTotal() {
        return total;
    }

    public void setTotal(String total) {
        this.total = total;
    }

    public String getUrl() {
        return url;
    }

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

Xml代码 
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >  
<struts>  
    <package name="tagTest" extends="struts-default">  
                <action name="list" class="com.tangs.action.DisplayAction">  
                    <result name="success">/list.jsp</result>  
                </action>  
    </package>  
</struts> 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
<struts>
<package name="tagTest" extends="struts-default">
                <action name="list" class="com.tangs.action.DisplayAction">
                    <result name="success">/list.jsp</result>
                </action>
</package>
</struts>
 

4.在页面中使用标签

list.jsp

Html代码 
<%@page contentType="text/html" pageEncoding="UTF-8"%>  
<%@ taglib prefix="tangs" uri="/WEB-INF/tangs.tld"%>  
<%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld"%>  
  
<html>  
    <head>  
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
        <title>List</title>  
    </head>  
    <body>  
        共 <s:property value="total"/> 页 第 <s:property value="cpage"/> 页<br>  
        <tangs:pages cpage="%{cpage}" total="%{total}" url="%{url}"/>  
    </body>  
</html>  

http://localhost:8888/TagTest/list.action?cpage=2&total=5&url=list.action
分享到:
评论
1 楼 maosenmin 2009-04-18  
如果有多个查询条件任意组合查询,那当在点下一页时url=list.action ,可这个时候并不像第一次由查询页面进入直接把查询参数带进来,而这个时候怎样把查询页面的查询条件带过来呢?

相关推荐

    Struts2中实现自定义分页标签 --功能扩充

    本篇文章将探讨如何在Struts2中实现自定义分页标签,这是一项非常实用的功能,尤其对于处理大量数据展示时,能显著提高用户体验。我们将深入源码,了解其工作原理,并提供一个自定义分页标签的实现过程。 首先,...

    Struts2自定义分页标签

    本篇文章将深入探讨如何在Struts2中实现自定义分页标签,以及相关的源码分析和工具使用。 首先,我们需要理解分页的基本原理。分页通常涉及到两个主要部分:服务器端的分页逻辑和客户端的显示。服务器端负责处理...

    基于struts2 自定义标签 分页

    在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...

    struts2 完美实现 标签分页

    首先,我们需要在Struts2的Action类中实现分页逻辑。Action类通常包含获取总记录数、当前页数、每页显示记录数等属性,以及对应的方法来计算总页数和获取当前页的数据。这些方法应连接到数据库,执行相应的SQL查询,...

    Struts2分页-自定义标签-类似百度分页

    在Struts2中,自定义标签可以用来扩展JSP页面的功能,使其能够更好地与后台业务逻辑交互。 自定义标签的实现通常分为以下几个步骤: 1. **创建标签库**:定义一个XML文件(如struts-tags.xml),用于声明自定义...

    Struts2+jsp自定义分页组件以及源码

    本教程主要探讨如何在Struts2框架下实现一个基于JSP的自定义分页组件,名为"zoo-paging-1.0.jar"。该组件不仅提供了分页功能,还附带了源代码和示例项目,方便开发者理解和应用。 首先,我们来理解分页的基本概念。...

    Struts 2 自定义标签分页

    本篇文章将深入探讨如何在Struts 2中实现自定义标签进行分页,包括简单的上下分页和数字分页。 首先,我们需要理解分页的基本概念。分页是指将大量数据分成若干小部分,每次只显示一部分,通过翻页来查看其他部分。...

    自定义分页标签源代码

    开发者可能结合Struts1标签库与自定义分页标签一起使用,实现更复杂的业务逻辑。 4. **实例化分页类**: 分页标签可能需要一个分页类的实例,这个类通常会包含当前页数、总页数、每页大小等属性,以及相关的计算...

    自定义分页标签struts2,spring

    本项目"自定义分页标签struts2,spring"是针对Struts2和Spring框架的一个自定义标签实现,旨在简化开发过程,提高代码的可复用性和可维护性。下面我们将详细探讨这个项目中的关键技术点。 首先,Struts2是一个非常...

    自定义struts2 分页标签

    通过以上步骤,我们就成功地在Struts2中实现了自定义分页标签。这种方式不仅使代码结构清晰,还便于复用和扩展。同时,自定义标签还能更好地与其他业务逻辑解耦,提高代码的可维护性和可读性。在实际开发中,根据...

    java企业项目开发中的自定义分页标签

    本项目以SSH(Struts2、Spring、Hibernate)经典框架为基础,通过自定义分页标签实现了这一功能。下面将详细介绍自定义分页标签在项目中的应用及其核心知识点。 首先,SSH框架是Java Web开发中广泛使用的三大组件。...

    struts2自定义标签案例详解

    下面我们将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理。 自定义标签的创建主要涉及以下三个步骤: 1. **创建taglib文件 (.tld)**:TLD(Tag Library Descriptor)文件是自定义标签的元数据,用于...

    tag struts2的自定义标签实例

    本实例将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理和步骤。 首先,自定义标签在Web开发中的作用是提高代码的可读性和可维护性,它将复杂的Java代码封装起来,让HTML视图更加简洁。在Struts2中,...

    自定义标签代替Struts标签实现分页

    在Java Web开发中,Struts框架是常用的MVC框架之一...这种方式比直接使用Struts的分页标签更加灵活,但需要更多的编码工作。总的来说,自定义标签是Java Web开发中的一个重要技能,能够提升应用的可维护性和可扩展性。

    struts2做的分页标签

    本文将详细介绍如何在Struts2中实现分页标签,并提供一个简洁易懂的项目示例。 1. **Struts2分页概念**: 分页是将大量数据分割成若干小块,每次只加载一部分数据到页面上,使得用户可以逐页浏览,减轻服务器压力...

    利用Struts和自定义标签实现分页,包括类库、例题、使用说明

    综上所述,通过自定义标签在Struts框架中实现分页,可以有效分离视图和业务逻辑,提高代码可维护性。通过合理的数据查询和页面渲染,能够提供用户友好的浏览体验。结合提供的`example`和`doc`文件,你可以更深入地...

Global site tag (gtag.js) - Google Analytics