JSF 2.0 (мохарра) приложение.У меня есть очень тривиальная форма для добавления элемента
<h:form>
#{msg['add custom title']}:<br />
<table>
<tr>
<td>#{msg['heaading']}:</td>
<td><h:inputText value="#{titlesBean.title.heading}"></h:inputText></td>
</tr>
<tr>
...
</tr>
</table>
<h:commandButton action="#{titlesBean.addTitle}" value="#{msg['g.save']}" />
</h:form>
И затем на той же странице у меня есть список всех уже добавленных элементов:
<h:dataTable id="manualTitlesForm" value="#{titlesBean.manualTitles}" var="title" border="1" cellspacing="0">
<h:column>
<f:facet name="header">#{msg['heaading']}</f:facet>
#{title.heading}
</h:column>
...
<h:column>
<f:facet name="header">#{msg['actions']}</f:facet>
<h:form>
<h:commandButton action="#{titlesBean.editManualTitle(title)}" value="#{msg['g.edit']}" />
<h:commandButton action="#{titlesBean.deleteManualTitle(title.id)}" value="#{msg['g.delete']}" />
</h:form>
</h:column>
</h:dataTable>
Код в бинекод очень прост:
@Controller
@Scope(Scopes.REQUEST)
public class TitlesBean {
private List<JTitle> manualTitles;
@PostConstruct
private void init() {
this.manualTitles = titlesManager.getManualTitles();
}
public String addTitle() {
title.setCreated(new Date());
title.setManual(true);
try {
titlesManager.addTitle(title);
title = new JTitle();// this is added, delete from the variable. only if no exception though !!!
UserMessagesBean.addMessage("saved");
} catch (Exception e) {
UserMessagesBean.setValidationException(e.getMessage());//different exception added
}
return null;
}
public List<JTitle> getManualTitles() {
return manualTitles;
}
}
Теперь проблема в том, что getManualTitles()
вызывается столько раз, сколько у меня есть названий, что вызывает, например, 12 обращений к БД вместо одного.Почему это происходит за пределами моего понимания.Я могу исправить это с помощью кэширования заголовков руководства в бобе.Это не моя главная проблема.
Проблема в том, что addTitle()
называется ПОСЛЕ getManualTitles()
.Фактически getManualTitles()
вызывается, например, 10 раз, затем addTitle()
, затем еще два раза getManualTitles()
метод.Это заставляет меня думать, что это какое-то параллельное выполнение, которое заставляет мою страницу показывать только 12 старых записей вместо 13. Мне нужно перезагрузить страницу, тогда отображается 13.
ОБНОВЛЕНО:теперь кеширует список. Проблема все еще не решена.
ПОЧЕМУ?Как я могу это исправить?