これに伴う問題は、ブラウザの更新ボタンをクリックすると、アクションが再度実行されることです。おそらく、これは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);
}