Жизненный цикл тега JSP - PullRequest
       20

Жизненный цикл тега JSP

11 голосов
/ 05 марта 2009

Я только что внес ошибку в свой код, потому что, похоже, неправильно понял жизненный цикл тега jsp.

Тег работал до ошибки: Я передаю тег некоторой коллекции в качестве атрибута, и он отображает ее в виде таблицы. Коллекция была передана в JSP от контроллера.

После ошибки: Я удалил атрибут, который установил коллекцию. Вместо этого в теге я проверяю, является ли коллекция нулевым, а затем извлекаю ее из запроса по имени (используя соглашение об именах).

То, чего я не ожидал: после того, как коллекция была изначально установлена ​​в теге, она никогда не станет нулевой при последующих выполнениях! Он все еще был определен как необязательный атрибут в TLD.

I ожидается тег, который не будет удерживаться в предыдущих значениях между выполнениями.

Ответы [ 6 ]

12 голосов
/ 05 марта 2009

Вы сами ответили на вопрос - он объединен. См. Учебник по тегам , чтобы узнать, что реализовать в реализациях java, вместе со страницей, связанной с ним, содержащей последовательность вызовов :

ATag t = new ATag();
t.setPageContext(...);
t.setParent(...);
t.setAttribute1(value1);
t.setAttribute2(value2);
t.doStartTag();
t.doEndTag();
t.release();

То есть, повторно инициализируйте ваш экземпляр тега в doEndTag (), как того требует API. (изменено на комментарий Julien Kronegg, спасибо)

Обратите внимание, что пул, вероятно, зависит от контейнера, но вполне законен (и, в связи с настройкой API, возможно, выполняется везде).

8 голосов
/ 18 мая 2010

Краткий ответ: Вы не должны писать атрибуты свойств самостоятельно. Тем самым вы делаете очистку штата своей обязанностью.

Для более длинного ответа JSP 2.0 Spec диктует следующее (стр. 2-51):

  • Сеттеры вызываются для всех указанных атрибутов определенного вхождения тега
  • Установщики не , для пропущены атрибуты (при этом значения по умолчанию остаются нетронутыми, а в вашем случае недопустимым значением во внутреннем состоянии)
  • Обработчики тегов могут быть повторно использованы только экземплярами с таким же набором указанных атрибутов

Эти три точки вместе гарантируют, что свойства атрибута всегда правильно инициализируются, сохраняя при этом значения по умолчанию (определенные в конструкторе или объявлении свойств). В свою очередь, он работает только в предположении, что только контейнер манипулирует свойствами атрибута (вызывая сеттеры).

Ради полноты:

  • release() не следует использовать для сброса внутреннего состояния между вызовами обработчика тега. Он гарантированно вызывается только перед GC и должен использоваться для освобождения долгосрочных ресурсов.
  • Если вы хотите инициализировать переменные экземпляра в doStartTag(), будьте осторожны, чтобы не перезаписывать атрибуты, потому что на этом этапе контейнер уже вызвал сеттеры.
  • doEndTag() должно быть безопасно использовать для инициализации, потому что теги никогда не должны использоваться повторно в случае исключения (см. Стр. 2-54 [2])
3 голосов
/ 05 марта 2012

В спецификации JSP 1.2 добавлен интерфейс TryCatchFinally. http://docs.oracle.com/javaee/1.4/api/javax/servlet/jsp/tagext/TryCatchFinally.html

Похоже, вы должны распределить ресурсы в методе doStartTag (), а очистка - в методе doFinally ().

1 голос
/ 05 марта 2009

так что ответ: тег помещается в магический пул и используется повторно между казнями. спецификация тега гласит:

"Неуказанные атрибуты / свойства не должны устанавливаться (с использованием метода установки)."

0 голосов
/ 21 апреля 2016

метод выпуска - это период времени, когда JSP завершил использование тега и используется, чтобы позволить тегу освободиться.

0 голосов
/ 06 июня 2009

Наблюдение за Tomcat 6 предполагает, что release () вызывается только при закрытии контейнера. Члены экземпляра обработчика тега должны очистить состояние экземпляра в doEndTag (). Из API документа:

"Все состояния экземпляра, связанные с этим экземпляром, должны быть сброшены."

см. TagSupport.doEndTag ()

...