Eingebettetes benutzerdefiniertes Tag in dynamischen Inhalten (verschachteltes Tag) wird nicht gerendert

StackOverflow https://stackoverflow.com/questions/49267

  •  09-06-2019
  •  | 
  •  

Frage

Eingebettetes benutzerdefiniertes Tag in dynamischen Inhalten (verschachteltes Tag) wird nicht gerendert.

Ich habe eine Seite, die dynamische Inhalte aus einem Javabean abruft und die Liste der Objekte zur Verarbeitung in HTML an ein benutzerdefiniertes Tag übergibt.In jedem Objekt befindet sich eine Menge auszugebender HTML-Code, der ein zweites benutzerdefiniertes Tag enthält, das ebenfalls gerendert werden soll.Das Problem besteht darin, dass der Tag-Aufruf als Klartext gerendert wird.

Ein Beispiel könnte mir besser dienen.

1 Informationen aus einer Datenbank abrufen und über ein Javabean an die Seite zurückgeben.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>

Dieses Tag sollte ein Box-Div wie folgt ausgeben

*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*

Das wird gut und wie erwartet wiedergegeben

<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 ich im obigen Beispiel beispielsweise ein benutzerdefiniertes Tag in der Zeichenfolge importantNotice.getMessage() hätte:

*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 einwandfrei gerendert, aber das Anführungszeichen-Tag wird nicht verarbeitet und einfach in die Zeichenfolge eingefügt und als Nur-Text-/HTML-Tag abgelegt.

<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ß, dass das mit Prozessoren und Vorprozessoren zu tun hat, bin mir aber nicht sicher, wie ich das zum Laufen bringen soll.

War es hilfreich?

Lösung

Einfach benutzen

<bodycontent>JSP</bodycontent>

ist nicht genug.Du solltest so etwas wie tun

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 zu bekommen (Beispiel ist die SimpleTag-doTag-Methode).

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

Sie können in Ihrem Fall regexp verwenden oder versuchen, Ihren Code so umzugestalten, dass ein JSP wie folgt entsteht:

<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 würde mich für Regexp entscheiden.

Andere Tipps

Ich wäre geneigt, die „Architektur Ihres Taggings“ dahingehend zu ändern, dass die Daten, die Sie erreichen möchten, nicht per Tag innerhalb der Klasse erfolgen sollten, da es sich um ein „Markup“ handelt, das für eine Seite entwickelt wurde(wenn auch im Dunkeln Es ist möglich, den auswertenden Programmthread der JSP-Servlet-Engine abzurufen.

Was Sie wahrscheinlich besser und innerhalb des Standardverfahrens finden würden, wäre die Verwendung von „kooperierenden Tags“ mit BodyTagSupport Klassenverlängerung und -rückkehr EVAL_BODY_BUFFERED in der doStartTag()-Methode, um den Textkörper zu wiederholen und/oder Objektfreigabe, z. B. das Speichern abgerufener Daten in der Anwendungshierarchie der Sitzung oder in der Sitzung für den Benutzer.

Sehen Tutorial zu benutzerdefinierten Oracle-J2ee-Tags für mehr Informationen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top