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());
}
Собственные теги taglib в jsp
Только начинаю изучать пользовательские теги и случилась такая проблема, связанная с непониманием вывода в jsp этих самых пользовательских тэгов.
Если кто с такой проблемой сталкивался уже помогите плиз разобраться.
Есть таблица в БД, из которой считываются данные, а именно поля id, name и hidden.
Класс Section содержит поля id, name и hidden.
Класс Sections extends TreeSet<Section>.
Считываемые данные из БД заноситься в класс Sections, который создаётся в обработчике тэга, а затем, используя итератор, потоком вывода и установкой атрибутов pageContext объекты Sections отображаются в jsp.
При первом обращении к этой jsp данные считываются из БД и отображаются как надо, но при изменении этих данных в БД (например редактировании или добавлении новой записи в БД) и обновлении страницы ничего не изменяется, в jsp как было всё так и остаётся(
Только после reload сервера и обновлении страницы можно увидеть обновлённые данные БД.
Кста если использовать в jsp вместо пользовательского тэга javaBean, то всё работает и отображается норм. А вот с taglib какая-то беда... только после перезапуска сервера...
Почему так происходит? Куда копать?
Класс обработки тэга:
Код:
Часть кода 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]
Инициализацию TreeSet-a
private Sections sections = new Sections(); нужно было оставить null, т е
private Sections sections;
а в doStartTag () присваивать уже
sections = new Sections();
чтобы при каждом вызове тэга
TreeSet заполнялся заново из БД.
А то получалось что TreeSet инициализировался один раз при развёртывании приложения, отсюда и TreeSet повторно заполнялся обновлёнными данными из БД только после перезагрузки сервера и соответственно reload-a контекста.