如果我提交由以下网址制作的网址:
<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
扩展。
答案 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()