2009-07-25 5 views
1

Ich mag benutzerdefinierten Tag-Namen, den Körper Wert von JSP angezeigt wird durch die Klasse erstreckt, BodyTagSupport, aber eine Laufzeitausnahme bekommen; o)Problem in Laufen Klassischen Tag-Handler

Der Code JSP ist :

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

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

und der Tag-Handler-Klasse ist:

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

und die Ausnahme, die ich erhalte ist:

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: Der Code meiner TLD-Datei ist:

<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> 

Was ist los ich hier tue?

+0

nur eine Ahnung, aber versucht, Körper-Inhalte zu „JSP“ statt „scriptless“ – skaffman

+0

Dank Einstellung, es jetzt funktioniert gut, und die Ausgabe als „Advisor Seite org.apache Rückkehr .jasper.runtime.BodyContentImpl @ 7be8c2 "anstelle von" Advisor-Seite Balle Balle ". Warum? –

Antwort

1

setJspContext gilt nur für SimpleTag und SimpleTagSupport, nicht BodyTag (fragen Sie mich nicht, warum). Tomcat behandelt Ihren Tag aus irgendeinem Grund als SimpleTag. Das Problem kann in Ihrer TLD Datei liegen, können Sie Ihre Frage ändern, um das hinzuzufügen?

0

Sie drucken bodyContent direkt im Code aus:

pageContext.getOut().print(bodyContent); 

bodyContent ist kein String, es ist eine Aufgabe der javax.servlet.jsp.tagext.BodyContent Klasse und es keine geeignete Methode toString() (noch sollte es definieren) so zu verwenden. Sie sollten stattdessen die tatsächliche Körpergehalt von ihm über getString() Verfahren erhalten:

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

Das Beispiel hier ist nicht ganz richtig. Wenn Sie auf die Antwortausgabe (in der doAfterTag() -Methode in einem Tag zugreifen möchten, das BodyTagSupport erweitert und die doStartTag() -Methode EVAL_BODY_BUFFERED zurückgibt), müssen Sie etwas wie bodyContent.getEnclosingWriter() ausführen. Write (bodyText); – CodeClimber

0

Es passiert, wenn Sie Taglib Version 2.1 statt 2.0 verwenden. Ändern Sie das Versions- und Schemaattribut des taglib-Tags in der tld-Datei. Es muss so aussehen:

<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">