Отправка формы JSF2 не перезагружает коллекцию на той же странице - PullRequest
1 голос
/ 01 сентября 2011

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.

ОБНОВЛЕНО:теперь кеширует список. Проблема все еще не решена.

ПОЧЕМУ?Как я могу это исправить?

1 Ответ

0 голосов
/ 01 сентября 2011

Это быстрое решение, но не реальное решение. Перенаправить результат addTitle():

Добавить следующее к addTitle():

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