Пример простого сценария обработки тегов JSP.13.8 не работает?

StackOverflow https://stackoverflow.com/questions/624607

  •  05-07-2019
  •  | 
  •  

Вопрос

Этот тест был вызван чтением вопрос на форумах Sun java и подумал, что стоит это попробовать.Раздел спецификации JSP2.0 JSP.13.8 содержит "Пример простого сценария обработки тегов".Я скопировал и вставил фрагменты кода и попытался запустить его.

Окружающая среда:Apache Tomcat версий 5.5.26 и 6.0.14 (протестирован на обоих) Java:1.5

Код, с помощью которого я тестирую:Страница 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>

И файл тегов:

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

Этот код напрямую скопирован из PDF-копии спецификации JSP2.0.
Он также доступен как часть JSP-API здесь Внесено незначительное изменение - я изменил имя файла тегов с simpletag.tag на SimpleTag.tag, чтобы соответствовать его вызову в JSP.
Я также попробовал скопировать спецификацию из PDF (корректируя кавычки по мере необходимости) - тот же результат.

Когда я запускаю страницу, я получаю стандартную ошибку 500 Основная причина:java.lang.ClassCastException:java.io.StringReader org.apache.jsp.tagVariableTest_jsp._jspService(tagVariableTest_jsp.java:62)

Строка 62 сгенерированного JSP оказывается следующей:var1 = (java.lang.Строка) _jspx_page_context.findAttribute("var1");

Хорошо, я могу понять ClassCastException - он считает, что var1 должен быть строкой, а фактическим атрибутом является StringReader .Но почему это StringReader?Где была создана переменная?И почему он вообще пытается выполнить это задание?

Кто-нибудь, пожалуйста, может указать мне правильное направление?Что не так с кодом / настройкой?Это известная проблема?Я поискал это в гугле, но, похоже, ничего не смог найти.

Спасибо, evnafets


Редактирование с разрешением:Исключение ClassCastException было вызвано строкой в теге:

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

Как уже упоминалось здесь атрибут varReader указывает атрибут для хранения результата вычисления в виде StringReader.Исключение было вызвано сгенерированным Tomcat кодом, пытающимся извлечь значение "var1" и преобразовать его в строку.Поскольку строка не является средством чтения строк, в этот момент она вызвала исключение.

Я не уверен, что ошибка кодирования заключается в том, что они должны были использовать атрибут "var" вместо атрибута "varReader", или они не должны были использовать ни то, ни другое и просто оценили его как есть.Удаление этого атрибута полностью выводит фрагмент, а затем и тело со значением "var1".:

Фрагмент текста шаблона 30.Вызовите тело:Тело тега, определяющего скриптовую переменную AT_BEGIN 30

Создание атрибута var="var1" выполняет фрагмент и сохраняет результат в var1.Затем тело вычисляется с этим новым значением var1, что приводит к:

Вызовите тело:Тело тега, определяющего скриптовую переменную AT_BEGIN, Фрагмент шаблона Text 30

Лично я думаю, что первый случай имеет больше смысла, но этот код представлен как пример внутренней работы, а не как лучшая практика.
Я все равно ожидал бы, что пример будет скомпилирован / запущен в любом случае.Я был изрядно удивлен, когда этого не произошло.

Это было полезно?

Решение

Из самого ссылка на синтаксис вы можете видеть, что либо var, либо varReader являются

Имя атрибута с ограниченной областью действия, в котором хранится результат вызова фрагмента

Поэтому я боюсь, что пример кода содержит ошибку.Если вам нужно записать результат jsp:invoke непосредственно на страницу, вам не нужно присваивать его переменной.

Можете ли вы попробовать исключить атрибут "varReader"?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top