Когда я должен использовать h:outputLink вместо h:commandLink?
Когда я должен использовать <h:outputLink>
вместо <h:commandLink>
?
Я понимаю что commandLink
генерирует пост HTTP; Я предполагаю, что outputLink
будет генерировать HTTP получает. Тем не менее, большая часть учебного материала по JSF, который я прочитал, использует commandLink
(почти?) исключительно.
Контекст: я реализую небольшой демонстрационный проект, который показывает ссылку на заголовок страницы пользователя, очень похожую на Stack Overflow's...
... и я не уверен, если commandLink
(возможно, используя ?faces-redirect=true
для закладок) или outputLink
это правильный выбор.
2 ответа
<h:outputLink>
отображает полноценный HTML <a>
элемент с правильным URL-адресом в href
атрибут, который запускает закладочный запрос GET. Он не может напрямую вызывать метод действия управляемого компонента.
<h:outputLink value="destination.xhtml">link text</h:outputLink>
<h:commandLink>
отображает HTML <a>
элемент с onclick
скрипт, который отправляет (скрытую) форму POST и может вызывать метод действия управляемого компонента. Также необходимо поместить внутри <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 как свойства бина.
Смотрите также:
Я также вижу, что загрузка страницы (производительность) занимает больше времени при использовании h:commandLink, чем h:link. h: ссылка быстрее по сравнению с h:commandLink