Передача параметров с помощью Seam, RichFaces и PopupPanel - PullRequest
0 голосов
/ 29 июня 2011

Я пытаюсь заставить небольшое приложение работать с использованием Seam 3, RichFaces 4 и решить несколько проблем с передачей некоторых параметров. Я пробовал много разных вещей, но я продолжаю падать на последнем препятствии. Я несу через customerId через параметр запроса. Но когда я нажимаю кнопку команды RichFaces на popupPanel, этот customerId больше не доступен для меня.

Я настраиваю приложение для управления некоторыми данными. В основном вы выбираете клиента на одном экране, и вы переходите на другой экран, содержащий «репозитории», где вы затем можете создавать, редактировать и т. Д. Вы можете перейти на эту вторую страницу репозиториев по URL:

http://localhost:8080/media-manager/repositories.xhtml?customer=12

У меня есть бин, поднимающий это значение:

@Named
@RequestScoped
public class RepositoryBean extends AbstractViewBean<Repository> {
    // Various properties etc. here

    private Long customerId;

    public void init() {
        log.info("Customer ID is "+ customerId);
    }
}

Затем я устанавливаю идентификатор клиента с помощью метаданных на странице хранилища и вызываю init:

<f:metadata>
  <f:viewParam name="customer" value="#{repositoryBean.customerId}"/>
  <f:event type="preRenderView" listener="#{repositoryBean.init}" />
</f:metadata>

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

<rich:popupPanel id="repositoryModalPanel" modal="true" resizeable="true">
  <f:facet name="header">Title</f:facet>
  <f:facet name="controls">
    <h:outputLink value="#" onclick="#{rich:component('repositoryModalPanel')}.hide(); return false;">X</h:outputLink>
  </f:facet>
  <h:form id="modalForm" class="modalForm">
    <fieldset>
    <ul class="layout form">
      <li>
        <label for="name" class="required">Name:</label>
        <h:inputText id="name" value="#{repositoryBean.instance.name}" required="true">
          <!-- rich:validator event="blur" / -->
        </h:inputText>
        <rich:message for="name" errorClass="error errormessage" />
      </li>
      <li class="last">
        <a4j:commandButton id="create" value="Create" action="#{repositoryBean.saveRepository}" rendered="#{empty repositoryBean.instance.id}"/>
        <a4j:commandButton id="save" value="Save" action="#{repositoryBean.saveRepository}" rendered="#{not empty repositoryBean.instance.id}"/>
        <a4j:commandButton id="cancel" value="Cancel" action="#{repositoryBean.clearInstance}" immediate="true" />
      </li>
    </ul>
  </fieldset>
</h:form>

По сути, всякий раз, когда я нажимаю кнопку save commandButton, вызывается метод init, но элемент customerId никогда не заполняется. Кто-нибудь знает, почему?

Я читал, что viewParam предназначен только для запросов GET, так что, может быть, в этом проблема? Но если это так - каково другое решение? Многие вещи, которые я видел, предложенные (например, с использованием @ManagedProperty), похоже, не применимы к Шову 3.

1 Ответ

1 голос
/ 30 июня 2011

RepositoryBean - это RequestScoped, и поэтому он будет создаваться заново при каждом запросе, особенно если вы нажмете кнопку сохранения.

Простое решение состоит в том, чтобы повысить RepositoryBean до ConversationScoped иэто долго работает, если вы заходите на страницу.

@Named
@ConversationScoped
public class RepositoryBean extends AbstractViewBean<Repository> {
    // Various properties etc. here

    @In
    Conversation conversation

    private Long customerId;

    public void init() {
        log.info("Customer ID is "+ customerId);
        conversation.begin();
    }
}

Самый простой способ для этого - сбросить preRenderView и использовать вместо этого шов 3 view-action.

<f:metadata>
  <f:viewParam name="customer" value="#{repositoryBean.customerId}"/>
  <s:viewAction action="#{repositoryBean.init}" if="#{conversation.transient}"/>
</f:metadata>
...