2009-03-09 6 views
0

Этот тест был вызван чтением 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

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

ответ

2

От syntax reference вы можете увидеть, что либо вар или varReader является

Наименованием контекстного атрибута для хранения результата фрагмента вызова в

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

Можете ли вы попробовать оставить атрибут «varReader»?

+0

100% правильный. Оставив атрибут varReader, эта проблема была устранена. Код затем выбросил ClassCastException: java.lang.Long. Это легче прослеживается/фиксируется, поскольку добавление в выражении EL приводит к длинному. Преобразование этого в строку. – evnafets

Смежные вопросы