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 dedidSomething
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 variabledidSomething
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 componentesUIInput
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 seUIInput
las fases de valores del modelo de actualización para cualquiera de los componentes deUIInput
. 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
yUICommand
, 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 deUIInput
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.