2011-11-01 14 views
10

मैं एक कस्टम जेएसपी टैग लिखना चाहता हूं जिसके आउटपुट में अन्य जेएसपी टैग शामिल हैं जिन्हें स्वयं भी गतिशील रूप से मूल्यांकन किया जाना चाहिए। लेकिन स्पष्ट रूप से सब कुछ है कि मेरे TagSupport सबक्लास pageContext.getOut() पर लिखता है, बिना किसी और मूल्यांकन के सीधे ग्राहक के पास जाता है।मैं एक कस्टम जेएसपी टैग कैसे बना सकता हूं जो अन्य जेएसपी टैग का उपयोग करता है?

मुझे लगता है कि यह बहुत आसान होना चाहिए, क्योंकि ऐसा लगता है कि यह पहली चीजों में से एक जैसा है जो कस्टम टैग का उपयोग करना चाहता है: कोड डुप्लिकेशंस से परहेज करते हुए अन्य कस्टम टैग को एन्सेप्लेटिंग और पुन: उपयोग करना। मेरी विशेष उपयोग के मामले पर कुछ पृष्ठभूमि है, अगर यह मदद करता है:

कैसे मैं निम्नलिखित कोड करते हैं यह स्पष्ट रूप से करने के लिए ?:

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/कस्टम-जेएसपी-टैग-कैसे-करें-i-get-the-body-of-tag –

उत्तर

5

आप अपनी कक्षाओं को टैग क्लास और tagRenderer कक्षा में विभाजित कर सकते हैं।

आपकी स्थिति में CommentTagRenderer और UserTagRenderer नामक दो नई कक्षाएं होंगी।

यहाँ यहाँ नया 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; 
    } 

का एक उदाहरण है और 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

सबसे आसान तरीका है एक JSP टैग फ़ाइल के रूप में अपने custome टैग लिखने के लिए है, न कि है का एक उदाहरण है जावा की तुलना में इस तरह, नया टैग आसानी से अन्य कस्टम टैग का उपयोग कर सकते हैं।/वेब-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

यह जानना अच्छा है, हालांकि मैंने अपने प्रश्न में उल्लेख करने की उपेक्षा की कि टैग फाइलों का उपयोग करना मेरे विशेष मामले में एक विकल्प नहीं था (मैं वास्तव में एक बड़ी, पूर्व-मौजूदा परियोजना में सुविधाओं को जोड़ रहा हूं जिसे पुराने पर चलाना है टैग फ़ाइल समर्थन के बिना जेडीके)। हालांकि, मैं आपको वोट दूंगा, क्योंकि यह सामान्य रूप से एक वैध समाधान है! –

संबंधित मुद्दे