Domanda

Questo test è stato richiesto leggendo una domanda sui forum Sun Java e ho pensato di provarlo. La sezione relativa alle specifiche JSP2.0 JSP.13.8 contiene uno "Esempio di scenario semplice per il gestore di tag". Ho copiato e incollato i frammenti di codice e ho tentato di eseguirlo.

Ambiente: Apache Tomcat versione 5.5.26 e 6.0.14 (testato su entrambi) Java: 1.5

Codice che sto testando con: Pagina 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>

E il file tag:

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

Questo codice viene copiato direttamente dalla copia PDF della specifica JSP2.0.
È anche disponibile come parte dell'API JSP qui Modifiche minori apportate: ho cambiato il nome del file tag da simpletag.tag a simpleTag.tag in modo che corrisponda alla sua invocazione nel JSP.
Ho anche provato a copiare dal PDF delle specifiche (modificando le virgolette se necessario) - stesso risultato.

Quando eseguo la pagina finisco con un errore 500 standard Causa ultima: java.lang.ClassCastException: java.io.StringReader     org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)

La riga 62 del JSP generato risulta essere:     var1 = (java.lang.String) _jspx_page_context.findAttribute (" var1 ");

Ok, posso capire ClassCastException - pensa che var1 dovrebbe essere una stringa e l'attributo vero e proprio è un StringReader. Ma perché è StringReader? Dove è stata creata la variabile? E perché sta tentando di svolgere questo compito?

Qualcuno può indicarmi la giusta direzione? Cosa c'è di sbagliato nel codice / installazione? È un problema noto? Ho cercato su Google per questo ma non riuscivo a trovare nulla.

Grazie, evnafets


Modifica con risoluzione: ClassCastException era causata dalla linea nel tag:

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

Come menzionato qui l'attributo varReader specifica l'attributo da memorizzare il risultato della valutazione come StringReader. L'eccezione è stata causata dal codice generato da Tomcat nel tentativo di recuperare il valore di "var1" e lanciarlo su una stringa. Poiché una stringa non è una StringReader, ha sollevato un'eccezione a quel punto.

Non sono sicuro che se l'errore di codifica sia che avrebbero dovuto usare la "quot" var " invece di " varReader " o non avrebbero dovuto usarlo e valutarlo così com'è. La rimozione di tale attributo stampa completamente il frammento, quindi il corpo entrambi con il valore di " var1 " ;:

  

Testo modello frammento 30.   Invoca il corpo: corpo del tag che definisce una variabile di script AT_BEGIN 30

Rendere l'attributo var = " var1 " esegue il frammento e memorizza il risultato in var1. Il corpo viene quindi valutato con questo nuovo valore di var1 risultante in:

  

Invoca il corpo: corpo del tag che definisce una variabile di script AT_BEGIN Frammento modello testo 30

Personalmente penso che il primo caso abbia più senso, ma questo codice è presentato come un esempio di meccanismi interni, non di buone pratiche.
Mi sarei comunque aspettato che l'esempio fosse compilato / eseguito in ogni caso. Sono stato abbastanza sorpreso quando non lo ha fatto.

È stato utile?

Soluzione

Dal riferimento di sintassi puoi vedere che var o varReader è

  

Il nome di un attributo con ambito per memorizzare il risultato dell'invocazione di frammenti in

Quindi temo che il codice di esempio contenga un errore. Se devi scrivere il risultato di jsp: invoca direttamente la pagina non devi assegnarlo a una var.

Puoi provare a tralasciare " varReader " attribuire?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top