Коли я повинен використовувати h: outputLink замість h: commandLink?


129

Коли я повинен використовувати <h:outputLink>замість нього <h:commandLink>?

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

Контекст: Я реалізую маленький демонстраційний проект, який показує посилання на заголовок на сторінку користувача, як і Stack Overflow's ...

потребує більше 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 як властивості боба.

Дивитися також:


2
Ні, не повинно бути. У складі UICommandкомпонента потрібно входити лише UIFormкомпоненти.
BalusC

3
Ні, насправді. Як правило, коли ви можете, дотримуйтесь посилань h:outputLinkабо h:linkна них. SEO не варто недооцінювати. До речі, для приємних REST-подібних URL-адрес, як тут, на SO, подивіться на PrettyFaces .
BalusC

1
Ні, різниця в тому , що h:linkприймає вид JSF ID (наприклад page) в якості значення і h:outputLinkмає реальний URL (наприклад , /page.xhtmlчи /page.jsf, або інший в залежності від вашого FacesServletвідображення) в якості значення. Кодування URL-адрес все одно відбувається в обох випадках. До речі, немає різниці між поведінкою візуалізації EL у тексті шаблону #{...}та h:outputText. Обидва виходять із заздалегідь визначених об'єктів XML (ні, це не те саме, що кодування URL-адрес). В h:outputTextтільки пропозиції більше attribtues подобається id, styleClassі т.д. , щоб управляти компонентом і / або розмітки.
BalusC

1
@BalusC Що саме ти маєш на увазі під "повноцінним HTML" у першому рядку своєї відповіді?
Geek

1
@Geek: просто один HTML- <a>елемент, нічого більше, немає фантазії, немає JS-коду тощо.
BalusC

4

Я також бачу, що завантаження (продуктивність) сторінки займає тривалий час при використанні h: commandLink, ніж h: посилання. h: посилання швидше порівняно з h: commandLink


1
Мені важко повірити. Окрім чуток / власних анекдотичних доказів, чи є у вас щось, що підтверджує це?
Метт Бал

5
@Matt: Я можу собі уявити, що це повільніше, коли у вас є посилання навігації POST у формі "Бог" на сторінці із, наприклад, таблицею даних> 1000 рядків, що містить 3 поля введення в ряд. Але така сторінка все-таки має інші серйозні проблеми :)
BalusC
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.