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.

War es hilfreich?

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top