3

如果我提交到由以下人员生成的 URL:

<portlet:actionURL name="myAction" />

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

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

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

有谁知道 Liferay 为什么在 URL 渲染后包含该参数,以及是否有修复或解决方法?

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

4

1 回答 1

4

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

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

关于 URL 中的参数:我没有答案,但这种行为对我来说并不奇怪。例如,假设我们使用doGet()doPost()方法创建了一个 servlet。如果我通过 post 向 URL 提交一些数据(可能是为了执行某些操作),则该doPost()方法的响应将与提交的 URL 相关,因此结果页面的 URL 将是相同的。我们可以在这里遵循相同的逻辑:如果您提交到操作阶段,则提交的 URL 将是结果。

如何处理?答案是POST-REDIRECT-GET模式。您应该从您的方法向浏览器发送HTTP 302响应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 回答