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

129

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

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

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

нужно больше jquery

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

Мэтт Болл
источник

Ответы:

195

<h:outputLink>Оказывает fullworthy HTML <a>элемент с соответствующей URL в hrefатрибуте , который выстреливает запрос bookmarkable 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 шаблона), только улучшает bookmarkability целевой страницы , когда связь на самом деле нажата (URL - адрес не будет «один за» больше) , но это не меняет hrefот <a>элемента , чтобы быть fullworthy 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-компонента.

Смотрите также:

BalusC
источник
2
Нет, не должно быть. В UICommandкомпонент должны входить только UIFormкомпоненты.
BalusC
3
На самом деле нет. Как правило, по возможности придерживайтесь ссылок h:outputLinkили h:linkдля них. SEO не следует недооценивать. Кстати, для хороших URL-адресов, подобных REST, как здесь, на SO, взгляните на PrettyFaces .
BalusC
1
Нет, разница в том, что в качестве значения используется h:linkидентификатор представления JSF (например page), а в качестве значения h:outputLink- реальный URL-адрес (например, /page.xhtmlили /page.jsfили другое в зависимости от FacesServletсопоставления). Кодирование URL-адреса происходит в любом случае в обоих случаях. Между прочим, нет никакой разницы между поведением рендеринга EL в тексте шаблона #{...}и h:outputText. Оба экранируют предопределенные объекты XML (нет, это не то же самое, что кодирование URL). В h:outputTextтолько предложения больше attribtues нравится id, styleClassи т.д. , чтобы управлять компонентом и / или разметки.
BalusC
1
@BalusC Что именно вы подразумеваете под "полноценным HTML" в первой строке вашего ответа?
Компьютерщик
1
@Geek: просто один <a>элемент HTML , ничего
лишнего
4

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

Ashok
источник
1
Я считаю, что трудно поверить. Помимо слухов / ваших собственных анекдотических свидетельств, есть ли у вас что-нибудь в поддержку этого?
Мэтт Болл,
5
@Matt: Я могу представить, что это медленнее, когда у вас есть эта ссылка навигации POST внутри формы «Бог» на странице, например, с таблицей данных с> 1000 строками, содержащими 3 поля ввода на строку. Но у такой страницы все равно есть другие серьезные проблемы :)
BalusC