1

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 が表示されます。

更新: リストをキャッシュするようになりました。問題はまだ解決されていません。

なぜ?どうすればこれを修正できますか?

4

1 に答える 1

-1

これは簡単な修正ですが、実際の解決策ではありません。の結果をリダイレクトaddTitle():

に次を追加しますaddTitle()

    ...
    FacesContext.getCurrentInstance().getExternalContext()
        .redirect("manualTitles.jsf");
    return null;
}
于 2011-09-01T10:05:28.703 に答える