Этот тест был вызван чтением a question on the Sun java forums и думал, что я попробую его. Раздел JSP2.0 в спецификации JSP.13.8 содержит «Пример сценария обработчика простых тэгов». Я копирую и вставляю фрагменты кода и пытаюсь запустить его.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 here Незначительное изменение - я изменил имя файла тэга от 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.String) _jspx_page_context.findAttribute ("var1");
Хорошо, я могу понять ClassCastException - он думает, что var1 должен быть строкой, а фактическим атрибутом является StringReader. Но почему это StringReader? Откуда была создана переменная? И почему он вообще пытается выполнить это задание?
Может кто-нибудь указать мне в правильном направлении? Что не так с кодом/установкой? Это известная проблема? Я искал ее, но ничего не мог найти.
Спасибо, evnafets
Редактирование с разрешением: ClassCastException был быть вызваны линии в теге:
<jsp:invoke fragment="frag" varReader="var1"/>
Как упоминалось here атрибут varReader указывает атрибут для хранения результат оценки как StringReader. Исключение было вызвано кодом, сгенерированным Tomcat, пытающимся извлечь значение «var1» и передать его в String. Поскольку String не является StringReader, поэтому он поднял исключение в этой точке.
Я не уверен, что ошибка кодирования заключается в том, что они должны были использовать «var» вместо атрибута «varReader», или они не должны были использовать и просто оценивали его как есть. Удаление этот атрибут полностью выводит фрагмент, а затем тело, как со значением «var1»:
Фрагмент шаблона Текст 30. Invoke тела: Тело тега, задающего был AT_BEGIN переменного 30
Создания атрибута переменного = «var1» выполняет фрагмент, и сохраняет результат в var1. Тело затем оцениваются с этим новым значением var1 в результате:
Призовите тело: Тело тега, определяющий AT_BEGIN сценарии переменного Фрагмента шаблон текст 30
Лично я считаю, что первый случай делает больше смысла, но этот код представлен в качестве примера внутренней работы, а не лучшей практики.
Я все еще ожидал, что пример будет компилироваться/запускаться в любом случае. Я был довольно удивлен, когда этого не произошло.
100% правильный. Оставив атрибут varReader, эта проблема была устранена. Код затем выбросил ClassCastException: java.lang.Long. Это легче прослеживается/фиксируется, поскольку добавление в выражении EL приводит к длинному. Преобразование этого в строку. – evnafets