2009-03-05 2 views
11

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

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

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

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

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

+0

Какова область действия атрибута? – cherouvim

ответ

12

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

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, возможно, сделано везде).

1

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

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

0

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

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

см TagSupport.doEndTag()

8

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

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

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

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

Для полноты картины:

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

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