2010-09-30 106 views
4

如何扩展现有的JSP自定义标签?扩展JSP自定义标签

如您所知,自定义标签由两部分组成,一个实现类和一个TLD文件。我可以扩展父定制标记的类,但是如何“扩展”其TLD文件?一个明显的解决方案是剪切并粘贴它,然后添加我的东西,但是我想知道是否有像Apache Tile中扩展tile定义那样的更优雅的解决方案。

谢谢。

+1

剪切和粘贴是我知道这样做的唯一方法。 – DwB 2010-09-30 19:39:11

+0

是否有理由不能将您的标记定义添加到您正在扩展的TLD中? – Snekse 2010-09-30 22:27:31

+0

你不想直接从一个开源项目中修改某个类,而是将它扩展到customzie中,这是同样的原因......你想保持原来的状态。 – 2010-09-30 22:37:11

回答

2

我不认为你可以扩展现有的标签,但类似的方法是使用一个共同的抽象超两个标签实现类:

// define repetitive stuff in abstract class 
public abstract class TextConverterTag extends TagSupport{ 

    private final long serialVersionUID = 1L; 
    private String text; 

    public String getText(){ 
     return text; 
    } 

    public void setText(final String text){ 
     this.text = text; 
    } 

    @Override 
    public final int doStartTag() throws JspException{ 
     if(text != null){ 
      try{ 
       pageContext.getOut().append(process(text)); 
      } catch(final IOException e){ 
       throw new JspException(e); 
      } 
     } 
     return TagSupport.SKIP_BODY; 
    } 

    protected abstract CharSequence process(String input); 

} 

// implementing class defines core functionality only 
public class UpperCaseConverter extends TextConverterTag{ 
    private final long serialVersionUID = 1L; 

    @Override 
    protected CharSequence process(final String input){ 
     return input.toUpperCase(); 
    } 
} 

// implementing class defines core functionality only 
public class LowerCaseConverter extends TextConverterTag{ 
    private final long serialVersionUID = 1L; 

    @Override 
    protected CharSequence process(final String input){ 
     return input.toLowerCase(); 
    } 
} 

但我怕你将不得不配置每个标签类分开,因为我认为taglibs中没有抽象标签定义。