Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

Для полноты:

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

Ответ 4

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

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

Ответ 5

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

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

см. TagSupport.doEndTag()

Ответ 6

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