Balise personnalisée intégrée dans le contenu dynamique (balise imbriquée) non rendue

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

  •  09-06-2019
  •  | 
  •  

Question

Balise personnalisée intégrée dans le contenu dynamique (balise imbriquée) sans rendu.

J'ai une page qui extrait le contenu dynamique d'un javabean et transmet la liste des objets à une balise personnalisée pour le traitement en HTML.Dans chaque objet se trouve un ensemble de fichiers HTML à afficher contenant une deuxième balise personnalisée que j'aimerais également afficher.Le problème est que l'invocation de la balise est rendue sous forme de texte brut.

Un exemple pourrait mieux me servir.

1 Extrayez les informations d'une base de données et renvoyez-les à la page via un javabean.Envoyez ces informations à une balise personnalisée pour la sortie.

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

cette balise devrait générer une boîte div comme ceci

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

Cela rend bien et comme prévu

<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 Si, par exemple, dans l'exemple ci-dessus, je devais avoir une balise personnalisée dans la chaîne importantNotice.getMessage() :

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

L'avis important s'affiche correctement, mais la balise quote ne sera pas traitée et simplement insérée dans la chaîne et placée sous forme de balise texte brut/html.

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

Plutôt que

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

Je sais que cela a à voir avec les processeurs et les pré-processeurs, mais je ne sais pas comment faire fonctionner cela.

Était-ce utile?

La solution

Juste en utilisant

<bodycontent>JSP</bodycontent>

n'est pas assez.Tu devrais faire quelque chose comme

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

pour obtenir le rendu des balises internes (par exemple pour la méthode SimpleTag doTag).

Cependant, dans le code de la question, je vois que la balise interne provient d'une chaîne qui n'est pas rendue dans le cadre de JSP, mais juste d'une chaîne aléatoire.Je ne pense pas que vous puissiez forcer le traducteur JSP à l'analyser.

Vous pouvez utiliser une expression rationnelle dans votre cas ou essayer de repenser votre code de manière à avoir un jsp comme celui-ci :

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

Je préférerais utiliser l'expression rationnelle.

Autres conseils

Je serais enclin à changer "l'architecture de votre balisage" en ce sens que les données que vous souhaitez obtenir ne doivent pas être par balise à l'intérieur de la classe car il s'agit d'un "balisage" conçu pour une page (bien que dans l'obscurité il est possible d'obtenir le thread du programme d'évaluation du moteur de servlet JSP).

Ce que vous trouveriez probablement de mieux en plus dans la procédure standard serait d'utiliser des "balises coopératives" avec BodyTagSupport extension de classe et retour EVAL_BODY_BUFFERED dans la méthode doStartTag() pour répéter le processus du corps et/ou partage d'objets tel que le stockage des données récupérées dans la hiérarchie d'application de la session ou sur la session pour l'utilisateur.

Voir tutoriel sur les balises personnalisées Oracle J2ee pour plus d'informations.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top