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


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

Entiendo que un commandLink genera un HTTP post; supongo que outputLink generará HTTP gets. Dicho esto, la mayor parte del material tutorial JSF que he leído utiliza 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 el desbordamiento de pila...

necesita más jquery

...y no estoy seguro si commandLink (quizás usando ?faces-redirect=true para bookmarkability) o outputLink es la elección correcta.

 125
Author: BalusC, 2010-11-30

2 answers

El <h:outputLink> renderiza un elemento HTML <a> fullworthy con la URL adecuada en el atributo href que activa una solicitud GET marcable. No puede invocar directamente un método de acción de bean administrado.

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

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

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

El parámetro ?faces-redirect=true en el <h:commandLink>, que activa una redirección después de la PUBLICACIÓN (según el patrón Post-Redirección-Get), solo mejora la marcación de la página de destino cuando se hace clic en el enlace (la URL ya no será "one behind"), pero no cambia el href del elemento <a> para que sea una URL válida. Todavía permanece #.

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

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

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

Por lo tanto, si es para la navegación pura y marcable de página a página como el enlace SO username, entonces use <h:outputLink> o <h:link>. Eso también es mejor para el SEO, ya que los bots generalmente no cifran los formularios de PUBLICACIÓN ni el código JS. Además, se mejorará la experiencia de usuario, ya que las páginas ahora se pueden marcar y la URL ya no está "uno detrás".

Cuando sea necesario, puede hacer el trabajo de preprocesamiento en el constructor o @PostConstruct de un @RequestScoped o @ViewScoped @ManagedBean que se adjunta a la página de destino en cuestión. Puede hacer uso de @ManagedProperty o <f:viewParam> para establecer los parámetros GET como propiedades de bean.

Véase también:

 184
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:33:26

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

 4
Author: Ashok,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-20 18:38:16