Когда я должен использовать h: outputLink вместо h: commandLink? - PullRequest
127 голосов
/ 30 ноября 2010

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

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

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

needs more jquery

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

Ответы [ 2 ]

190 голосов
/ 30 ноября 2010

<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-Получить шаблон ), только улучшает закладку целевой страницы, когда ссылка фактически нажата (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 в качестве свойств компонента.

См. Также:

4 голосов
/ 20 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...