2011-12-07 5 views
3

は私がによって生成されたURLに提出する場合:Liferay 6.0.6にレンダリング後のURLにポートレットアクションパラメータが含まれているのはなぜですか?

<portlet:actionURL name="myAction" /> 

が、私はFFのようなもので終わります。レンダリングフェーズの後、ブラウザでURL:

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

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

なぜLiferayにURLレンダリング後のそのパラメータが含まれているのか誰かが知っていますか?

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

+0

使用しているフレームワーク? Liferay MVCPortletクラスを使用していますか? – brandizzi

+0

はい、私はcom.liferay.util.bridges.mvc.MVCPortletを使用しています。 –

答えて

4

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

私はそうだと思います。これはおそらく、HTTP POSTメソッドを使用してデータを送信したためです。または、GETを通じてデータを提出していますか?もしそうなら、それは奇妙な行動になります。

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

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

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

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

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

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

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

あなただけの要求からURLを取得し、方法ActionResponse.sendRedirect()を使用し、LiferayのMVC代わりGenericPortletの単なるサブクラスを使用していないある場合:

public void processAction(ActionRequest req, ActionResponse resp) { 
    // Doing stuff 
    String redirect = (String)actionRequest.getAttribute("redirect"); 
    resp.sendRedirect(redirect); 
} 
+0

誰かが完全なコードを持っていますか?なぜなら、私はコードから理解しやすいからです。 – IConfused

関連する問題