3

次のURLで送信した場合:

<portlet:actionURL name="myAction" />

私はffのようなものになってしまいます。レンダリングフェーズ後のブラウザのURL:

http://localhost:8080/...&_myportlet_WAR_myportlet_javax.portlet.action=myAction&...

これに伴う問題は、ブラウザの更新ボタンをクリックすると、アクションが再度実行されることです。おそらく、これはURLにそのパラメータが存在するためです。

Liferayがレンダリング後のURLにそのパラメーターを含める理由と、その修正または回避策があるかどうかを誰かが知っていますか?

編集:私のポートレットクラスはから拡張されcom.liferay.util.bridges.mvc.MVCPortletます。

4

1 に答える 1

4

これに伴う問題は、ブラウザの更新ボタンをクリックすると、アクションが再度実行されることです。おそらく、これはURLにそのパラメータが存在するためです。

私はそうは思わない。HTTPPOSTメソッドを使用してデータを送信したことが原因である可能性があります。または、GETを介してデータを送信していますか?もしそうなら、それは奇妙な振る舞いになります。

URLのパラメータについて:答えはありませんが、この動作は私にとって驚きではありません。たとえばdoGet()doPost()メソッドを使用してサーブレットを作成するとします。投稿を介してURLにデータを送信すると(おそらく何らかのアクションを実行するため)、doPost()メソッドの応答は送信されたURLに相対的であるため、結果のページのURLは同じになります。ここでも同じロジックに従うことができます。アクションフェーズに送信した場合、送信されたURLが結果のURLになります。

どのように対処しますか?答えはPOST-REDIRECT-GETパターンです。メソッドからブラウザにHTTP302応答を送信する必要がありprocessAction()ます。通常は、ブラウザを元のページにリダイレクトします。

それを行うのは簡単です。フォームページのJSPは、フォームの入力に現在のURLを保存する必要があります。

<%
    String redirect = PortalUtil.getCurrentURL(renderRequest);
%>
<input type="hidden" name="<portlet:namespace />redirect" value="<%= redirect %>">

次に、でこのURLにリダイレクトしますprocessAction()Liferay MVCPortletを使用している場合はsendRedirect()、すべての操作の後にメソッドを呼び出す必要があります。

public void processAction(ActionRequest req, ActionResponse resp) {
    // Doing stuff
    sendRedirect(req, resp);
}

元のURLの値が呼び出されたリクエストパラメータにある場合、"redirect"このメソッドは魔法のように元のページにリダイレクトします。

Liferay MVCを使用しておらず、代わりにの単なるサブクラスを使用している場合GenericPortletは、リクエストからURLを取得し、次のメソッドを使用しますActionResponse.sendRedirect()

public void processAction(ActionRequest req, ActionResponse resp) {
    // Doing stuff
    String redirect = (String)actionRequest.getAttribute("redirect");
    resp.sendRedirect(redirect);
}
于 2011-12-07T19:58:57.280 に答える