Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Собственные теги taglib в jsp

79K
27 января 2012 года
Eugenia12
2 / / 27.01.2012
Всем доброго времени суток!
Только начинаю изучать пользовательские теги и случилась такая проблема, связанная с непониманием вывода в jsp этих самых пользовательских тэгов.
Если кто с такой проблемой сталкивался уже помогите плиз разобраться.

Есть таблица в БД, из которой считываются данные, а именно поля id, name и hidden.
Класс Section содержит поля id, name и hidden.
Класс Sections extends TreeSet<Section>.
Считываемые данные из БД заноситься в класс Sections, который создаётся в обработчике тэга, а затем, используя итератор, потоком вывода и установкой атрибутов pageContext объекты Sections отображаются в jsp.

При первом обращении к этой jsp данные считываются из БД и отображаются как надо, но при изменении этих данных в БД (например редактировании или добавлении новой записи в БД) и обновлении страницы ничего не изменяется, в jsp как было всё так и остаётся(

Только после reload сервера и обновлении страницы можно увидеть обновлённые данные БД.
Кста если использовать в jsp вместо пользовательского тэга javaBean, то всё работает и отображается норм. А вот с taglib какая-то беда... только после перезапуска сервера...
Почему так происходит? Куда копать?

Класс обработки тэга:
Код:
public class SectionsTag extends BodyTagSupport {
    private Sections sections = new Sections();
    private Iterator it;
 
    @Override
    public int doStartTag () {
        it = sections.iterator();
            if (it.hasNext()) {
            try {
                processNextOption();
            } catch (IOException ex) {
                Logger.getLogger(SectionOptionsTag.class.getName()).log(Level.SEVERE, null, ex);
            }
                return EVAL_BODY_AGAIN;
            } else {
                return SKIP_BODY;
            }
    }
 
    @Override
    public int doAfterBody () {
            try {
                bodyContent.writeOut(getPreviousOut());
            } catch (IOException ex) {
                Logger.getLogger(ArticleOptionsTag.class.getName()).log(Level.SEVERE, null, ex);
            }
            bodyContent.clearBody();
            if (it.hasNext()) {
                try {
                    processNextOption();
                } catch (IOException ex) {
                    Logger.getLogger(ArticleOptionsTag.class.getName()).log(Level.SEVERE, null, ex);
                }
            } else {
                return SKIP_BODY;
            }
            return EVAL_BODY_AGAIN;
    }
 
    private void processNextOption () throws IOException {
        Section section = (Section) it.next();
        pageContext.setAttribute("id", section.getId());
        pageContext.setAttribute("name",section.getName());
        pageContext.setAttribute("hidden", section.isHidden());
    }


Часть кода jsp:

[HTML]
<%@taglib uri="/WEB-INF/tlds/options.tld" prefix="options"%>
<html>...
<options:Sections>
<tr>
<td>
<input type="checkbox"
name="sections" value="${id}"/>
</td>
<td>
<a href="edit.action?param=sections&val=${name}">
${name}</a>
</td>
</tr>
</options:Sections>
</html>
[/HTML]
79K
27 января 2012 года
Eugenia12
2 / / 27.01.2012
Вопрос решён!
Инициализацию TreeSet-a
private Sections sections = new Sections(); нужно было оставить null, т е
private Sections sections;

а в doStartTag () присваивать уже
sections = new Sections();
чтобы при каждом вызове тэга
TreeSet заполнялся заново из БД.

А то получалось что TreeSet инициализировался один раз при развёртывании приложения, отсюда и TreeSet повторно заполнялся обновлёнными данными из БД только после перезагрузки сервера и соответственно reload-a контекста.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог