具体的な問題は、JSF<h:form>がデフォルトでクエリ文字列なしで現在のリクエスト URL に送信されるために発生します。生成された HTML 出力をよく見てください。
<form action="/app/agreement.xhtml" ...>
したがって、これらのリクエスト パラメータを自分で明示的に含める必要があります。これを解決するにはいくつかの方法があります。リダイレクトを送信していない場合は、それらを非表示の入力として JSF フォームに追加できます。
<h:form>
<input type="hidden" name="site" value="#{param.site}" />
<input type="hidden" name="site" value="#{param.serviceId}" />
...
</h:form>
ただし、これらのパラメーターはブラウザーのアドレス バーの URL に再表示されません。同じページで ajax のみを使用している場合、これは問題になりません。フォームで変換エラーまたは検証エラーが発生すると、混乱を招くように値が失われるため、<h:inputHidden>は適切ではありません。
<f:viewParam>それらを URL に再表示するには、とが必要ですincludeViewParams。作業を開始するには、両方のソース ページincludeViewParamsで次のように宣言する必要があります...agreement.xhtml
<f:metadata>
<f:viewParam name="site" value="#{agreement.site}" />
<f:viewParam name="serviceId" value="#{agreement.serviceId}" />
</f:metadata>
...そしてターゲットページgenerated.xhtml:
<f:metadata>
<f:viewParam name="site" value="#{generated.site}" />
<f:viewParam name="serviceId" value="#{generated.serviceId}" />
</f:metadata>
これで、次のようにビュー パラメーターを含むリダイレクトを送信できます。
public String generateMethod() {
// ...
return "generated?faces-redirect=true&includeViewParams=true";
}
@ViewScopedフォームでページを開いてからフォームを送信するまでの間、さらに検証エラーが発生した場合でも、これらのパラメーターを有効に保つために、Bean を使用する必要があることに注意してください。@RequestScopedそれ以外の場合、 Beanに固執する場合<f:param>は、コマンド コンポーネントのようにそれらを保持する必要があります。
<h:commandButton ...>
<f:param name="site" value="#{generated.site}" />
<f:param name="serviceId" value="#{generated.serviceId}" />
</h:commandButton>
入力コンポーネント内でそれらを設定する方法はありません。<f:ajax>その場合、Bean は実際には@ViewScoped.
あるいは、すでに JSF ユーティリティ ライブラリOmniFaces<h:form>を使用している場合は、次のようにbyを置き換えることもでき<o:form>ます ( showcase exampleも参照)。
<o:form>
基本的にはそれだけです。<form action>これにより、現在のクエリ文字列が含まれた が生成されます。
<form action="/app/agreement.xhtml?site=US&serviceId=AABBCC" ...>
これらのリクエスト パラメータは、フォーム送信のリクエスト パラメータ マップで使用できます。追加のメタデータ/viewparams は必要ありません。また、リダイレクトを送信する必要もありません@RequestScoped。必要に応じて、Bean を保持できます。
public String generateMethod() {
// ...
return "generated";
}
以下も参照してください。