JSP Custom Taglib: verschachtelte Bewertung
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.
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.