22

私は3つのページを持っています:

  • main.xhtml
  • agreement.xhtml
  • generated.xhtml

agreement.xhtmlを正しくロードするにはserviceId、 との2 つのパラメータが必要siteです。したがって、通常の URL は次のようになります/app/agreement.xhtml?site=US&serviceId=AABBCC

私はこのボタンをオンにしていますagreement.xhtml

<h:form>
   <h:commandButton value="Generate License File" action="#{agreement.generateMethod}" />   
</h:form>

@RequestScopedBeanには次の#{agreement}メソッドがあります。

public String generateMethod(){
    .......
    return "generated";
}

クリックするとgenerateMethod()メソッドが実行され、実行後、ユーザーがgenerated.xhtmlページにリダイレクトされる必要があります。何が起こっているかというと、クリックすると、ページ ブラウザーがユーザーを/app/agreement.xhtmland に送信します。パラメーターsiteとを送信していないためserviceId、クラッシュします。

generateMethod()リターンを にしようとしました"generated?faces-redirect=true"が、まだ何もありません。何か案は?

4

2 に答える 2

39

具体的な問題は、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";
}

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

于 2013-07-19T11:59:38.177 に答える
6

あなたgenerateMethodは戻らなければならないでしょう

return "generated?site=US&amp;serviceId=AABBCC&amp;faces-redirect=true";

&amp;xhtmlで置き換えることもできます&が、エスケープすることもできます。

あなたはこのようgenerated.xhtmlに渡されているパラメータをキャッチすることができます<f:viewParam>

<f:metadata>
    <f:viewParam name="site" value="#{yourBean.site}"/><!--Make sure you have a setter-->
    <f:viewParam name="serviceId" value="#{yourBean.serviceId}"/><!--Make sure you have a setter-
</f:metadata>
<h:head>
于 2013-07-18T23:16:10.517 に答える