Когда использовать NavigationHandler.handleNavigation против ExternalContext.redirect / dispatch - PullRequest
16 голосов
/ 08 июня 2011

Может показаться, что следующее эквивалентно:

FacesContext.getCurrentInstance().getApplication().getNavigationHandler().handleNavigation("/index.xhtml?faces-redirect=true");

FacesContext.getCurrentInstance().getExternalContext().redirect("/testapp/faces/index.xhtml");

Существуют ли различия и когда каждый из них следует использовать?

1 Ответ

16 голосов
/ 08 июня 2011

С подходом NavigationHandler#handleNavigation() вы зависите от реализованных обработчиков навигации. Вы или третье лицо можете легко переопределить / предоставить это в веб-приложении. Это может быть выгодно, если вы хотите более точный контроль, но это может быть невыгодно, если вы вообще не хотите иметь внешние контролируемые влияния. Использование определенных URL-адресов и / или параметров может потенциально привести к другому поведению навигации.

ExternalContext#redirect() делегируется под одеялом немедленно HttpServletResponse#sendRedirect(), без привлечения какого-либо навигационного обработчика. Так что это может быть преимуществом, когда использование обработчика навигации потенциально невыгодно. Но недостатком является то, что он не обрабатывает неявную навигацию и не принимает во внимание определенные случаи навигации.

В целом, это зависит :) Если вы просто хотите полноценного и точечного перенаправления, используйте ExternalContext#redirect(). Если вы хотите переходить по результату вместо URL, используйте NavigationHandler#handleNavigation().

Смотри также:

...