具体的な問題は、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";
}
以下も参照してください。