2008-09-08 10 views
0

Eingebettetes benutzerdefiniertes Tag in dynamischem Inhalt (verschachteltes Tag) wird nicht gerendert.Eingebettetes benutzerdefiniertes Tag in dynamischem Inhalt (verschachteltes Tag), das nicht rendert

Ich habe eine Seite, die dynamischen Inhalt aus einem Javabean zieht und die Liste der Objekte an ein benutzerdefiniertes Tag zur Verarbeitung in HTML übergibt. Innerhalb jedes Objekts wird eine Menge HTML ausgegeben, die ein zweites benutzerdefiniertes Tag enthält, das auch gerendert werden soll. Das Problem besteht darin, dass der Tag-Aufruf als Klartext wiedergegeben wird.

Ein Beispiel könnte mir besser dienen.

1 Ziehen Sie Informationen aus einer Datenbank und geben Sie sie über eine Javabean an die Seite zurück. Senden Sie diese Informationen zur Ausgabe an ein benutzerdefiniertes Tag.

<jsp:useBean id="ImportantNoticeBean" scope="page" class="com.mysite.beans.ImportantNoticeProcessBean"/> <%-- Declare the bean --%> 
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}"> <%-- Get the info --%> 
    <mysite:notice importantNotice="${noticeBean}"/> <%-- give it to the tag for processing --%> 
</c:forEach> 

diesen Tag ausgeben soll ein Kasten div wie so

*SNIP* class for custom tag def and method setup etc 
out.println("<div class=\"importantNotice\">"); 
out.println(" " + importantNotice.getMessage()); 
out.println(" <div class=\"importantnoticedates\">Posted: " + importantNotice.getDateFrom() + " End: " + importantNotice.getDateTo()</div>"); 
out.println(" <div class=\"noticeAuthor\">- " + importantNotice.getAuthor() + "</div>"); 
out.println("</div>"); 
*SNIP* 

Dies macht feines und erwartete als

<div class="importantNotice"> 
    <p>This is a very important message. Everyone should pay attenton to it.</p> 
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div> 
    <div class="noticeAuthor">- The author</div> 
</div> 

2 Wenn in dem obigen Beispiel, zum Beispiel, ich war zu have ein benutzerdefiniertes Tag in der withoutNotice.getMessage() String:

*SNIP* "This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote>" *SNIP* 

Der wichtige Hinweis wird gut dargestellt, aber das Zitat-Tag wird nicht verarbeitet und einfach in die Zeichenfolge eingefügt und als einfacher Text/HTML-Tag eingefügt.

<div class="importantNotice"> 
    <p>This is a very important message. Everyone should pay attenton to it. <mysite:quote author="Some Guy">Quote this</mysite:quote></p> 
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div> 
    <div class="noticeAuthor">- The author</div> 
</div> 

Statt

<div class="importantNotice"> 
    <p>This is a very important message. Everyone should pay attenton to it. <div class="quote">Quote this <span class="authorofquote">Some Guy</span></div></p> // or wahtever I choose as the output 
    <div class="importantnoticedates">Posted: 2008-09-08 End: 2008-09-08</div> 
    <div class="noticeAuthor">- The author</div> 
</div> 

Ich weiß, das mit Prozessoren und Pre-Prozessoren zu tun hat, aber ich bin nicht darüber sicher, wie diese Arbeit zu machen.

Antwort

1

Gerade

<bodycontent>JSP</bodycontent> 

verwendet, ist nicht genug. Sie sollten Soimething wie

JspFragment body = getJspBody(); 
StringWriter stringWriter = new StringWriter(); 
StringBuffer buff = stringWriter.getBuffer(); 
buff.append("<h1>"); 
body.invoke(stringWriter); 
buff.append("</h1>"); 
out.println(stringWriter); 

, um innere Tags gerendert bekommen (Beispiel ist für SimpleTag DoTag-Methode).

Im Code der Frage sehe ich jedoch, dass innere Tag stammt aus einer Zeichenfolge, die nicht als Teil der JSP gerendert wird, sondern nur einige zufällige Zeichenfolge. Ich glaube nicht, dass Sie JSP-Übersetzer zwingen können, es zu analysieren.

Sie können regexp in Ihrem Fall verwenden oder versuchen, Ihren Code in einer Weise neu zu gestalten ein jsp wie diese haben:

<jsp:useBean id="ImportantNoticeBean" scope="page class="com.mysite.beans.ImportantNoticeProcessBean"/> 
<c:forEach var="noticeBean" items="${ImportantNoticeBean.importantNotices}"> 
    <mysite:notice importantNotice="${noticeBean}"> 
     <mysite:quote author="Some Guy">Quote this</mysite:quote> 
     <mysite:messagebody author="Some Guy" /> 
    </mysite:notice> 
</c:forEach> 

ich mit regexp gehen whould.

0

Ich würde geneigt sein, die "Architektur Ihrer Tagging" zu ändern, in dem die Daten, die Sie erreichen möchten, nicht durch Tag auf der Innenseite der Klasse sein sollte, wie es "Markup" für eine Seite () ist obscurity ist es möglich, den auswertenden Programm-Thread der JSP-Servlet-Engine zu bekommen).

Was würden Sie wahrscheinlich besser und im Standardverfahren finden würde mit „kooperierende Tags“ mit BodyTagSupport Klassenerweiterung und zurück EVAL_BODY_BUFFERED in doStartTag() -Methode zu wiederholen, um den Körper zu verarbeiten und/oder Objekt teilt wie Speicher retrived Daten in der Anwendungshierarchie der Sitzung oder auf der Sitzung für den Benutzer.

Weitere Informationen finden Sie unter oracle j2ee custom tags tutorial.