Personalizado incrustado-etiqueta de contenido dinámico (etiqueta anidada) no de representación

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Personalizado incrustado-etiqueta de contenido dinámico (etiqueta anidada) no de representación.

Tengo una página que tira de contenido dinámico a partir de un javabean y pasa a la lista de objetos a una etiqueta personalizada para el procesamiento en html.Dentro de cada objeto es un montón de html a ser de salida que contiene una segunda etiqueta personalizada que me gustaría también ser prestados.El problema es que la invocación de la etiqueta se representa como texto sin formato.

Un ejemplo podría servir de mí mejor.

1 Tire de la información de una base de datos y volver a la página a través de un javabean.Enviar esta información a una etiqueta personalizada para la salida.

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

esta etiqueta debe salida de un cuadro de div como así

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

Esto hace que la multa y como se esperaba

<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, en el ejemplo anterior, por ejemplo, tengo una etiqueta personalizada en el importantNotice.getMessage() Cadena:

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

El aviso importante hace bien, pero la cita de la etiqueta no será procesada y simplemente inserta en la cadena y poner como texto sin formato de etiqueta de 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>

En lugar de

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

Sé que esto tiene que ver con los procesadores y los pre-procesadores, pero no estoy seguro sobre cómo hacer este trabajo.

¿Fue útil?

Solución

Sólo el uso de

<bodycontent>JSP</bodycontent>

no es suficiente.Usted debe hacer soimething como

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

para obtener interior etiquetas prestados (el ejemplo es para SimpleTag doTag método).

Sin embargo, en la cuestión del código veo que el interior de la etiqueta es viniendo de una cadena que no está representado como una parte de JSP, pero sólo algunos cadena aleatoria.Creo que no se puede forzar JSP traductor para analizarlo.

Usted puede utilizar regexp en su caso o intentar rediseñar el código en una manera de tener un jsp como este:

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

I se debe ir con regexp.

Otros consejos

Yo estaría inclinado a cambio de la "arquitectura de su etiquetado" en la que los datos que se desea lograr no debe ser por la etiqueta en el interior de la clase, ya que es "marcado", diseñado para una página(aunque en la oscuridad es posible obtener la evaluación del programa hilo de la JSP Servlet engine).

Lo que usted probablemente encontrará mejor y más dentro de los estándares de procedimiento sería el uso de "cooperación etiquetas" con BodyTagSupport extensión de la clase y retorno EVAL_BODY_BUFFERED en doStartTag() método para repetir el proceso el cuerpo y/o objeto de intercambio, tales como el almacenamiento retrived de datos en la aplicación de la jerarquía de la sesión o en la sesión para el usuario.

Ver oracle j2ee etiquetas personalizadas tutorial para obtener más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top