Почему Liferay 6.0.6 включает параметр действия портлета в URL-адресе после рендеринга? - PullRequest
3 голосов
/ 07 декабря 2011

Если я отправлю URL, созданный:

<portlet:actionURL name="myAction" />

, я получу что-то вроде ff.URL в браузере после фазы рендеринга:

http://localhost:8080/...&_myportlet_WAR_myportlet_javax.portlet.action=myAction&...

Проблема в том, что, если я нажму на кнопку обновления браузера, действие будет выполнено снова.Предположительно, это связано с наличием этого параметра в URL.

Кто-нибудь знает, почему Liferay включает этот параметр в пост-рендеринг URL-адреса и существует ли для него исправление или обходной путь?

РЕДАКТИРОВАТЬ: Мой класс портлетов расширяется от com.liferay.util.bridges.mvc.MVCPortlet.

1 Ответ

4 голосов
/ 07 декабря 2011

Проблема в том, что, если я нажму на кнопку обновления браузера, действие будет выполнено снова.Предположительно, это связано с наличием этого параметра в 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);
}
...