问题在于,如果我点击浏览器的刷新按钮,这个操作会再次执行。可能是由于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) {
sendRedirect(req, resp);
}
如果原始URL的值在名为
"redirect"
的请求参数中,则此方法将神奇地将您重定向回原始页面。
如果您不使用 Liferay MVC,而是使用
GenericPortlet
的子类,请从请求中检索URL并使用
ActionResponse.sendRedirect()
方法:
public void processAction(ActionRequest req, ActionResponse resp) {
String redirect = (String)actionRequest.getAttribute("redirect");
resp.sendRedirect(redirect);
}