jsf динамически загружаемый контент не работает

Я пытаюсь предлагать некоторый контент динамически, то есть без выделенных страниц, с помощью кнопок. Вышеупомянутый контент загружается правильно, но не работает.

Схема такая:

<p:outputPanel style="width: 100%; height: 100%; overflow: auto;" id="contentPanel">
    <c:choose>
        <c:when test="#{empty requestComposition}">
            <ui:insert name="body">Content</ui:insert>
        </c:when>
        <c:otherwise>
            <ui:include src="#{requestComposition}" />
        </c:otherwise>
    </c:choose>
</p:outputPanel>

Кнопка для загрузки контента выглядит так (внутри другой панели вывода):

    <p:commandButton value="Load Dynamic" update=":contentPanel" actionListener="#{applicationController.processActionButton('/dynamic')}" />

Слушатель действий выглядит следующим образом:

public void processActionButton(String target){
    if(target == null || target.isEmpty()){
        return;
    }
    FacesContext context = FacesContext.getCurrentInstance();
    HttpServletRequest req = (HttpServletRequest)context.getExternalContext().getRequest();
    req.setAttribute("requestComposition", "/WEB-INF/templates" + target + ".xhtml");
}

Динамический.xhtml выглядит так:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
    xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
    xmlns:f="http://xmlns.jcp.org/jsf/core"
    xmlns:fn="http://xmlns.jcp.org/jsp/jstl/functions"
    xmlns:pt="http://xmlns.jcp.org/jsf/passthrough"
    xmlns:jsf="http://xmlns.jcp.org/jsf"
    xmlns:p="http://primefaces.org/ui"
    xmlns:pe="http://primefaces.org/ui/extensions">
    <p:outputPanel style="width: 100%; padding-top: 20px;">
        <p:outputPanel style="width: 60%; margin: 0 auto;">
            <p:outputPanel style="text-align: center; color: gold; font-weight: bold;">Dynamic</p:outputPanel>
            <p:messages id="messages" />
            <h:form>
                <p:panelGrid columns="2" style="width: 100%;">
                    <p:outputLabel value="Item" for="idItem" />
                    <p:outputPanel style="display: block; padding-right: 10px;" layout="inline">
                        <p:inputText value="#{bean.item}" id="idItem" style="width: 100%;" required="true" />
                    </p:outputPanel>
                </p:panelGrid>
                <p:outputPanel style="text-align: center;">
                    <p:commandButton value="Process" style="margin: 5px;" update=":growl" onclick="PrimeFaces.widgets.widget_#{fn:replace(component.clientId, ':', '_')}.disable()" oncomplete="PrimeFaces.widgets.widget_#{fn:replace(component.clientId, ':', '_')}.enable()" actionListener="#{applicationController.dummyAction}" />
                    <p:commandButton value="Dummy" style="margin: 5px;" update=":growl" actionListener="#{applicationController.dummyAction}" process="@this" />
                </p:outputPanel>
            </h:form>
        </p:outputPanel>
    </p:outputPanel>
</ui:composition>

При нажатии любой из кнопок форма, по-видимому, отправляется, но прослушиватель действий не выполняется. Когда dynamic.xhtml загружается как содержимое страницы, форма отправляется, но прослушиватель действий запускается только для второй кнопки (обозначенной Dummy) из-за процесса @this, и в этом случае форма больше не отправляется. Я могу обойти форму, не отправляющуюся с помощью process@this, добавив onchange к элементам ввода, но мне не удалось понять, почему она не работает при динамической загрузке.

Спасибо


person Alex Gusta    schedule 14.02.2015    source источник
comment
У вас тоже есть форма в макете? В консоли браузера ничего нет?   -  person Jaqen H'ghar    schedule 15.02.2015
comment
У меня нет вложенных форм и консоль чистая. Я использую Chrome, и единственное изменение находится на вкладке «Сеть», где он показывает, что отправляет сообщение на сервер и получает ответ «ОК».   -  person Alex Gusta    schedule 15.02.2015
comment
Это приемлемо как обман? stackoverflow.com/questions/7108668/   -  person BalusC    schedule 16.02.2015
comment
Это закрыто. Я знаю, что у меня может быть свойство bean-компонента для хранения отображаемой страницы, но этот подход означает, что при обновлении страницы я все равно получу этот контент, а я не хочу, чтобы это произошло. Проект небольшой, поэтому я не хочу возиться с полной настройкой ACL. Я проверил сгенерированный источник и он содержит скрытое поле viewState, я также добавил скрипт fixview, но безрезультатно.   -  person Alex Gusta    schedule 16.02.2015


Ответы (1)


Я должен извиниться перед BalusC, так как предложенный им ответ был действительно правильным. Меня обманул @PostConstruct, который выполнил для меня ненужную инициализацию, но ключ в том, чтобы использовать bean-компонент @ViewScoped. Однако это вызывает другой вопрос, так как в документации указано, что по умолчанию на сервере будет храниться максимум 20 таких объектов, которые можно настроить на другое значение, но, если я правильно понял, это будет означать, что 21-е подключение к сервер приведет к повторному использованию первого, поэтому новое соединение получит доступ к данным, не предназначенным для него, или к его отбрасыванию и созданию нового, что означает, что первое потеряет свои данные?

person Alex Gusta    schedule 17.02.2015