Kiedy powinienem używać h: outputLink zamiast h: commandLink?

129

Kiedy należy używać <h:outputLink>zamiast <h:commandLink>?

Rozumiem, że a commandLinkgeneruje post HTTP; Zgaduję, że outputLinkwygeneruje HTTP pobiera. To powiedziawszy, większość samouczków JSF , które przeczytałem, używa commandLink(prawie?) Wyłącznie.

Kontekst: Wdrażam mały projekt demonstracyjny, który pokazuje łącze w nagłówku do strony użytkownika, podobnie jak Stack Overflow ...

potrzebuje więcej jQuery

... i nie jestem pewien, czy commandLink(być może używając ?faces-redirect=truedo bukmacherstwa), czy outputLinkjest właściwym wyborem.

Matt Ball
źródło

Odpowiedzi:

195

<h:outputLink>Renderuje fullworthy HTML <a>element z prawidłowego adresu URL w hrefatrybucie który wystrzeliwuje jako zakładki żądanie GET. Nie może bezpośrednio wywołać metody akcji zarządzanego komponentu bean.

<h:outputLink value="destination.xhtml">link text</h:outputLink>

<h:commandLink>Renderuje HTML <a>elementu z onclickskryptu, który złoży formularz (ukryty) POST i może powołać zarządzanej metody działania fasoli. Wymagane jest również umieszczenie go wewnątrz <h:form>.

<h:form>
    <h:commandLink value="link text" action="destination" />
</h:form>

?faces-redirect=trueParametr sprawie <h:commandLink>, która wyzwala przekierowanie po POST (zgodnie z Post-Redirect-Get wzorzec), tylko poprawia bookmarkability strony docelowej, gdy połączenie jest faktycznie kliknął (URL nie będzie „jeden za” już) , ale to nie zmienia hreftego <a>elementu być fullworthy URL. Nadal pozostaje #.

<h:form>
    <h:commandLink value="link text" action="destination?faces-redirect=true" />
</h:form>

Od JSF 2.0 istnieje również, <h:link>który może pobrać identyfikator widoku (wynik przypadku nawigacji) zamiast adresu URL. Wygeneruje również <a>element HTML z odpowiednim adresem URL w formacie href.

<h:link value="link text" outcome="destination" />

Tak więc, jeśli jest to czysta i godna uwagi nawigacja między stronami, jak link do nazwy użytkownika SO, użyj <h:outputLink>lub <h:link>. Jest to również lepsze dla SEO, ponieważ boty zwykle nie szyfrują formularzy POST ani kodu JS. Ponadto poprawi się UX, ponieważ strony są teraz objęte zakładkami, a adres URL nie jest już „jeden za”.

W razie potrzeby możesz wykonać zadanie przetwarzania wstępnego w konstruktorze lub @PostConstructw @RequestScopedlub, @ViewScoped @ManagedBeanktóry jest dołączony do danej strony docelowej. Możesz użyć @ManagedPropertylub <f:viewParam>ustawić parametry GET jako właściwości ziarna.

Zobacz też:

BalusC
źródło
2
Nie, nie musi. Do UICommandkomponentu muszą wejść tylko UIFormkomponenty.
BalusC
3
Właściwie nic. Ogólnie rzecz biorąc, kiedy możesz, trzymaj się linków h:outputLinklub h:linkich szukania. Nie należy lekceważyć SEO. Przy okazji, aby zobaczyć ładne adresy URL podobne do REST, takie jak tutaj na SO, spójrz na PrettyFaces .
BalusC
1
Nie, różnica polega na tym, że jako wartość przyjmuje h:linkidentyfikator widoku JSF (np. page), A jako wartość h:outputLinkprzyjmuje rzeczywisty adres URL (np. /page.xhtmlLub /page.jsf, lub inny w zależności od FacesServletmapowania). Kodowanie adresu URL zachodzi mimo to w obu przypadkach. Nawiasem mówiąc, nie ma różnicy między zachowaniem renderowania EL w tekście szablonu #{...}i h:outputText. Obie opcje uciekają ze wstępnie zdefiniowanych jednostek XML (nie, to nie to samo, co kodowanie adresu URL). W h:outputTextzaledwie więcej ofert attribtues podoba id, styleClassitp kontrolować komponent i / lub znaczników.
BalusC
1
@BalusC Co dokładnie masz na myśli, mówiąc o „pełnowartościowym HTML” w pierwszej linii swojej odpowiedzi?
Geek
1
@Geek: tylko do rzeczy jeden <a>element HTML , nic więcej, brak fantazyjności, brak kodu JS itp.
BalusC
4

Widzę też, że ładowanie strony (wydajność) zajmuje dużo czasu przy użyciu h: commandLink niż h: link. h: link jest szybszy w porównaniu do h: commandLink

Ashok
źródło
1
Trudno mi w to uwierzyć. Oprócz plotek / własnych anegdotycznych dowodów, czy masz coś na poparcie tego?
Matt Ball
5
@Matt: Mogę sobie wyobrazić, że jest wolniej, gdy masz ten link nawigacyjny POST wewnątrz formularza "Bóg" na stronie z na przykład datatable z> 1000 wierszy zawierających 3 pola wejściowe na wiersz. Ale taka strona i tak ma inne poważne problemy :)
BalusC