Командная ссылка JSF, публикация и кнопка "Назад"

StackOverflow https://stackoverflow.com/questions/1227553

  •  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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top