Когда следует использовать h: outputLink вместо h: commandLink?

Когда следует использовать <h:outputLink> вместо <h:commandLink>?

Я понимаю, что commandLink создает HTTP-сообщение; Я предполагаю, что outputLink будет генерировать HTTP-запросы. Тем не менее, большинство материалов JSF Я читал исключительно commandLink (почти?).

Контекст: я реализую небольшой демо-проект, который показывает ссылку заголовка на пользовательскую страницу, так же, как Stack Overflow...

needs more jquery

... и я не уверен, что commandLink (возможно, с помощью ?faces-redirect=true для возможности закладки) или outputLink является правильным выбором.

Ответ 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.

См. также:

Ответ 2

Я также вижу, что загрузка страницы (производительность) занимает много времени при использовании h: commandLink, чем h: link. h: ссылка быстрее по сравнению с h: commandLink