5

つまり、webflow ビュー jsp で EL を使用して完全なクエリ文字列を取得するにはどうすればよいですか? これは私がやろうとしていることです:

<span class="forgot-password">
  <a href="forgotPasswordRequest?<%=request.getQueryString() %>">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

scriptlet の代わりに EL を使用したい場合を除き<%=request.getQueryString() %>ます。を使用して個々のパラメーターを取得するのは簡単に思えます${param.someParameterName}が、すべてが必要です。具体的には、CASを SSO プロバイダーとして使用しています。service認証するために、アプリは、認証の成功後に戻る URL であるパラメーターを含むクエリ文字列を使用して、ログインを CAS にリダイレクトします。このようなもの:

?service=http%3A%2F%2Fmysite.com%3A9080%2Fwelcome

CAS ログイン ページに、パスワードを忘れた場合の Webflow へのリンクがあります。そのサービス パラメータを他の Webflow に伝達する必要があります。だから私はこのようなことができます:

<span class="forgot-password">
  <a href="forgotPasswordRequest?service=${param.service}">
    <spring:message code="screen.welcome.link.forgotPassword" />
  </a>
</span>

しかし、その後、すべての URL エスケープが失われます。さらに、将来保存したい他のパラメーターがある場合、それらも失われます。

スクリプトレットは現在機能していますが、見苦しく、プレゼンテーションにコードを含めるのは好きではありません (これは真の Java コードであるため)。EL は確かにはるかに洗練されたソリューションです。

春のドキュメントにリストされているすべての特別な EL 変数を調べましたが、まだ完全な queryString を取得する方法を思いつくことができませんでした。

- - - - - - - - - - - - - - - - アップデート - - - - - - - - - ---------------

わかりましたので、いくつかの根拠を作成しています...ExternalContextインターフェースにgetNativeRequest()は、実際のHttpServletRequestオブジェクトである があることがわかりました。そこから、次のように完全なクエリ文字列を取得できます。

externalContext.getNativeRequest().getQueryString()

だから今、私はexternalContextと呼ばれる特別なEL変数があるので、私はこれを行うだけだと思います:

${externalContext.nativeRequest.queryString}

右?違う!externalContextJSP ページから変数を使用できないことが判明しました。理由を知っている人はいますか?ただし、flowRequestScopeJSP で使用でき、getExternalContextメソッドを持つ もあるので、これを行うことができます。

${flowRequestScope.externalContext.nativeRequest.queryString}

クール、それは機能します...しかし、なぜそれが必要なのですか? 特別な EL 変数の一部だけが JSP ページにプッシュされるのはなぜですか、また、それらの一部が変更されるのはなぜですか (viewScopeすべての値がルートに昇格されているように見えるため、viewScope.commandName は JSP で ${commandName} として参照されます)エル)?WebFlow の仕組みに根本的な何かが欠けているに違いありません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

0

Webflowでは、基本的にスコープマップは、サーバー上の制御ロジックを簡単に区別できるようにするためのものです。まっすぐなSpringMVCでは、それがコントローラーになりますが、Webフローでは、フローは多かれ少なかれこの目的に直接役立ちます。スコープマップに入力した事実上すべてが、JSPで使用するためにリクエスト属性にロールアップされます。ただし、フローが戻ったときに明示的に破棄されるリクエストスコープは除きます。これが、viewScope.commandNameがJSPで使用できる理由です。他のスコープと同様に、大きなリクエスト属性マップにロールアップされ、JSPがアクセスするリクエストに配置されるためです。

違いは、寿命の短いスコープが最初に使用されることです。Javaのローカル変数が同じ名前のクラスレベルの変数よりも優先されるのと同じように、より低いスコープは常により有効期間の長いスコープよりも優先されます。したがって、衝突の可能性がないように、万が一に備えて一意のパラメータ名を使用する必要があります。

その値が本当に必要な場合は、フローでsetタグを使用してその値を適切なスコープに設定し、次のように名前を付けやすくするのが最も簡単です。

<set name="viewScope.currentService" value="externalContext.nativeRequest.queryString" />

これにより、ビュースコープでEL変数「currentService」を使用できるようになります。この値をビューに保存するには、on-renderまたはon-entryを使用することをお勧めします。この特定の値については、ビューのレンダリング方法に基づいて変更される可能性があるため、おそらくon-renderを使用しますが、どちらの方法でも問題はない可能性があります。

于 2012-10-28T18:29:30.560 に答える