JSF commandLink, POSTing и кнопка возврата - PullRequest
5 голосов
/ 04 августа 2009

Я недавно начал заниматься JSF - до этого я всегда использовал PHP или Python для веб-разработки.

Я был несколько удивлен, обнаружив, что JSF использует HTTP POST для навигации при использовании тега h: commandLink.

Я использовал commandLink, так как это, по-видимому, правильный способ создания приложений JSF. Почему JSF использует POST для навигации? Что не так с GET? Я могу только предположить, что Javascript, который автоматически генерируется JSF для событий onclick, может превышать максимальную длину для запроса GET.

У меня уже есть несколько страниц, которые перемещаются с помощью h: commandLink. Это работает хорошо, пока я не использую кнопку назад браузера. Как мне обращаться с кнопкой «Назад» в JSF?

Я изо всех сил пытаюсь понять, почему JSF был построен вокруг POST. Это нарушает закладки, бэк-пейджинг и возможность индексировать вашу страницу в поисковых системах.

Ответы [ 3 ]

4 голосов
/ 05 августа 2009

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

1 голос
/ 06 января 2012

Как сказал BalusC в своем блоге , GET следует использовать для навигации между страницами. Используйте h:outputLink для навигации.

Вы можете прочитать его PostRedirectGetListener, и он решит сообщение подтверждения возврата / обновления формы.

Я советую вам добавить следующее к beforePhase для обработки частичной обработки ajax (если применимо):

if(event.getFacesContext().getPartialViewContext().isAjaxRequest())
{
    return;
}
1 голос
/ 04 августа 2009

Да. JSF построен на основе POST, и это одна из главных претензий JSF. Взгляните на JAX-RS / Seam или Spring для закладок страниц GETable.

...