0

いろいろ調べてみましたが、答えが見つからないようですので、よろしくお願いします。

Apache StrutsPortletBridgeを使用してJSR-168ポートレットに変換したStruts1.2.7Webアプリがあります。

これは、リダイレクトを指定するactionforwardsが実際には指定されたアクションにリダイレクトされないということを除いて、すべて非常にうまく機能しています。これらのリダイレクトは、アプリを通常のStrutsWebアプリとして実行するときに機能します。したがって、ポートレットバリアントで二重送信の問題が発生します。

タイル定義に転送するアクションで終わるアクションチェーンを利用します。例えば:

<action path="/CreateIdmAccountSubmit"  validate="true"   input="catalog.createaccount.page" type="com.konakart.actions.login.CreateIdmAccountSubmitAction" name="CreateIdmAccountForm">
        <forward name="FillRegistrationData" path="/FillRegistrationData.do" redirect="true"/>
    </action>

<action path="/FillRegistrationData" validate="false" type="com.konakart.actions.registration.FillRegistrationDataAction" name="FillRegistrationDataForm">
        <forward name="FillRegistrationDataPage" path="/FillRegistrationDataPage.do" redirect="false"/>
    </action>

<action path="/FillRegistrationDataPage" forward="order.registrationdata.page"/> (tiles-def)

この例では、アクション/ CreateIdmAccountSubmitが送信済みフォーム(POST)を処理し、データベースにアカウントを作成します。作成が成功すると、ユーザーは別のアクション(/ FillRegistrationData)にリダイレクトされます。このアクションは、注文オブジェクトを初期化し、次に、tiles-defs.xmlでレイアウトが定義されている注文登録ページに転送します。

私が言ったように、これはすべて非常にうまく機能し、機能的な観点を形成しますが、ユーザーがレンダリングされた注文登録ページでf5を押すと、アクション/ CreateIdmAccountSubmitが再度呼び出され、アカウントが二重に作成されます。私が言ったように、これは通常のWebアプリとしてアプリを実行しているときも起こりません。ここでは、メカニズムは完全に機能します:)

問題はリダイレクトが間違ったフェーズで行われているという事実によって引き起こされていると思いますが、なぜこれが機能しないのか本当にわかりません:)

私が読んだものに基づいて、リダイレクトの問題を修正するために次のことを試みました:*フォームが送信するアクションをstruts-portlet-config.xmlで「actionUrl」として指定しました(リダイレクトが間違ったフェーズで行われることを期待していますか?)*置き換えられましたstruts-portletバリアントによる通常のhtmlタグライブラリ(有効なurl actionUrlが私のhtml:formによって生成され、何らかの方法でリダイレクトが可能になることを期待していますか?)

これらの2つの手順は役に立たなかったようで、二重送信の問題を防ぐために、ポートレットで単純なリダイレクトを実行する方法に迷いました。

皆さんが私を助けてくれることを願っています!

4

1 に答える 1

2

私は答えを見つけました:メカニズムはポータルの実装に依存しています。デフォルトではリダイレクトで機能しないLiferayを使用します。

ただし、liferay-portlet.xmlで次の要素を宣言することで、これをオンに切り替えることができます。

<action-url-redirect>true</action-url-redirect>

これで問題が解決しました。

于 2012-07-26T09:01:52.407 に答える