JSF 2.0(mojarra)应用程序。我有一个非常简单的形式来添加项目
<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()
被调用的次数与我拥有的标题数一样多,这导致例如12次调用DB,而不是一次。为什么这种情况超出了我的理解范围。我可以通过缓存bean中的手动标题来解决这个问题。这不是我的主要问题。
问题是addTitle()
在getManualTitles()
之后被调用。事实上,getManualTitles()
被称为例如10次,然后是addTitle()
,然后是getManualTitles()
方法的两倍。这让我觉得这是某种并行执行,导致我的页面只显示12个旧记录而不是13个。我必须重新加载页面,然后显示13。
更新:现在缓存列表。问题仍未解决。
为什么?我该如何解决这个问题?
答案 0 :(得分:-1)
这是一个快速解决方案,但不是真正的解决方案。重定向addTitle()
的结果:
将以下内容添加到addTitle()
:
...
FacesContext.getCurrentInstance().getExternalContext()
.redirect("manualTitles.jsf");
return null;
}