¿Cuándo debo usar h: outputLink en lugar de h: commandLink?

129

¿Cuándo debo usar un en <h:outputLink>lugar de un <h:commandLink>?

Entiendo que a commandLinkgenera una publicación HTTP; Supongo que outputLinkeso generará HTTP gets. Dicho esto, la mayor parte del material tutorial de JSF que he leído usa commandLink(¿casi?) Exclusivamente.

Contexto: estoy implementando un pequeño proyecto de demostración que muestra un enlace de encabezado a una página de usuario, al igual que Stack Overflow ...

necesita más jquery

... y no estoy seguro de si commandLink(tal vez usar ?faces-redirect=truepara marcar como favorito) o outputLinkes la opción correcta.

Matt Ball
fuente

Respuestas:

195

El <h:outputLink>haga que el HTML fullworthy <a>elemento con la URL apropiada en el hrefatributo que dispara una petición GET bookmarkable. No puede invocar directamente un método de acción de bean gestionado.

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

El <h:commandLink>haga que el HTML <a>elemento con un onclickscript que envía un formulario (oculto) POST y puede invocar un método de acción bean gestionado. También se requiere que se coloque dentro de a <h:form>.

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

El ?faces-redirect=trueparámetro en <h:commandLink>, que activa una redirección después de la POST (según el patrón Post-Redirect-Get ), solo mejora la posibilidad de marcar la página de destino cuando se hace clic en el enlace (la URL ya no estará "uno detrás") , pero no cambia hrefel <a>elemento para que sea una URL digna de confianza. Aún permanece #.

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

Desde JSF 2.0, también existe el <h:link>que puede tomar una ID de vista (un resultado de caso de navegación) en lugar de una URL. También generará un <a>elemento HTML con la URL adecuada href.

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

Entonces, si se trata de una navegación de página a página pura y marcable como el enlace de nombre de usuario SO, entonces use <h:outputLink>o <h:link>. Eso también es mejor para SEO ya que los bots generalmente no cifran los formularios POST ni el código JS. Además, se mejorará UX ya que las páginas ahora se pueden marcar y la URL ya no es "una detrás".

Cuando sea necesario, puede hacer el trabajo de preprocesamiento en el constructor o @PostConstructde un @RequestScopedo @ViewScoped @ManagedBeanque está adjunto a la página de destino en cuestión. Puede utilizar @ManagedPropertyo <f:viewParam>establecer parámetros GET como propiedades de bean.

Ver también:

BalusC
fuente
2
No, no tiene que serlo. Solo los UICommandcomponentes deben ir en un UIFormcomponente.
BalusC
3
Ninguno, en realidad. Generalmente, cuando puedes, quédate con h:outputLinko h:linkpara enlaces. El SEO no debe ser subestimado. Por cierto, para obtener una buena URL similar a REST como aquí en SO, eche un vistazo a PrettyFaces .
BalusC
1
No, la diferencia es que h:linktoma JSF ID de vista (por ejemplo page) como el valor y h:outputLinktoma una URL real (por ejemplo /page.xhtml, o /page.jsf, u otro en función de su FacesServletasignación) como valor. La codificación de URL ocurre de todos modos en ambos casos. Por cierto, no hay diferencia entre el comportamiento de representación de EL en el texto de la plantilla #{...}y h:outputText. Ambos escapan entidades XML predefinidas (no, eso no es lo mismo que la codificación URL). Las h:outputTextúnicas ofertas más attribtues gusta id, styleClassetc para controlar el componente y / o por marcadores.
BalusC
1
@BalusC ¿Qué quiere decir exactamente con "HTML digno" en la primera línea de su respuesta?
Geek
1
@Geek: solo un <a>elemento HTML , nada más, sin fantasía, sin código JS, etc.
BalusC
4

También veo que la carga de la página (rendimiento) tarda mucho en usar h: commandLink que h: link. h: el enlace es más rápido en comparación con h: commandLink

Ashok
fuente
1
Me parece difícil de creer. Además de los rumores / su propia evidencia anecdótica, ¿tiene algo que respalde eso?
Matt Ball
55
@ Matt: Me imagino que es más lento cuando tiene este enlace de navegación POST dentro de un formulario "Dios" en una página con, por ejemplo, una tabla de datos con> 1000 filas que contienen 3 campos de entrada por fila. Pero página parecido a tiene otros problemas graves de todos modos :)
BalusC