2011-11-01 4 views
10

カスタムJSPタグを記述したいと思います。その出力には、動的に評価されるべき他のJSPタグも含まれています。しかし、明らかに私のTagSupportサブクラスがpageContext.getOut()に書き込むすべてのものは、それ以上の評価なしにクライアントにまっすぐに行く。他のJSPタグを使用するカスタムJSPタグを作成するにはどうすればよいですか?

これは、非常に簡単なものであると感じています。他のカスタムタグをカプセル化して再利用し、コードの重複を避けるために、カスタムタグを使用したいと思う最初のもののようです。私の特定のユースケースのいくつかの背景、それは場合に役立ちます:

どのように私は、次のコードを作るのですが、それは明らかに?:

public class MyTag extends TagSupport { 
    public int doStartTag() throws JspException { 
     try { 
      pageContext.getOut().println(
       "The output from this tag includes other tags " + 
       "like <mypackage:myOtherTag>this one</mypackage:myOtherTag> " + 
       "which should themselves be evaluated and rendered." 
      ) 
     } catch (IOException e) { 
      throw new JspException(e); 
     } 
     return SKIP_BODY; 
    } 
} 

編集をしたいものを行います。私はカスタムタグ<user>を持っていて、私のアプリケーション(姓、名字、電話番号などのマウス・ホバー)に便利な方法でユーザー名を動的にレンダリングします。ユーザーのコメントを表示するために別のタグ<comment>を作成しています。<comment>タグの出力でユーザー名を表示するために、既存の<user>タグを使用したいと考えています。

+0

をこれは役立つはず:http://stackoverflow.com/を質問/ 2502282/custom-jsp-tag-do-do-the-get-the-tag-of-the-tag –

答えて

5

クラスをタグクラスとtagRendererクラスに分割できます。

CommentTagRendererUserTagRendererという2つの新しいクラスがあります。ここで

は新しいCommentTag

public int doStartTag() throws JspException { 
    JspWriter out = pageContext.getOut(); 
    Comment comment = getComment(); 
    User user = getUser(); 

    CommentTagRenderer commentRenderer = new CommentTagRenderer(out); 
    UserTagRenderer userRenderer = new UserTagRenderer(out); 

    try { 
     commentRenderer.renderComment(comment); 
     userRenderer.renderUser(user);   
    } catch (IOException e) { 
     //some error handling 
    } 
    return SKIP_BODY; 
    } 

の一例であり、ここでは最も簡単な方法ではなく、JSPタグ・ファイルとして、カスタマーのタグを記述することであるCommentTagRenderer

private Writer out; 
public CommentTagRenderer(Writer out) { 
    this.out = out; 
} 

public void renderComment(Comment comment) throws IOException { 
    out.write("<div>"); 
    out.write(comment.getComment()); 
    out.write("</div>"); 
} 
+0

私は同様のことをやってしまった - タグ自体が出力を生成するのに使ったgetHTML()メソッド他のタグは同じ出力を独自の出力に埋め込むために使用できます。私は本当に他の方法はないことを知って良いと思う(タグファイルに入ることなく)。 –

14

の一例ですJavaよりも。このようにして、新しいタグは他のカスタムタグを簡単に使用できます。/WEB-INF /タグでファイルmyTag.tagを作成し、次のコードを使用します。

<%@ tag %> 
<%@ attribute name="value" required="true" rtexprvalue="true" type="java.lang.String"%> 
<%@ taglib prefix="mypackage" uri="mypackage.tld" %> 
The output from this tag includes other tags 
like <mypackage:myOtherTag>${value}</mypackage:myOtherTag> 
which should themselves be evaluated and rendered. 

にタグファイルについての詳しい情報はこちら:http://docs.oracle.com/javaee/1.4/tutorial/doc/JSPTags5.html

+0

これは知っておきたいことですが、タグファイルを使用することは私の特定のケースでは選択肢ではなかったと私の質問では言及しませんでしたが(私は実際には、タグファイルをサポートしないJDK)。しかし、これは一般的に有効な解決策であるため、私はあなたに投票します! –

関連する問題