为什么Liferay 6.0.6在post-render URL中包含portlet action参数?

3

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

<portlet:actionURL name="myAction" />

在渲染阶段后,我最终在浏览器中得到类似以下的URL:
http://localhost:8080/...&_myportlet_WAR_myportlet_javax.portlet.action=myAction&...

这样做的问题在于,如果我点击浏览器的刷新按钮,操作会再次执行。这可能是由于URL中存在该参数引起的。
有人知道为什么Liferay在渲染后在URL中包含该参数,是否有解决方法或解决方法?
编辑:我的portlet类扩展自com.liferay.util.bridges.mvc.MVCPortlet

你使用的是哪个框架?你正在使用Liferay MVCPortlet类吗? - brandizzi
是的,我正在使用com.liferay.util.bridges.mvc.MVCPortlet。 - Chry Cheng
1个回答

4
问题在于,如果我点击浏览器的刷新按钮,这个操作会再次执行。可能是由于URL中存在该参数所致。
我不太确定。可能是因为您通过HTTP POST方法提交了数据。或者您是通过GET提交数据的吗?如果是这样,那么这将是一种奇怪的行为。
关于URL中的参数:我没有答案,但这种行为对我来说并不奇怪。例如,假设我们创建了一个具有doGet()doPost()方法的servlet。如果我通过post向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()中,您需要重定向到此URL。如果您正在使用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);
}

有没有完整的代码啊?因为从代码上理解起来更容易。 - IConfused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接