как предотвратить повторное использование тегов jsp после загрузки в класс - PullRequest
6 голосов
/ 20 марта 2010

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

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

Я хочу, чтобы этого больше не было. Кто-нибудь знает, какие настройки управляют этим в Tomcat 6?

Ответы [ 4 ]

7 голосов
/ 26 февраля 2012

Tomcat 7.0 использует пул тегов:

http://tomcat.apache.org/tomcat-7.0-doc/jasper-howto.html

Пул пользовательских тегов JSP - объекты Java, созданные для пользовательских тегов JSP, теперь можно объединять и использовать повторно. Это значительно повышает производительность страниц JSP, использующих пользовательские теги.

На этой странице также сказано, что web.xml может содержать для этого параметр «enablePooling», и что его значением по умолчанию является true.

Так что я бы сказал, что отключение повторного использования тегов не очень хорошая идея, так как это приведет к некоторой потере производительности.

Tomcat 7.0 гарантирует, что состояние класса тега останется неизменным между doStartTag () и doEndTag ():

http://tomcat.apache.org/tomcat-7.0-doc/jspapi/javax/servlet/jsp/tagext/Tag.html

Методы doStartTag и doEndTag могут быть вызваны в обработчике тега. Между этими вызовами предполагается, что обработчик тега содержит состояние, которое должно быть сохранено

Но в том же абзаце между круглыми скобками также говорится, что объект, как ожидается, сохранит свои свойства после:

После вызова doEndTag обработчик тега доступен для дальнейших вызовов ( и ожидается, что он сохранит свои свойства ).

Итак, все, что я делаю, это сбрасываю все локальные переменные к их значению по умолчанию непосредственно перед возвратом doEndTag (). Я не нашел объяснения о том, как реализован пул и повторное использование тегов Tomcat (я думаю, TagHandlerPool.java), поэтому я считаю, что это наиболее безопасный вариант.

2 голосов
/ 17 апреля 2010

Вам необходимо очистить состояние тега между вызовами. Вы должны сделать это в методе doEndTag() вашего класса, непосредственно перед возвратом. В этот момент вы должны установить все переменные состояния на null.

1 голос
/ 19 сентября 2012

Возможно, немного поздно, но у меня была такая же проблема. Возникает, когда я устанавливаю атрибуты Tag со значением NULL в значение. Изменение значения не дает никакой ошибки, только установка.

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

Не уверен, правда ли это, но это соответствует моим наблюдениям

1 голос
/ 20 марта 2010

Фактически, каждый раз создается только один экземпляр тега. Может быть, вы объявили атрибуты static?

...