0

Seam 3、RichFaces 4 を使用して小さなアプリケーションを動作させようとしていますが、いくつかのパラメーターを渡す際にいくつかの問題が発生しています。いろいろ試しましたが、最後のハードルで落ち続けています。リクエスト パラメータを介して customerId を実行しています。しかし、popupPanel で RichFaces commandButton を押すと、その customerId は使用できなくなります。

一部のデータを管理するアプリケーションをセットアップしています。基本的に、ある画面から顧客を選択すると、「リポジトリ」を含む別の画面に移動し、そこで作成、編集などを行うことができます。この 2 番目のリポジトリ ページには、次の URL からアクセスできます。

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

次に、この値を取得する Bean を用意します。

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

    private Long customerId;

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

次に、リポジトリ ページのメタデータを介して顧客 ID を設定し、init を呼び出します。

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

これは最初のうちはうまくいきます。提供されたIDで顧客に必要な情報を表示できます。しかし、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 の使用など) は、Seam 3 には適用できないようです。

4

1 に答える 1

1

RepositoryBeanRequestScoped であり、特に保存ボタンを押すと、リクエストごとに新しく作成されます。

簡単な解決策は、ConversationScoped にプロモートRepositoryBeanし、ページに入ると長時間実行されるようにすることです。

@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そのための最も簡単な方法は、代わりに seam 3 ビューアクションをダンプして使用することです。

<f:metadata>
  <f:viewParam name="customer" value="#{repositoryBean.customerId}"/>
  <s:viewAction action="#{repositoryBean.init}" if="#{conversation.transient}"/>
</f:metadata>
于 2011-06-30T05:07:03.717 に答える