问题在于,如果我单击浏览器的刷新按钮,该操作将再次执行。据推测,这是由于 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);
}