JSP.13.8 Beispiel Einfache Tag-Handler-Szenario funktioniert nicht?
Frage
Dieser Test wurde durch das Lese eine Frage auf den Sun Java-Foren und dachte, ich würde es auszuprobieren. Der JSP2.0 Spezifikation Abschnitt JSP.13.8 enthält ein „Beispiel für eine einfachen Tag Handler Szenario“. Ich kopiere und klebte die Codefragmente und versucht es zu laufen.
Umwelt: Apache Tomcat Version 5.5.26 und 6.0.14 (auf beide getestet) Java: 1.5
-Code, mit denen ich zu testen: Jsp Seite:
<%@ taglib prefix="my" tagdir="/WEB-INF/tags" %>
<my:simpletag x="10">
<jsp:attribute name="y">20</jsp:attribute>
<jsp:attribute name="nonfragment">
Nonfragment Template Text
</jsp:attribute>
<jsp:attribute name="frag">
Fragment Template Text ${var1}
</jsp:attribute>
<jsp:body>
Body of tag that defines an AT_BEGIN
scripting variable ${var1}.
</jsp:body>
</my:simpletag>
Und die Tag-Datei:
<%-- /WEB-INF/tags/simpleTag.tag --%>
<%@ attribute name="x" %>
<%@ attribute name="y" %>
<%@ attribute name="nonfragment" %>
<%@ attribute name="frag" fragment="true" %>
<%@ variable name-given="var1" scope="AT_BEGIN" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Some template text.
<c:set var="var1" value="${x+y}"/>
<jsp:invoke fragment="frag" varReader="var1"/>
Invoke the body:
<jsp:doBody/>
Dieser Code wird direkt aus der PDF-Kopie der JSP2.0 Spezifikation kopiert.
Es ist auch als Teil des JSP-API hier
Geringfügige Änderung gemacht - ich änderte den Namen des Tagfile von simpletag.tag zu simpleTag.tag den Aufruf in der JSP übereinstimmen
.
Ich habe auch versucht, aus dem PDF der spec Kopieren (zitiert nach Bedarf eingestellt.) - gleiches Ergebnisses
Wenn ich die Seite ausführen beende ich mit einem Standard-500-Fehler auf Ursache: java.lang.ClassCastException: java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)
Line62 der generierten JSP erweist sich als: var1 = (java.lang.String) _jspx_page_context.findAttribute ( "var1");
Ok, kann ich verstehen Classcast - es denkt, dass var1 ein String sein sollte, und das tatsächliche Attribut ist ein String. Aber warum ist es ein String? Wo hat die Variable erstellt? Und warum versucht es überhaupt diese Zuordnung zu tun?
Kann mir bitte jemand in die richtige Richtung? Was ist falsch mit dem Code / Setup? Ist das ein bekanntes Problem? Ich es gegoogelt, aber konnte nicht scheinen, nichts zu finden.
Danke, evnafets
Bearbeiten mit höherer Auflösung: Der Classcast wurde von der Linie in dem Tag verursacht werden:
<jsp:invoke fragment="frag" varReader="var1"/>
Wie bereits erwähnt hier das varReader Attribut das Attribut gibt zu speichern das Bewertungsergebnis als String. Die Ausnahme wurde von Tomcat generierten Code verursacht versuchen, den Wert von „var1“ abrufen und in eine Zeichenfolge. Als String so kein String ist, es hob eine Ausnahme an diesem Punkt.
Ich bin mir nicht sicher, ob die Codierung Fehler sollten sie die „var“ verwendet haben, anstatt die „varReader“ -Attribut, oder sollten sie haben entweder nicht verwendet und bewertet es genauso ist. Das Entfernen dieses Attribut druckt vollständig das Fragment, und dann der Körper sowohl mit dem Wert von „var1“:
Fragment Vorlage Text 30. Rufen Sie den Körper: Body of-Tag, das eine AT_BEGIN Scripting Variable 30
definiert
Machen Sie das Attribut var = „var1“ führt das Fragment, und speichert das Ergebnis zu var1. Der Körper wird dann mit diesem neuen Wert von var1 ausgewertet ergibt:
Rufen Sie den Körper: Body of-Tag, das ein AT_BEGIN Scripting variable Fragment Vorlage Text 30
definiert
Ich persönlich denke, der erste Fall mehr Sinn macht, aber dieser Code wird als ein Beispiel für die Innerworkings präsentiert, nicht best practice.
Ich würde immer noch das Beispiel erwartet in jedem Fall zu kompilieren / ausführen. Ich war ziemlich überrascht, als es nicht.
Lösung
Von der Syntax Referenz dass entweder var sehen oder varReader ist
Der Name eines scoped Attribut das Ergebnis des Fragments Aufruf speichern in
So habe ich Angst, der Beispielcode einen Fehler enthält. Wenn Sie das Ergebnis von jsp schreiben müssen. Aufrufen direkt auf die Seite Sie es nicht zu einem var zuweisen müssen
können Sie versuchen, die "varReader" -Attribut Weglassen?