2009-03-09 11 views
0

Ce test a été demandé en lisant a question on the Sun java forums et j'ai pensé que je l'essayerais. La section de spécification JSP2.0 JSP.13.8 contient un "Exemple de scénario de gestionnaire de balise simple". J'ai copié et collé les fragments de code et j'ai essayé de l'exécuter.JSP.13.8 Exemple Le scénario de gestionnaire de balise simple ne fonctionne pas?

Environnement: Apache Tomcat Version 5.5.26 et 6.0.14 (testé sur) Java: 1,5

code Je teste avec: la page jsp:

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

Et la balise fichier:

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

Ce code est directement copié à partir de la copie PDF de la spécification JSP2.0.
Il est également disponible dans le cadre de l'API JSP here Modification mineure apportée - J'ai changé le nom du fichier tag de simpletag.tag en simpleTag.tag pour correspondre à son invocation dans la JSP.
J'ai également essayé de copier à partir du PDF de la spécification (en ajustant les citations si nécessaire) - même résultat.

Lorsque j'exécute la page, je finis avec une norme 500 erreur cause racine: java.lang.ClassCastException: java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62) La ligne62 de la JSP générée se révèle être: var1 = (java.lang.String) _jspx_page_context.findAttribute ("var1"); Ok, je peux comprendre ClassCastException - il pense que var1 devrait être une chaîne, et l'attribut réel est un StringReader. Mais pourquoi est-ce un StringReader? Où la variable a-t-elle été créée? Et pourquoi essaie-t-il de faire cette mission?

Est-ce que quelqu'un peut me diriger dans la bonne direction? Quel est le problème avec le code/configuration? Est-ce un problème connu? Je ai googlé pour cela, mais je n'arrive pas à trouver quelque chose.

Merci, evnafets


Montage avec résolution: La ClassCastException était causée par la ligne dans la balise:

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

Comme mentionné here l'attribut varReader spécifie l'attribut pour stocker le résultat de l'évaluation en tant que StringReader. L'exception a été provoquée par le code généré par Tomcat en essayant de récupérer la valeur de "var1" et de la convertir en String. Comme une chaîne n'est pas un StringReader, elle a déclenché une exception à ce moment-là. Je ne suis pas sûr si l'erreur de codage est qu'ils auraient dû utiliser l'attribut "var" au lieu de l'attribut "varReader", ou ils ne devraient pas avoir utilisé non plus et juste évalué comme tel. Suppression de cet attribut imprime complètement le fragment, puis le corps à la fois avec la valeur de « var1 »:

Fragment Modèle texte 30. invoquons le corps: corps de la balise qui définit une variable script AT_BEGIN 30

Faire l'attribut var = « var1 » exécute le fragment, et stocke le résultat var1. Le corps est ensuite évalué avec cette nouvelle valeur de var1 résultat:

invoquons le corps: corps de la balise qui définit un script variable de Fragment modèle de texte 30

de AT_BEGIN Personnellement, je pense que le premier cas fait plus de sens, mais ce code est présenté comme un exemple de travail interne, pas de meilleure pratique.
Je m'attendrais toujours à l'exemple de compiler/exécuter dans tous les cas. J'ai été assez surpris quand ce n'était pas le cas.

Répondre

2

De l'syntax reference vous pouvez voir que soit var ou varReader est

Le nom d'un attribut scope pour stocker le résultat de l'invocation de fragment dans

Je crains donc l'exemple de code contient une erreur Si vous devez écrire le résultat de jsp: invoke directement sur la page, vous n'avez pas besoin de l'assigner à un var.

Pouvez-vous omettre l'attribut "varReader"?

+0

100% correct. L'omission de l'attribut varReader a résolu ce problème. Le code a ensuite généré une exception ClassCastException: java.lang.Long. Celui-ci est plus facilement tracé/fixé que l'addition dans l'expression EL a abouti à un long. Convertir cela en une chaîne travaillée. – evnafets