Pergunta

Este teste foi solicitado pela leitura uma pergunta sobre os fóruns Sun Java e pensei que seria experimentá-lo. A secção de especificações JSP2.0 JSP.13.8 contém um "Exemplo Tag simples Handler Cenário". Eu copiar e colar os fragmentos de código e tentou executá-lo.

Ambiente: Apache Tomcat versão 5.5.26 e 6.0.14 (testado em ambos) Java: 1.5

código que estou testando com: Página 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 o arquivo 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/>

Este código é copiado diretamente a partir da cópia PDF da especificação JSP2.0.
Ele também está disponível como parte do JSP-API aqui pequena alteração feita - eu mudei o nome do tagfile de simpletag.tag para simpleTag.tag para coincidir com a invocação dele no JSP
. Eu também tentei copiar a partir do PDF da especificação (ajustando citações conforme necessário.) - mesmo resultado

Quando eu executar a página que eu acabar com um erro padrão de 500 Causa raiz: java.lang.ClassCastException: java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService (tagVariableTest_jsp.java:62)

Line62 do JSP gerada acaba por ser: var1 = (java.lang.String) _jspx_page_context.findAttribute ( "var1");

Ok, eu posso entender ClassCastException - pensa que var1 deve ser uma String, eo atributo real é uma StringReader. Mas por que é um StringReader? Onde é que a variável são criados? E por que é tentar fazer essa tarefa em tudo?

Alguém por favor pode me apontar na direção certa? O que está errado com o código / setup? Isto é um problema conhecido? Eu pesquisei para ele, mas não conseguia encontrar nada.

Obrigado, evnafets


Edição com resolução: O ClassCastException estava sendo causado pela linha na tag:

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

Como mencionado aqui especifica atributos varReader o atributo para armazenar o resultado da avaliação como um StringReader. A exceção foi causado por código gerado Tomcat tentando recuperar o valor de "var1" e lançá-lo em um String. Como uma String não é um StringReader assim, ele levantou uma exceção nesse ponto.

Eu não tenho certeza se o erro de codificação é que eles devem ter usado o "var" em vez do atributo "varReader", ou que não deveriam ter usado tanto e apenas avaliaram como é. Removendo esse atributo imprime completamente fora do fragmento, e então o corpo, tanto com o valor de "var1":

Template fragmento de texto 30. Invocar o corpo: Corpo de tag que define uma variável AT_BEGIN scripting 30

Fazendo o atributo var = "var1" executa o fragmento, e armazena o resultado para var1. O corpo é então avaliado com este novo valor de var1 resultando em:

Invoke do corpo: Corpo de tag que define uma variável de scripting AT_BEGIN Template fragmento de texto 30

Pessoalmente acho que o primeiro caso faz mais sentido, mas este código é apresentado como um exemplo dos innerworkings, não as melhores práticas.
Eu ainda teria esperado o exemplo para compilar / executar em qualquer caso. Fiquei bastante surpreso quando isso não aconteceu.

Foi útil?

Solução

A partir da referência sintaxe você pode ver que tanto var ou varReader é

O nome de um atributo de escopo para armazenar o resultado do fragmento de invocação no

Então, eu tenho medo o código de exemplo contém um erro. Se você precisa escrever o resultado de jsp:. Invoke diretamente para a página que você não precisa se associar a um var

Você pode tentar eliminar o atributo "varReader"?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top