`

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

阅读更多
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.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 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

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
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
/*
 * 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 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
<%@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>

分享到:
评论
1 楼 hilliate 2009-09-10  
第一步,把冰箱门打开
第二步,把大象装进去
第三步,把冰箱门关上

呵呵

相关推荐

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

    总之,Struts2自定义标签提供了一种灵活的方式,使得开发者能够在JSP页面中方便地实现分页效果。通过自定义标签,我们可以将复杂的分页逻辑封装起来,使得前端展示更加简洁,同时提高了代码的可维护性和复用性。结合...

    自定义struts2标签

    2. **实现标签逻辑**:在自定义标签类中,我们可以覆盖父类的方法来实现自己的业务逻辑。例如,`doStartTag()`方法用于标签的开始,`doEndTag()`方法处理标签结束,`release()`方法用于清理资源。 3. **定义标签...

    struts2标签使用方法

    Struts2 标签库可以分为三大类:UI 标签、非 UI 标签和 Ajax 标签。 UI 标签 UI 标签主要用于生成 HTML 元素标签,UI 标签又可分为表单标签和非表单标签。UI 标签用于生成 HTML 元素标签,例如生成文本框、下拉框...

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

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

    struts中自定义的tag的Java类中如何获得session

    在Struts中实现自定义标签主要分为两步: 1. **编写标签处理器类**:这是一个Java类,该类通常继承自`javax.servlet.jsp.tagext.TagSupport`或`javax.servlet.jsp.tagext.SimpleTagSupport`。 2. **编写标签库描述符...

    Struts2标签与开发手册

    Struts2是一个强大的Java web应用程序框架,它极大地简化了MVC(模型-视图-控制器)架构的实现。Struts2的核心是Action类,而标签库则是其提供给开发者进行视图层构建的重要工具,提高了代码的可读性和可维护性。本...

    struts2简单例子

    MVC模式是软件设计中的一个经典模式,它将应用逻辑分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。在Struts2中,模型负责业务逻辑,视图负责展示数据,而控制器接收用户请求并协调模型和...

    struts2 jar包 包含 标签

    在Struts2框架中,标签库是其核心功能之一,它提供了一系列的自定义标签,使得开发者能够在JSP页面上更方便地进行视图层的构建,而无需过多地编写Java脚本或HTML代码。 1. **Struts2标签库介绍** Struts2的标签库...

    struts2标签的解释

    Struts2标签库主要分为以下几类: - Control Tags:用于控制流程,如`s:if`, `s:iterate`等。 - Data Tags:用于显示数据,如`s:textfield`, `s:textarea`, `s:checkbox`, `s:radio`等。 - Form Tags:用于创建HTML...

    struts2的自定义校验器例子

    在Struts2中,数据验证分为两种类型:客户端验证和服务器端验证。客户端验证通常通过JavaScript在用户浏览器中进行,而服务器端验证则在服务器上执行,确保即使禁用JavaScript也能保证数据安全。本示例主要关注...

    Struts2自定义拦截器实现防止重复提交

    Struts2默认提供了一些拦截器来帮助处理这个问题,但如题目所述,由于性能考虑,项目组决定不使用Struts2的标签,因此需要自定义拦截器来实现防止重复提交的功能。 自定义拦截器的实现主要分为以下几个步骤: 1. *...

    struts2标签详解与实例

    这些标签分为两类:核心标签和主题标签。核心标签主要处理表单、控制流程和显示数据,而主题标签则负责渲染视图,提供多种样式和布局。 二、Struts2核心标签 1. `&lt;s:property&gt;`:用于显示Java对象的属性值,如`&lt;s:...

    struts2教程+struts标签中文API

    1. **MVC模式**:Struts2基于MVC设计模式,它将应用程序分为模型、视图和控制器三个部分,使得代码结构清晰,易于维护。 2. **Action类**:在Struts2中,Action类是业务逻辑的载体,处理用户请求并返回结果。每个...

    JSP Struts之HTML标签库详解

    `id`定义了自定义标签的脚本变量名,`name`和`scope`用于定位和访问JavaBeans,`property`用于指定bean中的特定属性。此外,Struts标签支持嵌套引用,使得处理复杂的对象结构变得简单。 **使用注意事项** 使用...

    Struts2 标签库

    Struts2标签库的通用标签主要分为三类: - 控制标签:用于控制程序的执行流程,如条件控制的if/else、循环控制的iterator等。 - 数据标签:用于数据的存取和国际化支持,比如bean、push、i18n等。 - 表单标签:用于...

    struts2标签写法

    首先,Struts2的标签库分为核心标签库和OGNL标签库。核心标签库主要处理控制器和视图之间的交互,而OGNL标签库则提供了对Object-Graph Navigation Language (OGNL)表达式的支持,使得在JSP页面上可以直接操作模型...

    struts2-s标签

    在 Struts 1.x 中,标签库主要分为四大类:`html`、`bean`、`logic`、`tiles`。而在 Struts2 中,所有的标签都被统一管理,并通过在 JSP 文件头部声明 `&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;` 来启用 Struts...

    struts2标签详解

    Struts2框架的标签库主要分为三类:核心标签(Core Tags)、展示标签(Display Tags)和表单标签(Form Tags)。这些标签都是基于OGNL(Object-Graph Navigation Language)表达式语言,能够与Action类中的属性进行...

    struts标签中文文档

    5. "taglib1"可能是一个自定义的标签库,扩展了Struts的默认标签,或者包含特定项目的自定义标签。 总的来说,"struts标签中文文档"提供了全面的Struts标签使用指南,帮助开发者更好地理解和应用Struts框架,从而...

Global site tag (gtag.js) - Google Analytics