将tld写入新标签

时间:2013-07-11 12:38:52

标签: java-ee struts2 taglib

我正在使用Struts2来创建我的Web应用程序,但是我在使用Struts2定制标记时遇到了问题。

我想在锚标签中添加一个属性,我已经创建了这样做的类。但我不知道如何整合它。我想我必须创建一个tld,但我不知道是否必须使用整个struts-tags.tld 我只想覆盖这个tld,但我不知道如何。

1 个答案:

答案 0 :(得分:0)

这是我的Anchor.java:

package com.mycompany.struts.components;

import java.util.UUID;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.views.annotations.StrutsTag;
import org.apache.struts2.views.annotations.StrutsTagAttribute;

import com.opensymphony.xwork2.util.ValueStack;

@StrutsTag(name = "anchor",
tldTagClass = "com.mycompany.struts.components.AnchorTag",
description = "Render an anchor",
allowDynamicAttributes = true)
public class Anchor extends org.apache.struts2.components.Anchor {

    protected String token;

    public Anchor(ValueStack stack, HttpServletRequest request,
                                HttpServletResponse response) {
        super(stack, request, response);
    }

    protected void evaluateExtraParams() {
        super.evaluateExtraParams();
        if (token != null && (Boolean) findValue(token, Boolean.class)) {
            String uuid = String.valueOf(UUID.randomUUID());
            urlParameters.put("idToken", uuid);
            if(onclick == null) onclick = "";
            else if(onclick.trim().length() > 0 && onclick.trim().charAt(onclick.trim().length()-1) != ';') {
                onclick += "; ";
            }
            else {
                onclick += " ";
            }
            onclick += "tokenizedURL('"+uuid+"');";
        }
    }

    @StrutsTagAttribute(description = "Token", type = "Boolean", defaultValue = "false")
    public void setToken(String token) {
        this.token = token;
    }
}

这是我的AnchorTag.java:

package com.mycompany.struts.components;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;

import com.opensymphony.xwork2.util.ValueStack;

public class AnchorTag extends org.apache.struts2.views.jsp.ui.AnchorTag {
private static final long serialVersionUID = 5811285953670562288L;

protected String token; 

public Component getBean(ValueStack stack, HttpServletRequest req,
                         HttpServletResponse res) {
    return new Anchor(stack, req, res);
}

protected void populateParams() {
    super.populateParams();
    Anchor anchor = ((Anchor) component);
    anchor.setToken(token);
  }
  public void setToken(String token) {
    this.token = token;
  }
}

这是我的a-close.ftl:

<#--
/*
 * ...
 */
-->
<a<#rt/>
<#if parameters.id?if_exists != "">
 id="${parameters.id?html}"<#rt/>
</#if>
<#if parameters.href?if_exists != "">
 href="${parameters.href}"<#rt/>
</#if>
<#if parameters.tabindex??>
 tabindex="${parameters.tabindex?html}"<#rt/>
</#if>
<#if parameters.cssClass??>
 class="${parameters.cssClass?html}"<#rt/>
</#if>
<#if parameters.cssStyle??>
 style="${parameters.cssStyle?html}"<#rt/>
</#if>
<#if parameters.title??>
 title="${parameters.title?html}"<#rt/>
</#if>
<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />
<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />
<#include "/${parameters.templateDir}/simple/dynamic-attributes.ftl" />
>${parameters.body}</a>