2015-02-14 3 views
0

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

Кнопка для загрузки содержимого, как это (внутри другого 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, и в этом случае форма больше не отправляется. Я могу обойти форму, не отправленную с процессом @, добавив onchange в элементы ввода, но я не понял, почему не работает, когда он загружается динамически.

Спасибо

+0

У вас также есть форма в макете? Ничего в консоли браузера? –

+0

У меня нет вложенных форм, а консоль чиста. Я использую Chrome, и единственное изменение находится на вкладке «Сеть», где показано, что он отправляется на сервер и получает ответ «ОК». –

+0

Это приемлемо как обман? http://stackoverflow.com/questions/7108668/how-to-ajax-refresh-the-main-content-part-by-navigation-menu/ – BalusC

ответ

0

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