2009-07-25 6 views
1

Je veux afficher la valeur du corps de JSP dans le nom de balise personnalisée simple du gestionnaire de balises par l'extension de la classe, BodyTagSupport, mais obtenir une exception d'exécution; o)problème dans la gestion de gestionnaire de balises classique

Le code JSP est :

<html><body> 
<%@ taglib prefix="mine" uri="simpleTags" %> 

Advisor page 
<mine:simple> 
Balle Balle 
</mine:simple> 
</html></body> 

et la classe gestionnaire Tag est:

package foo; 

import java.io.*; 
import javax.servlet.jsp.*; 
import javax.servlet.jsp.tagext.*; 

public class SelectTagHandler extends BodyTagSupport 
{ 
public int doStartTag() throws JspException{ 

return EVAL_BODY_BUFFERED; 
} 

public int EndTag() 
{ 
try{ 
pageContext.getOut().print(bodyContent); 
} 
catch(Exception e) 
{ 
} 
return EVAL_PAGE; 
} 

et l'exception, que je reçois est:

type Exception report 

message 

description The server encountered an internal error() that prevented it from fulfilling this request. 

exception 

org.apache.jasper.JasperException: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V 
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:460) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:355) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 

root cause 

javax.servlet.ServletException: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V 
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:841) 
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:774) 
    org.apache.jsp.new_jsp._jspService(new_jsp.java:60) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 

root cause 

java.lang.NoSuchMethodError: foo.SelectTagHandler.setJspContext(Ljavax/servlet/jsp/JspContext;)V 
    org.apache.jsp.new_jsp._jspx_meth_mine_005fsimple_005f0(new_jsp.java:73) 
    org.apache.jsp.new_jsp._jspService(new_jsp.java:51) 
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331) 
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329) 
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.27 logs. 

Edit: Le code de mon fichier TLD est:

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 

<tlib-version>1.2</tlib-version> 
<uri>simpleTags</uri> 
<tag> 
<name>simple</name> 
<tag-class>foo.SelectTagHandler</tag-class> 
<body-content>scriptless</body-content> 
</tag> 
</taglib> 

Quel est le problème que je fais ici?

+0

Juste une intuition, mais essayez de définir le corps contenu à « JSP » au lieu de « Merci – skaffman

+0

» sans script, il est maintenant fonctionne bien, et en retournant la sortie en page « Conseiller org.apache .jasper.runtime.BodyContentImpl @ 7be8c2 "au lieu de" Balle Balle ". Pourquoi? –

Répondre

1

setJspContext s'applique uniquement à SimpleTag et SimpleTagSupport, pas BodyTag (ne me demandez pas pourquoi). Tomcat traite votre tag en tant que SimpleTag pour une raison quelconque. Le problème peut se trouver dans votre fichier TLD, pouvez-vous modifier votre question pour l'ajouter?

0

Vous imprimez directement sur bodyContent dans votre code:

pageContext.getOut().print(bodyContent); 

bodyContent est pas une chaîne, il est un objet de classe javax.servlet.jsp.tagext.BodyContent et il ne définit pas une méthode appropriée toString() (ni ne doit) à utiliser de cette manière. Vous devriez plutôt obtenir le contenu du corps réel de celui-ci via getString() méthode:

if (bodyContent!=null) { 
    String bodyText = bodyContent.getString(); 
    pageContext.getOut().print(bodyText); // or whatever you want to do with it 
} 
+0

L'exemple ici n'est pas tout à fait correct. Si vous voulez accéder à la sortie de réponse (dans la méthode doAfterTag() dans une balise qui étend BodyTagSupport et où la méthode doStartTag() renvoie EVAL_BODY_BUFFERED), vous devrez faire quelque chose comme bodyContent.getEnclosingWriter(). Write (bodyText); – CodeClimber

0

Il arrive si vous utilisez la version 2.1 Taglib au lieu de 2.0. Changez la version et l'attribut de schéma de taglib-tag dans le fichier tld. Il doit ressembler à ça:

<taglib version="2.0" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
       http://java.sun.com/xml/ns/j2ee 
       http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> 
Questions connexes