2010-03-23 27 views

Respuesta

10

Es complicado porque hay dos mecanismos.

Si está ampliando SimpleTagSupport, obtiene el método getJspBody(). Devuelve un JspFragment que puede invoke(Writer writer) para tener el contenido del cuerpo escrito en el escritor.

Debe usar SimpleTagSupport a menos que tenga un motivo específico para usar BodyTagSupport (como compatibilidad con etiquetas heredadas) ya que es, bueno, más simple.

Si son utilizando etiquetas clásicas, extienda BodyTagSupport y obtenga acceso al método getBodyContent(). Eso te proporciona un objeto BodyContent del que puedes recuperar el contenido del cuerpo.

+0

Gracias, no sabía nada de esa clase, funciona. – Kyle

+1

Vale la pena señalar que un JspFragment es menos potente porque es limitado; debe ser sin script, mientras que BodyContent no está limitado de esta manera. Un BodyContent es, en esencia, como una página JSP interna. – Yoni

5

Para ampliar Brabster's answer, que he usado para escribir el SimpleTagSupport.getJspBody()JspFragment a un interno StringWriter para la inspección y manipulación:

public class CustomTag extends SimpleTagSupport { 
    @Override public void doTag() throws JspException, IOException { 
     final JspWriter jspWriter = getJspContext().getOut(); 
     final StringWriter stringWriter = new StringWriter(); 
     final StringBuffer bodyContent = new StringBuffer(); 

     // Execute the tag's body into an internal writer 
     getJspBody().invoke(stringWriter); 

     // (Do stuff with stringWriter..) 

     bodyContent.append("<div class='custom-div'>"); 
     bodyContent.append(stringWriter.getBuffer()); 
     bodyContent.append("</div>"); 

     // Output to the JSP writer 
     jspWriter.write(bodyContent.toString()); 
    } 
} 

}

6

Si está utilizando una etiqueta personalizada con el enfoque JSP 2.0 , puede hacerlo como:

maquillaje h1.tag

<%@tag description="Make me H1 " pageEncoding="UTF-8"%> 
<h1><jsp:doBody/></h1> 

uso en JSP como:

<%@ taglib prefix="t" tagdir="/WEB-INF/tags"%> 
<t:make-h1>An important head line </t:make-h1> 
Cuestiones relacionadas