Проблема в том, что, если я нажму на кнопку обновления браузера, действие будет выполнено снова.Предположительно, это связано с наличием этого параметра в URL.
Я сомневаюсь в этом.Вероятно, потому, что вы отправили данные через метод HTTP POST.Или вы отправляете свои данные через GET?Если это так, это будет странное поведение.
О параметре в URL: у меня нет ответа, но это поведение меня не удивляет.Предположим, например, что мы создаем сервлет с методами doGet()
и doPost()
.Если я отправлю некоторые данные в 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);
}