Frage

Sagen Sie, ich habe meinen benutzerdefinierten Taglib:

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

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

In der Taglib-Klasse muss ich eine Vorlage verarbeiten und dem JSP sagen, dass er seine Ausgabe neu bewerten soll. Wenn ich dies beispielsweise habe:

public class MyTaglib extends SimpleTagSupport {

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

Die Ausgabe, die ich habe, ist:

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

Wenn ich tatsächlich dies ausgeben muss:

My enclosed tag
Test

Ist das machbar? Wie?

Vielen Dank.

War es hilfreich?

Lösung

Tiago, ich weiß nicht, wie ich Ihre lösen soll genau Problem, aber Sie können den JSP -Code aus einer Datei interpretieren. Erstellen Sie einfach einen RequestDispatcher und schließen Sie den JSP ein:

    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();
}

Ich habe diesen Code in einem Liferay -Portlet getestet, aber ich glaube, er sollte in anderen Kontexten trotzdem funktionieren. Wenn dies nicht der Fall ist, würde ich gerne wissen :)

HTH

Andere Tipps

Was Sie wirklich haben müssen, ist Folgendes:

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

und ändern Sie Ihren Dotag in so etwas

@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());
 }
}

Stellen Sie sicher, dass der JSP -Körperinhalt in der TLD auf JSP eingestellt ist:

<bodycontent>JSP</bodycontent>

Warum schreiben Sie ein JSTL -Tag in Ihre Dotag -Methode? Das Println geht direkt in den kompilierten JSP (Read: Servlet) ein, wenn dies im Browser gerendert wird, wie er so gedruckt wird, da der Browser JSTL -Tags nicht versteht.

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

Sie können der Zeichenfolge optional HTML -Tags hinzufügen.

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