Pregunta

Esta prueba se solicitó al leer una pregunta en los foros de Sun java y pensé en probarlo. La sección de especificación JSP2.0 JSP.13.8 contiene un "Ejemplo de ejemplo de controlador de etiquetas simples". Copié y pegué los fragmentos de código e intenté ejecutarlo.

Ambiente: Apache Tomcat versión 5.5.26 y 6.0.14 (probado en ambos) Java: 1.5

Código que estoy probando con: 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>

Y el archivo de etiquetas:

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

Este código se copia directamente de la copia en PDF de la especificación JSP2.0.
También está disponible como parte de la API JSP here Se realizó un cambio menor: cambié el nombre del archivo de etiquetas de simpletag.tag a simpleTag.tag para que coincida con la invocación de este en el JSP.
También intenté copiar desde el PDF de la especificación (ajustando las cotizaciones según sea necesario) - mismo resultado.

Cuando ejecuto la página termino con un error estándar 500 Causa principal: java.lang.ClassCastException: java.io.StringReader     org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)

La línea 62 del JSP generado resulta ser:     var1 = (java.lang.String) _jspx_page_context.findAttribute (" var1 ");

Ok, puedo entender la excepción ClassCastException: piensa que var1 debería ser una cadena, y el atributo real es un StringReader. Pero ¿por qué es un StringReader? ¿Dónde se creó la variable? ¿Y por qué está intentando hacer esta tarea?

¿Alguien por favor me puede indicar la dirección correcta? ¿Qué está mal con el código / configuración? ¿Es este un problema conocido? Busqué en Google, pero parecía que no podía encontrar nada.

Gracias evnafets


Edición con resolución: La excepción de ClassCastException estaba causada por la línea en la etiqueta:

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

Como se mencionó aquí el atributo varReader especifica el atributo a almacenar El resultado de la evaluación como un StringReader. La excepción fue causada por el código generado por Tomcat que intenta recuperar el valor de " var1 " y lanzarlo a una cuerda. Como una cadena no es un StringReader, en ese momento generó una excepción.

No estoy seguro de si el error de codificación es que deberían haber usado el " var " en lugar de " varReader " atributo, o no deberían haber usado ninguno y simplemente evaluarlo tal como está. Al eliminar ese atributo se imprime completamente el fragmento y luego el cuerpo con el valor de " var1 " ;:

  

Texto de la plantilla del fragmento 30.   Invocar el cuerpo: el cuerpo de la etiqueta que define una variable de secuencias de comandos AT_BEGIN 30

Hacer el atributo var = " var1 " ejecuta el fragmento y almacena el resultado en var1. Luego se evalúa el cuerpo con este nuevo valor de var1 que resulta en:

  

Invocar el cuerpo: el cuerpo de la etiqueta que define una variable de secuencia de comandos AT_BEGIN Fragment Template Text 30

Personalmente creo que el primer caso tiene más sentido, pero este código se presenta como un ejemplo del funcionamiento interno, no de la mejor práctica.
Todavía hubiera esperado que el ejemplo se compilara / ejecutara en cualquier caso. Me sorprendió bastante cuando no lo hizo.

¿Fue útil?

Solución

De la referencia de sintaxis puede ver que var o varReader es

  

El nombre de un atributo con ámbito para almacenar el resultado de la invocación del fragmento en

Así que me temo que el código de muestra contiene un error. Si necesita escribir el resultado de jsp: invoque directamente a la página, no necesita asignarlo a una variable.

¿Puedes intentar omitir " varReader " atributo?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top