Когда использовать NavigationHandler.handleNavigation и ExternalContext.redirect/dispatch

Казалось бы, следующие эквиваленты:

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

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

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

Ответы

Ответ 1

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

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

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

См. также: