web-dev-qa-db-ja.com

JSF2のアクションからナビゲートするとき、どのようにビューパラメーターを渡しますか?

Beanのアクションから、ビューパラメーターが必要な別のページにリダイレクトしようとしています。 JSF2でこれを行うための推奨される方法は何ですか?

たとえば、ソースページが http://localhost/page1.xhtml であるとします

アクションを呼び出すcommandButtonがあります。

<h:commandButton value="submit" action="#{myBean.submit}" />

私の豆は次のように見えます:

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success";
}

そして今、私は 'submit'アクションのリターンが http://localhost/page2.xhtml?id = 2 にナビゲートすることを望んでいます

私はナビゲーションの場合、view-paramを使用してこれを実行しようとしましたが、奇妙な結果になりました。 faces-configスニペットは次のようになります。

<navigation-rule>
    <from-view-id>/page1.xhtml</from-view-id>
    <navigation-case>
        <from-outcome>success</from-outcome>
        <to-view-id>/page2.xhtml</to-view-id>
        <redirect>
            <view-param>
                <name>id</name>
                <value>#{myBean.id}</value>
            </view-param>
        </redirect>
    </navigation-case>
</navigation-rule>

MyBeanはスコープを要求するように設定されていますが、アプリケーションを初めてロードするときにのみmyBean.getId()を呼び出し、後続のすべての呼び出しで同じ値を再利用し、page2の誤ったビューパラメーターを生成します。

そのため、これを行うためのより良い方法、またはview-paramが毎回Beanから要求されない理由/解決策を探しています。

36
dule

JSFでパラメーターを渡すことに関する直感的でないことは、(アクションで)送信するものを決定するのではなく、(ターゲットページで)受信するものを決定することです。

リダイレクトで終わるアクションを実行すると、ターゲットページのメタデータが読み込まれ、必要なすべてのパラメーターが読み込まれ、paramsとしてURLに追加されます。

これは、他のJSFバインディングとまったく同じメカニズムであることに注意してください。inputTextの値を1か所から読み取って、他の場所に書き込むことはできません。 viewParamで定義された値式は、読み取り(リダイレクト前)と書き込み(リダイレクト後)の両方に使用されます。

Beanを使用すると、次のことができます。

@ManagedBean
@RequestScoped
public class MyBean {

private int id;

public String submit() {
    //Does stuff
    id = setID();
    return "success?faces-redirect=true&includeViewParams=true";
}

// setter and getter for id

受信側が次の場合:

    <f:metadata>
        <f:viewParam name="id" value="#{myBean.id}" />
    </f:metadata>

それはまさにあなたが望むことをします。

53
fdreger

より良い解決策がなければ、私が動作することがわかったのは、単にBeanリターンでクエリ文字列を構築することです:

public String submit() {
    // Do something
    return "/page2.xhtml?faces-redirect=true&id=" + id;
}

最も柔軟なソリューションではありませんが、私が望むように機能するようです。

また、このアプローチを使用して、クエリ文字列を構築するプロセスをクリーンアップします。 http://www.warski.org/blog/?p=185

15
dule

これらをチェックしてください:

次のようなものが必要になります。

<h:link outcome="success">
  <f:param name="foo" value="bar"/>
</h:link>

...そして...

<f:metadata>
  <f:viewParam name="foo" value="#{bean.foo}"/>
</f:metadata>

このページ から判断すると、次のような方が簡単かもしれません。

 <managed-bean>
   <managed-bean-name>blog</managed-bean-name>
   <managed-bean-class>com.acme.Blog</managed-bean-class>
   <managed-property>
      <property-name>entryId</property-name>
      <value>#{param['id']}</value>
   </managed-property>
 </managed-bean>
2
The Alchemist

次のようなPrimefacesを使用して実行できます。

<p:button 
      outcome="/page2.xhtml?faces-redirect=true&amp;id=#{myBean.id}">
</p:button>
0
ihebiheb

見られる属性をリダイレクトタグに以下のように追加します。

<redirect include-view-params="true">
    <view-param>
        <name>id</name>
        <value>#{myBean.id}</value>
    </view-param>
</redirect>

ここ は、いくつかのナビゲーション例です。

0
Koray Tugay