2009-03-09 6 views
0

Dieser Test wurde durch Lesen a question on the Sun java forums ausgelöst und dachte, ich würde es ausprobieren. Der JSP2.0-Spezifikationsabschnitt JSP.13.8 enthält ein "Beispiel für ein einfaches Tag-Handler-Szenario". Ich habe die Codefragmente kopiert und eingefügt und versucht, sie auszuführen.JSP.13.8 Beispiel eines einfachen Tag-Handler-Szenarios funktioniert nicht?

Umwelt: Apache Tomcat Version 5.5.26 und 6.0.14 (auf beide getestet) Java: 1.5

-Code-I-Tests sind mit: 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 den 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 verfügbar als Teil der JSP-API here Geringfügige Änderung vorgenommen - Ich habe den Namen der Tagdatei von SimpleTag.tag zu SimpleTag.tag geändert, um den Aufruf in der JSP zu entsprechen.
Ich habe auch versucht, aus der PDF der Spezifikation zu kopieren (Anpassung der Zitate nach Bedarf) - das gleiche Ergebnis.

Wenn ich führen Sie die Seite, die ich mit einem Standard-500-Fehler Ursachen am Ende: java.lang.ClassCastException: java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)

Zeile62 der generierten JSP stellt sich wie folgt dar: var1 = (java.lang.String) _jspx_page_context.findAttribute ("var1");

Ok, kann ich verstehen Classcast - es denkt, dass var1 ein String sein sollte, und die tatsächliche Attribut ist ein String. Aber warum ist es ein StringReader? Wo wurde die Variable erstellt? Und warum versucht es diese Aufgabe überhaupt?

Kann mir bitte jemand in die richtige Richtung zeigen? Was ist mit dem Code/Setup falsch? Ist das ein bekanntes Problem? Ich habe gegoogelt, konnte aber nichts finden.

Danke, evnafets


Bearbeitung mit höherer Auflösung:

<jsp:invoke fragment="frag" varReader="var1"/> 

Als here das Attribut varReader erwähnt gibt das Attribut zu speichern: Die Classcast durch die Linie in dem Tag verursacht wurde das Evaluierungsergebnis als StringReader. Die Ausnahme wurde durch Tomcat-generierten Code verursacht, der versucht, den Wert von "var1" abzurufen und in einen String umzuwandeln. Da ein String kein StringReader ist, hat er an dieser Stelle eine Ausnahme ausgelöst.

Ich bin mir nicht sicher, ob der Codierungsfehler die Variablen "var" anstelle des Attributs "varReader" verwendet haben sollte, oder sie sollten beide nicht verwendet haben und nur ausgewertet haben, wie es ist. Entfernen dieses Attribut druckt vollständig das Fragment, und dann den Körper sowohl mit dem Wert von „var1“:

Fragmente Vorlage Text 30. Invoke Körper: Body of-Tag, der eine variable scripting AT_BEGIN 30

Making the Attribut var = "var1" führt das Fragment, und speichert das Ergebnis in var1 definiert. Der Körper wird dann mit diesem neuen Wert von var1 ausgewertet ergibt:

den Körper Invoke: Karosserie-Tag, das

Ich persönlich denke, der erste Fall eine AT_BEGIN Scripting variable Fragment Vorlage Text 30

definiert macht mehr Sinn, aber dieser Code wird als ein Beispiel für die inneren Arbeiten, nicht Best Practice vorgestellt.
Ich hätte trotzdem erwartet, dass das Beispiel auf jeden Fall kompiliert/ausgeführt wird. Ich war ziemlich überrascht, als es nicht war.

Antwort

2

Von der syntax reference können Sie sehen, dass entweder var oder varReader ist

Der Name eines scoped Attribut das Ergebnis des Fragments Aufruf zu speichern in

So bin ich der Beispielcode Angst enthält einen Fehler. Wenn Sie das Ergebnis von jsp: direkt auf die Seite schreiben müssen, müssen Sie es nicht einer Variablen zuweisen.

Können Sie versuchen, das Attribut "varReader" auszulassen?

+0

100% korrekt. Wenn Sie das varReader-Attribut weggelassen haben, wurde dieses Problem behoben. Der Code warf dann eine ClassCastException: java.lang.Long. Dieser wird leichter verfolgt/fixiert, da die Addition in der EL-Expression zu einem Long führt. Konvertiert das in eine Zeichenfolge funktionierte. – evnafets