Командная ссылка JSF, публикация и кнопка "Назад"
-
22-07-2019 - |
Вопрос
Недавно я начал выполнять некоторую работу над JSF - до этого я всегда использовал PHP или Python для веб-разработки.
Я был несколько удивлен, обнаружив, что JSF использует HTTP POSTs для навигации при использовании тега h: CommandLink .
Я использовал CommandLink, поскольку это, по-видимому, правильный способ создания приложений JSF.Почему JSF использует POST для навигации?Что плохого в GET?Я могу только предположить, что Javascript, который автоматически генерируется JSF для событий onclick, может превышать максимальную длину для запроса GET.
У меня уже есть несколько страниц, навигация по которым осуществляется с помощью h: CommandLink.Это хорошо работает до тех пор, пока я не воспользуюсь кнопкой "Назад" браузера.Как мне следует обращаться с кнопкой "Назад" в JSF?
Я изо всех сил пытаюсь понять, почему JSF был создан вокруг этого ПОСТА.Это нарушает создание закладок, перелистывание страниц назад и возможность индексирования вашей страницы в поисковых системах.
Решение
Это не поможет вам создать ссылку на клиенте, но следует помнить о outputLink .
Существует элемент перенаправления для правил навигации, который может помочь при некоторых проблемах с обновлением.
<navigation-rule>
<display-name>navBack</display-name>
<from-view-id>/navBack.jsp</from-view-id>
<navigation-case>
<from-outcome>navTo</from-outcome>
<to-view-id>/navTo.jsp</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
Если ничего не помогло, вы можете выполнить URL перенаправления самостоятельно, как в этом действии:
public String doAction() {
System.out.println("Did some non-idempotent operation");
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext extContext = context.getExternalContext();
Application app = context.getApplication();
ViewHandler viewHandler = app.getViewHandler();
String url = viewHandler.getActionURL(context, "/navTo.jsp");
url = url + (url.indexOf('?') < 0 ? '?' : '+') + "foo=bar";
url = extContext.encodeResourceURL(url);
try {
extContext.redirect(url);
} catch (IOException e) {
throw new FacesException(e);
}
return null;
}
Предостережения: я не могу вспомнить, правильно ли я кодирую URL.
Различные сторонние библиотеки добавляют разные возможности. Я не уверен, что что-то было сделано в JSF 2.0 в этой области, но это может стоить посмотреть.
Другие советы
Ага.JSF построен вокруг POST, и это один из самых больших камней преткновения в JSF.Взгляните на JAX-RS / Seam или Spring, чтобы найти страницы, которые можно добавлять в закладки.
Как сказал BalusC в своем блоге , GET следует использовать для навигации между страницами.
Используйте h: outputLink
для навигации. Р>
Вы можете прочитать его PostRedirectGetListener, и он решит сообщение подтверждения возврата / обновления формы.
Я советую вам добавить следующее в beforePhase
для обработки частичной обработки ajax (если применимо):
if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
return;
}