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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top