为什么Liferay 6.0.6在后渲染URL中包含portlet动作参数?

时间:2011-12-07 09:52:38

标签: liferay liferay-6

如果我提交由以下网址制作的网址:

<portlet:actionURL name="myAction" />

我最终得到了像ff这样的东西。渲染阶段后浏览器中的URL:

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

问题在于,如果我点击浏览器的刷新按钮,则会再次执行该操作。据推测,这是由于URL中存在该参数。

有没有人知道为什么Liferay会在后期渲染中包含该参数,以及是否有针对它的修复或解决方法?

编辑:我的portlet类从com.liferay.util.bridges.mvc.MVCPortlet扩展。

1 个答案:

答案 0 :(得分:4)

  

问题在于,如果我点击浏览器的刷新按钮,则会再次执行该操作。据推测,这是由于URL中存在该参数。

我对此表示怀疑。这可能是因为您通过HTTP POST方法提交了数据。或者您是通过GET提交数据?如果是这样,那将是一种奇怪的行为。

关于URL中的参数:我没有答案,但这种行为对我来说并不奇怪。例如,假设我们使用doGet()doPost()方法创建一个servlet。如果我通过帖子向URL提交一些数据(可能是为了执行某些操作),doPost()方法的响应将与提交的URL相关,因此结果页面的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()中重定向到此网址。 如果您使用的是Liferay MVCPortlet ,则只需在所有操作后调用sendRedirect()方法:

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

如果原始网址的值位于名为"redirect"的请求参数中,则此方法会将您神奇地重定向回原始网页。

如果你使用Liferay MVC ,而只是GenericPortlet的子类,只需从请求中检索URL并使用方法{{1 }}:

ActionResponse.sendRedirect()