Семантика "? Faces-redirect = true" в <commandlink action =...> и почему бы не использовать ее везде

Я хотел бы понять, какова семантика за добавлением "?faces-redirect=true" в свойство action тега <h:commandlink> в JSF2.0. Независимо от того, с ней или без нее, приложение действительно переходит на целевую страницу, указанную в действии. Таким образом, на первый взгляд кажется, что единственный эффект является косметическим, то есть предоставлять обратную связь пользователю (если он смотрит URL-адрес, посещенный браузером), который он переместил на новую страницу. Но если это так безобидно и без побочных эффектов, я не понимаю, почему это не поведение по умолчанию. Я подозреваю, что это связано с пост-основанным механизмом JSF2.0. Я заметил при просмотре приложения JSF, что URL-адреса, которые вы видите в его браузере (когда ?faces-redirect=true не используется), являются страницами "предыдущей" "страницы".

мета-NB. Я за брандмауэром и страдает от проблемы "SO требует внешнего JavaScript из другого домена", поэтому я приношу свои извинения за отсутствие форматирования. Я также отвечу на ваши ответы в течение нескольких часов, когда я получу доступ из другого домена.

Ответ 1

Навигация по страницам на странице не должен выполняться с помощью POST. Для этого вы должны использовать обычные <h:link> или <h:button> вместо <h:commandLink> или <h:commandButton>.

Итак, вместо

<h:commandLink value="Next page" action=nextpage.xhtml?faces-redirect=true" />

вы действительно должны использовать

<h:link value="Next page" outcome="nextpage.xhtml" />

Это имеет большое преимущество, что веб-сайт теперь оптимизирован для SEO. Searchbots именно не индексирует формы.

Используйте <h:commandLink> только, если вам нужно отправить форму с некоторым пользовательским вводом. Но более чем часто результат представлен только на той же странице, если это необязательно условно отображено/включено. Только на успешных отправках, которые абсолютно необходимо переходить на другую страницу (например, логин/выход из системы), вы действительно должны отправлять перенаправление. Это так называемый шаблон Post-Redirect-Get.

См. также