Question

Ce test vous a été demandé en lisant une question sur les forums Sun java et je pensais que je voudrais l'essayer. La section JSP.13.8 de la spécification JSP2.0 contient un "Exemple de scénario de gestionnaire de balises simple". Je copiais et collais les fragments de code et tentais de l'exécuter.

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

Code avec lequel je teste: Jsp page:

<%@ 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 le fichier de balise:

<%-- /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é de la copie PDF de la spécification JSP2.0.
Il est également disponible dans l’API JSP ici Modification mineure apportée - j'ai changé le nom du fichier de balises de simpletag.tag à simpleTag.tag afin de correspondre à son invocation dans le JSP.
J'ai également essayé de copier depuis le PDF la spécification (en ajustant les guillemets si nécessaire) - même résultat.

Quand j'exécute la page, je me retrouve avec une erreur standard de 500 Cause première: java.lang.ClassCastException: java.io.StringReader     org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)

La ligne 62 du fichier JSP généré s’avère être:     var1 = (java.lang.String) _jspx_page_context.findAttribute ("var1");

Bien, je peux comprendre ClassCastException - il pense que var1 doit être une chaîne et que l'attribut réel est un StringReader. Mais pourquoi est-ce un StringReader? Où la variable a-t-elle été créée? Et pourquoi tente-t-il de faire cette mission?

Quelqu'un peut-il me diriger dans la bonne direction? Quel est le problème avec le code / configuration? est-ce un problème connu? Je l'ai cherché sur Google mais je n'arrivais pas à trouver quoi que ce soit.

Merci, evnafets

Modification avec résolution: La ClassCastException était provoquée par la ligne dans la balise:

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

Comme mentionné dans ici , l'attribut varReader spécifie l'attribut à 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 qui tentait de récupérer la valeur de "var1". et le jeter à une chaîne. Comme une chaîne n'est pas un StringReader, elle a alors généré une exception.

Je ne sais pas si l'erreur de codage est qu'ils auraient dû utiliser le paramètre "var". au lieu de "varReader". attribut, ou ils ne devraient pas avoir utilisé non plus et juste évalué comme tel. La suppression de cet attribut imprime complètement le fragment, puis le corps avec la valeur "var1":

  

Fragment Template Text 30.   Appel du corps: corps de la balise définissant une variable de script AT_BEGIN 30

Création de l'attribut var = " var1 " exécute le fragment et stocke le résultat dans var1. Le corps est ensuite évalué avec cette nouvelle valeur de var1, ce qui donne:

  

Invoquer le corps: corps de la balise définissant une variable de script AT_BEGIN Fragment Template Text 30

Personnellement, je pense que le premier cas est plus logique, mais ce code est présenté comme un exemple du travail interne, pas de la meilleure pratique.
Je me serais toujours attendu à ce que l'exemple soit compilé / exécuté dans tous les cas. J'ai été assez surpris quand ça ne s'est pas passé.

Était-ce utile?

La solution

À partir de la référence de syntaxe , vous pouvez voir que var ou varReader est

  

Nom d'un attribut défini pour stocker le résultat de l'appel de fragment dans

Je crains donc que l'exemple de code ne contienne une erreur. Si vous devez écrire le résultat de jsp: invoke directement sur la page, vous n'avez pas besoin de l'affecter à une variable.

Pouvez-vous essayer d’omettre le "varReader"? attribut?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top