2010-02-24 10 views
5

decir que tengo mi costumbre taglib:JSP propias Taglib: Evaluación anidada

<%@ taglib uri="http://foo.bar/mytaglib" prefix="mytaglib"%> 
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%> 

<mytaglib:doSomething> 
    Test 
</mytaglib:doSomething> 

Dentro de la clase taglib que necesito para procesar una plantilla y decirle al JSP para volver a evaluar su salida, así que por ejemplo si tengo esto:

public class MyTaglib extends SimpleTagSupport { 

    @Override public void doTag() throws JspException, IOException { 
    getJspContext().getOut().println("<c:out value=\"My enclosed tag\"/>"); 
    getJspBody().invoke(null); 
    } 
} 

La salida que tengo es:

<c:out value="My enclosed tag"/> 
Test 

Cuando realmente se necesita para dar salida a esto:

My enclosed tag 
Test 

¿Es esto factible? ¿Cómo?

Gracias.

+0

bien, después de salir de esta pregunta por un tiempo sin respuesta definitiva e investigando el problema mismo, la conclusión es que la cuenta no es posible. Aclamaciones. –

Respuesta

2

Tiago, no sé cómo resolver su problema exacto pero puede interpretar el código JSP de un archivo. Basta con crear un RequestDispatcher e incluyen la JSP:

public int doStartTag() throws JspException { 
    ServletRequest request = pageContext.getRequest(); 
    ServletResponse response = pageContext.getResponse(); 

    RequestDispatcher disp = request.getRequestDispatcher("/test.jsp"); 
    try { 
     disp.include(request, response); 
    } catch (ServletException e) { 
     throw new JspException(e); 
    } catch (IOException e) { 
     throw new JspException(e); 
    } 
    return super.doStartTag(); 
} 

Probé este código en un portlet Liferay, pero creo que debería funcionar en otros contextos de todos modos. Si no lo hacen, me gustaría saber :)

HTH

+0

Realmente no he probado esto porque en algún momento los requisitos han cambiado y ya no tengo que resolver este problema en particular, así que acepto su solución ya que fue la mejor respuesta y la ha probado usted mismo. Gracias :) –

1

lo que realmente necesita tener es la siguiente:

<mytaglib:doSomething> 
    <c:out value="My enclosed tag"/> 
    Test 
</mytaglib:doSomething> 

y cambiar su doTag a algo como esto

@Override public void doTag() throws JspException, IOException { 
try { 
    BodyContent bc = getBodyContent(); 
    String body = bc.getString(); 
    // do something to the body here. 
    JspWriter out = bc.getEnclosingWriter(); 
    if(body != null) { 
    out.print(buff.toString()); 
    } 
} catch(IOException ioe) { 
    throw new JspException("Error: "+ioe.getMessage()); 
} 
} 

asegúrese de que el contenido del cuerpo JSP se establece en JSP en el TLD:

<bodycontent>JSP</bodycontent> 
+0

Anidar el taglib directamente en el JSP no es una opción, ya que lo generaré dinámicamente desde una biblioteca de terceros, por ejemplo. –

0

¿Por qué escribe una etiqueta JSTL dentro de su método doTag? La impresión va directamente al JSP compilado (léase: servlet). Cuando se procesa en el navegador, se imprimirá tal como está, ya que el navegador no comprende las etiquetas JSTL.

public class MyTaglib extends SimpleTagSupport { 
     @Override public void doTag() throws JspException, IOException { 
     getJspContext().getOut().println("My enclosed tag"); 
     getJspBody().invoke(null); 
     } 
    } 

Opcionalmente, puede agregar etiquetas HTML a la cadena.

+1

Porque tal etiqueta JSTL vendría de una evaluación de plantilla de un tercero. –

Cuestiones relacionadas