JSP personnalisée Taglib: Nested évaluation
Question
Dire que j'ai mon taglib personnalisé:
<%@ taglib uri="http://foo.bar/mytaglib" prefix="mytaglib"%>
<%@ taglib uri="http://java.sun.com/jstl/core" prefix="c"%>
<mytaglib:doSomething>
Test
</mytaglib:doSomething>
Dans la classe taglib je dois traiter un modèle et dire la JSP de réévaluer sa production, donc par exemple si je ceci:
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 sortie est je:
<c:out value="My enclosed tag"/>
Test
Quand je réellement besoin à la sortie suivante:
My enclosed tag
Test
Est-ce possible? Comment?
Merci.
La solution
Tiago, je ne sais pas comment résoudre votre problème exact mais vous pouvez interpréter le code JSP à partir d'un fichier. Il suffit de créer un RequestDispatcher et inclure le 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();
}
Je l'ai testé ce code dans un portlet Liferay, mais je crois que cela devrait fonctionner dans d'autres contextes de toute façon. Si elle ne le font pas, je voudrais savoir:)
HTH
Autres conseils
ce que vous avez vraiment besoin d'avoir est la suivante:
<mytaglib:doSomething>
<c:out value="My enclosed tag"/>
Test
</mytaglib:doSomething>
et changer votre doTag à quelque chose comme ceci
@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());
}
}
assurez-vous que le contenu du corps de jsp est réglé sur jsp dans le tld:
<bodycontent>JSP</bodycontent>
Pourquoi écrivez-vous une balise JSTL dans votre méthode doTag? Le println va directement dans la JSP (lire: servlet) compilé. Lorsque cela se rend dans le navigateur, il sera imprimé comme il est depuis Teh navigateur ne comprend pas les balises JSTL
public class MyTaglib extends SimpleTagSupport {
@Override public void doTag() throws JspException, IOException {
getJspContext().getOut().println("My enclosed tag");
getJspBody().invoke(null);
}
}
Vous pouvez aussi ajouter des balises HTML à la chaîne.