Diferencia entre h:botón y h:commandButton

Resuelto Geek asked hace 12 años • 5 respuestas

En JSF 2, ¿cuál es la diferencia entre h:buttony h:commandButton?

Geek avatar Oct 25 '12 21:10 Geek
Aceptado

<h:button>

El <h:button>genera un HTML <input type="button">. El elemento generado utiliza JavaScript para navegar a la página proporcionada por el atributo outcome, mediante una solicitud HTTP GET.

P.ej

<h:button value="GET button" outcome="otherpage" />

Generará

<input type="button" onclick="window.location.href='/contextpath/otherpage.xhtml'; return false;" value="GET button" />

Aunque esto termina en un cambio de URL (marcable) en la barra de direcciones del navegador, esto no es compatible con SEO. Los robots de búsqueda no seguirán la URL en el archivo onclick. Será mejor que utilices un <h:outputLink>o <h:link>si el SEO es importante en la URL proporcionada. Si es necesario, podría agregar algo de CSS en el <a>elemento HTML generado para que parezca un botón.

Tenga en cuenta que, si bien puede poner una expresión EL que haga referencia a un método en el outcomeatributo como se muestra a continuación,

<h:button value="GET button" outcome="#{bean.getOutcome()}" />

no se invocará cuando haga clic en el botón. En cambio, ya se invoca cuando la página que contiene el botón se representa con el único propósito de obtener el resultado de navegación que se incrustará en el onclickcódigo generado. Si alguna vez intentó utilizar la sintaxis del método de acción como en outcome="#{bean.action}", este error/concepto erróneo ya lo insinuará al enfrentar una javax.el.ELException: No se pudo encontrar la propiedad actionMethod en la clase com.example.Bean .

Si tiene la intención de invocar un método como resultado de una solicitud POST, utilícelo <h:commandButton>en su lugar, consulte a continuación. O si tiene la intención de invocar un método como resultado de una solicitud GET, diríjase a Invocar la acción del bean administrado JSF al cargar la página o si también tiene parámetros de solicitud GET a través de <f:param>, ¿Cómo proceso los parámetros URL de la cadena de consulta GET en el bean de respaldo al cargar la página? ?


<h:commandButton>

Genera <h:commandButton>un botón HTML <input type="submit">que envía de forma predeterminada el padre <h:form>mediante el método HTTP POST e invoca las acciones adjuntas a actiony actionListener/o <f:ajax listener>, si las hay. Se <h:form>requiere.

P.ej

<h:form id="form">
    <h:commandButton id="button" value="POST button" action="otherpage" />
</h:form>

Generará

<form id="form" name="form" method="post" action="/contextpath/currentpage.xhtml" enctype="application/x-www-form-urlencoded">
    <input type="hidden" name="form" value="form" />
    <input type="submit" name="form:button" value="POST button" />
    <input type="hidden" name="javax.faces.ViewState" id="javax.faces.ViewState" value="...." autocomplete="off" />
</form>

Tenga en cuenta que, por lo tanto, se envía a la página actual (la URL de acción del formulario aparecerá en la barra de direcciones del navegador). Luego lo reenviará a la página de destino, sin ningún cambio en la URL en la barra de direcciones del navegador. Puede agregar ?faces-redirect=trueun parámetro al valor del resultado para activar una redirección después de la POST (según el patrón Post-Redirect-Get ) para que la URL de destino se pueda marcar como favorita.

Por lo general, se <h:commandButton>utiliza exclusivamente para enviar un formulario POST, no para realizar navegación de página a página. Normalmente, actionapunta a alguna acción comercial, como guardar los datos del formulario en la base de datos, lo que devuelve un Stringresultado.

<h:commandButton ... action="#{bean.save}" />

con

public String save() {
    // ...
    return "otherpage";
}

Volver nullo voidle devolverá a la misma vista. También se devuelve una cadena vacía, pero se recrearía cualquier bean con ámbito de vista. Hoy en día, con JSF2 y <f:ajax>, la mayoría de las veces las acciones simplemente regresan a la misma vista (por lo tanto, nullo void) en la que ajax representa condicionalmente los resultados.

public void save() {
    // ...
}

Ver también:

  • ¿Cómo navegar en JSF? Cómo hacer que la URL refleje la página actual (y no la anterior)
  • ¿Cuándo debo utilizar h:outputLink en lugar de h:commandLink?
  • Diferencias entre acción y actionListener
BalusC avatar Oct 25 '2012 15:10 BalusC

h:button- Al hacer clic en un, h:buttonse emite una GETsolicitud que se puede marcar.

h:commandbutton- En lugar de una solicitud de obtención, h:commandbuttonemite una solicitud POST que envía los datos del formulario al servidor.

dsgriffin avatar Oct 25 '2012 14:10 dsgriffin

h:commandButton debe estar encerrado en ah:form y tiene dos formas de navegación, es decir, estática configurando el atributo de acción y dinámica configurando el atributo actionListener, por lo que es más avanzado de la siguiente manera:

<h:form>
    <h:commandButton action="page.xhtml" value="cmdButton"/>
</h:form>

este código genera el siguiente html:

<form id="j_idt7" name="j_idt7" method="post" action="/jsf/faces/index.xhtml" enctype="application/x-www-form-urlencoded">

mientras que el botón h: es más simple y solo se usa para navegación estática o basada en reglas de la siguiente manera

<h:button outcome="page.xhtml" value="button"/>

el html generado es

 <title>Facelet Title</title></head><body><input type="button" onclick="window.location.href='/jsf/faces/page.xhtml'; return false;" value="button" />
ashish avatar Oct 25 '2012 16:10 ashish

Esto está tomado del libro: The Complete Reference de Ed Burns y Chris Schalk.

h: botón de comando vs h: botón

¿Cuál es la diferencia entre h:commandButton|h:commandLink y h:button|h:link ?

Los dos últimos componentes se introdujeron para 2.0permitir páginas JSF marcables, cuando se usan junto con la función Ver parámetros.

Hay 3 diferencias principales entre h:button|h:link y h:commandButton|h:commandLink .

Primero, h:button|h:linkhace que el navegador emita una solicitud HTTP GET, mientras que h:commandButton|h:commandLinkrealiza un formulario POST. Esto significa que cualquier componente de la página que tenga valores ingresados ​​por el usuario, como campos de texto, casillas de verificación, etc., no se enviará automáticamente al servidor cuando se use h:button|h:link. Para hacer que los valores se envíen con h:button|h:link, se deben tomar medidas adicionales utilizando la función "Ver parámetros".

La segunda diferencia principal entre los dos tipos de componentes es que h:button|h:linktiene un atributo de resultado para describir adónde ir a continuación, mientras que h:commandButton|h:commandLinkutiliza un atributo de acción para este propósito. Esto se debe a que el primero no da como resultado un ActionEvent en el sistema de eventos, mientras que el segundo sí.

Finalmente, y lo más importante para la comprensión completa de esta característica, los h:button|h:linkcomponentes hacen que se solicite al sistema de navegación que obtenga el resultado durante la representación de la página, y la respuesta a esta pregunta está codificada en el marcado de la página. Por el contrario, los h:commandButton|h:commandLinkcomponentes hacen que se le solicite al sistema de navegación que derive el resultado en el POSTBACK de la página. Ésta es una diferencia en el momento. La renderización siempre ocurre antes de POSTBACK.