Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Собственные теги taglib в jsp
Список форумов
 ->  Основы веб-программирования на Java


 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Eugenia : 2
Новичок

СообщениеЯнв 27, 2012 13:12 
Ответить с цитатой
Всем доброго времени суток!
Только начинаю изучать пользовательские теги и случилась такая проблема, связанная с непониманием вывода в 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:
Код:

<%@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>
К началу Посмотреть профиль Отправить личное сообщение
Eugenia : 2
Новичок

СообщениеЯнв 27, 2012 15:21 
Ответить с цитатой
Вопрос решён!
Инициализацию TreeSet-a
private Sections sections = new Sections(); нужно было оставить null, т е
private Sections sections;

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

А то получалось что TreeSet инициализировался один раз при развёртывании приложения, отсюда и TreeSet повторно заполнялся обновлёнными данными из БД только после перезагрузки сервера и соответственно reload-a контекста.
К началу Посмотреть профиль Отправить личное сообщение
 
Начать новую тему  Ответить на тему
Страница 1 из 1
Список форумов
 -> Основы веб-программирования на Java


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


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru