inputtext immediate jsf commandbutton immediate-attribute

jsf - primefaces inputtext immediate



Tratando de entender saltos de entrada inmediatos="verdaderos" cuando no debería (1)

Justo cuando pensaba que había entendido de inmediato ... * suspiro *

Considere la siguiente página JSF:

<h:inputText value="#{testBean.text}" required="true" /> <h:commandButton actionListener="#{testBean.doFoo}" value="Do Foo" /> <h:commandButton immediate="true" actionListener="#{testBean.doBar}" value="Do Bar" /><br /> <h:outputText value="#{testBean.didSomething}" />

Y este respaldo bean:

public class TestBean { private String didSomething = "Nothing done yet"; // + getter public void doFoo() { didSomething = "Did foo!"; } public void doBar() { didSomething = "Did bar!"; }

De todo lo que leí sobre lo inmediato, esperaría lo siguiente:

  • Al intentar hacer foo sin proporcionar un valor para el campo de entrada, la acción nunca se ejecuta porque durante processValidationsPhase se produce un error, lo que hace que la página se vuelva a procesar directamente después de esta fase con un mensaje de error. El valor de didSomething permanece sin cambios. (Esto funciona como se esperaba)

  • Al intentar hacer una barra sin proporcionar un valor para el campo de entrada, la acción se ejecuta durante applyRequestValuesPhase debido al atributo inmediato. La variable didSomething se cambia. (Esto funciona como se esperaba)

En lo que sucede a continuación, esta descripción dice:

"Un valor de retorno nulo (como resultado del método de acción) hace que el procesamiento continúe normalmente, es decir, los componentes no inmediatos se validan y luego se ejecuta el modelo de actualización (si no se produjeron errores de validación). Para un método de escucha de acción que devuelve vacío es necesario llamar a facesContext.renderResponse (); si no se desea el flujo normal ".

A partir de esto, tuve la idea de que el procesamiento continúa normalmente (ya que mi método de acción no devuelve un resultado ni fuerza renderResponse() ), lo que da como resultado el mismo error de validación. La única diferencia sería que ocurre después de establecer didSomething . Sin embargo, esto no sucede. En su lugar, parece que el sitio aún omite todas las fases restantes, sin tocar el campo de entrada. Re-renderiza sin mensaje de error.

¿Puede alguien explicarme dónde está mi entendimiento de cómo funciona esto?


Con immediate="true" en el botón, la acción se invoca efectivamente durante la fase de solicitud de valores de solicitud y todas las fases restantes se omiten. Ese es también el único punto de este atributo: procesar (decodificar, validar, actualizar e invocar) el componente de forma inmediata durante la fase de solicitud de valores de solicitud.

Todas las entradas que no tienen immediate="true" se ignoran de todos modos. Solo las entradas que tienen immediate="true" también se procesan, pero esto también ocurre durante la fase de solicitud de valores de solicitud. ¿Por qué deberían invocarse las fases restantes si todo ya se ha realizado en la fase de aplicar los valores de solicitud?

En el artículo del balusc.blogspot.com/2006/09/debug-jsf-lifecycle.html , puede encontrar el siguiente resumen que debe aclarar cuándo (no) usar el immediate"true" :

De acuerdo, ¿cuándo debería usar el atributo inmediato?

Si aún no está del todo claro, aquí hay un resumen, completo con ejemplos de uso del mundo real cuando pueden ser beneficiosos:

  • Si se establece solo en UIInput (s), la fase de validaciones del proceso se realizará en la fase Aplicar valores de solicitud. Use esto para priorizar la validación para los componentes UIInput en cuestión. Cuando la validación / conversión falla para cualquiera de ellos, los componentes no inmediatos no serán validados / convertidos.

  • Si se establece solo en UICommand , se aplicará la fase de valores de la solicitud de aplicación hasta que se UIInput las fases de valores del modelo de actualización para cualquiera de los componentes de UIInput . Use esto para omitir todo el procesamiento del formulario. Por ejemplo, el botón "Cancelar" o "Atrás".

  • Si se establece en los componentes UIInput y UICommand , la fase de valores de la solicitud de aplicación hasta que se actualicen las fases de valores del modelo se omitirá para cualquiera de los componentes de UIInput que no tienen este atributo establecido. Use esto para omitir el procesamiento de la forma completa esperar para ciertos campos (con inmediato). Por ejemplo, el botón "Contraseña olvidada" en un formulario de inicio de sesión con un campo de contraseña requerido pero no inmediato.

Ver también: