Ответ 1
<h:outputLink>
отображает полноценный элемент HTML <a>
с правильным URL-адресом в атрибуте href
, который запускает запрос GET с возможностью закладки, Он не может напрямую ссылаться на управляемый метод действия bean.
<h:outputLink value="destination.xhtml">link text</h:outputLink>
<h:commandLink>
отображает элемент HTML <a>
с onclick
script, который отправляет (скрытую) форму POST и может вызвать управляемый метод действия bean. Он также должен быть помещен внутри <h:form>
.
<h:form>
<h:commandLink value="link text" action="destination" />
</h:form>
Параметр ?faces-redirect=true
на <h:commandLink>
, который запускает перенаправление после POST (в соответствии с шаблоном Post-Redirect-Get), только улучшает возможность закладок на целевой странице, когда ссылка действительно нажата (URL-адрес больше не будет "позади" ), но он не меняет href
элемента <a>
на полноправный URL-адрес, Он по-прежнему остается #
.
<h:form>
<h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>
Начиная с JSF 2.0, также существует <h:link>
, который может принимать идентификатор вида (результат действия навигации) вместо URL. Он также сгенерирует элемент HTML <a>
с правильным URL-адресом в href
.
<h:link value="link text" outcome="destination" />
Итак, если это для чистой и закладочной навигации по страницам, например, для имени пользователя SO, используйте <h:outputLink>
или <h:link>
. Это также лучше для SEO, поскольку боты обычно не шифруют POST-формы и JS-код. Кроме того, UX будет улучшен, поскольку страницы теперь будут заклассифицированы, а URL-адрес больше не "один сзади".
При необходимости вы можете выполнить задание предварительной обработки в конструкторе или @PostConstruct
для @RequestScoped
или @ViewScoped
@ManagedBean
, которое подключено к целевой странице, о которой идет речь. Вы можете использовать @ManagedProperty
или <f:viewParam>
для установки параметров GET в качестве свойств bean.