3

たとえば、検索ページと結果ページを使用してみましょう。検索ページと結果ページを処理する ViewScoped Bean がある場合、次のようなものを使用して URL を介してパラメーターを渡すことができます。

search.xhtml

<p:commandButton value="Search" type="submit" action="#{searchBacker.search}" >

バッキングビーン

@ManagedBean(name="search")
@ViewScoped
public class searchBacker extends AbstractBacking {

  private String firstName = null;
  private String lastName = null;
  private String results = null;

  public String search() {
    return "results?faces-redirect=true&amp;includeViewParams=true";
  }

  public void getResults() {
    MyDAO dao = new MyDAO();
    results = dao.getResults(firstName, lastName);
  }

  //getters and setters
}

results.xhtml

<f:metadata>
  <f:event type="preRenderView" listener="#{searchBacker.getResults}" />
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>

ここで、2 つのマネージド Bean があるとします。1 つは検索ページ用で、もう 1 つは結果ページ用です。

クエリ文字列は 2 つの異なるマネージド Bean を使用して URL に組み込まれますか? それとも、両方のページに同じマネージド Bean を使用する場合にのみ機能しますか?

アップデート

<f:viewParam>search.xhtml と results.xhtml のページに同じものがありますが、唯一の違いは、results.xhtml では search.xhtml とf:viewParam valueは異なる支援者を指していることです。これを行うと、URLを介してパラメーターが渡されません。f:viewParam valueresults.xhtml で search.xhtml で使用しているのと同じバッカーを指すと、パラメーターは URL を介して正常に渡されますが、必要な結果バッカーに値が存在しません。results.xhtml ページに sが重複している場合f:viewParam(1 つは検索バッカー、もう 1 つは結果バッカー)、すべて正常に動作します。f:viewParamこれを行う正しい方法は、両方のマネージド Bean で同じ を 2 つ持つことですか?

例:

results.xhtml - パラメータは URL を介して渡されますが、resultsBacker では使用できません

<f:metadata>
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
</f:metadata>

results.xhtml - URL を介して渡されるパラメーターはありません

<f:metadata>
  <f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>

results.xhtml - パラメータは URL を介して渡され、resultsBacker で利用できますが、扱いにくいようです。これはこれを行う正しい方法ですか、それともまだ何か不足していますか?

<f:metadata>
  <f:viewParam name="firstName" value="#{searchBacker.firstName}"/>
  <f:viewParam name="firstName" value="#{resultsBacker.firstName}"/>
  <f:viewParam name="lastName" value="#{searchBacker.lastName}"/>
  <f:viewParam name="lastName" value="#{resultsBacker.lastName}"/>
</f:metadata>
4

2 に答える 2

3

includeViewParamsソース ビューとターゲット ビューの両方で、目的のビュー パラメータが として宣言されている場合にのみ機能し<f:viewParam>ます。

したがって、あなたの特定のケースでは、 との両方<f:viewParam>に非常に同じ sを配置する必要があります。つまり、現在のビューのビュー パラメーターのみを取得し、ターゲット ビューで宣言されているパラメーターのみを適用します。namesearch.xhtmlresults.xhtmlincludeViewParams

以下も参照してください。


具体的な問題とは関係ありませんが、事実上 GET フォームが必要なようです。その場合、パラメータを指定して POST-Redirect-GET を実行するよりも良い方法があります。上記の「関連項目」リンクの一番下を見てください。

于 2013-08-04T16:09:40.110 に答える