提交JSF2表单不会在同一页面上重新加载该集合

时间:2011-09-01 09:51:49

标签: jsf-2 mojarra

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。

更新:现在缓存列表。问题仍未解决。

为什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

这是一个快速解决方案,但不是真正的解决方案。重定向addTitle()的结果:

将以下内容添加到addTitle()

    ...
    FacesContext.getCurrentInstance().getExternalContext()
        .redirect("manualTitles.jsf");
    return null;
}