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>
Bean コードのコードは非常に単純です。
@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()
私が持っているタイトルの数と同じ回数呼び出されることです。これにより、DB への呼び出しが 1 回ではなく 12 回発生します。なぜこれが起こっているのか、私の理解を超えています。これは、マニュアルのタイトルを Bean にキャッシュすることで修正できます。これは私の主な問題ではありません。
問題は、addTitle()
AFTER と呼ばれることですgetManualTitles()
。実際getManualTitles()
には、メソッドがたとえば 10 回呼び出され、次にaddTitle()
、さらに 2回呼び出されgetManualTitles()
ます。これは、ページに 13 ではなく 12 の古いレコードのみを表示させるある種の並列実行であると考えさせられます。ページをリロードする必要があり、その後 13 が表示されます。
更新: リストをキャッシュするようになりました。問題はまだ解決されていません。
なぜ?どうすればこれを修正できますか?