Tentando entender imediato = “true” pulando inputs quando não deveria

Apenas quando eu pensei que tinha entendido imediatamente … * suspiro *

Considere a seguinte página do JSF:

  

E esse bean de apoio:

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

De tudo o que li sobre imediato, eu esperaria o seguinte:

  • Ao tentar fazer foo sem fornecer um valor para o campo de input, a ação nunca é executada porque durante processValidationsPhase ocorre um erro, resultando na renderização da página diretamente após essa fase com uma mensagem de erro. O valor do didSomething permanece inalterado. (Isso funciona como esperado)

  • Ao tentar fazer a barra sem fornecer um valor para o campo de input, a ação é executada durante applyRequestValuesPhase devido ao atributo imediato. A variável didSomething é alterada. (Isso funciona como esperado)

Sobre o que acontece a seguir, esta descrição declara:

“Um valor de retorno nulo (como resultado do método de ação) faz com que o processamento continue como normal, ou seja, componentes não imediatos são validados e o modelo de atualização é executado (se não houver erros de validação). Para um método de listener de ação que retorna void, é necessário chamar facesContext.renderResponse (); se o stream normal não for desejado. ”

A partir disso, tive a idéia de que o processamento continua normal (já que meu método de ação não retorna um resultado nem força a renderResponse() ), resultando no mesmo erro de validação. A única diferença seria que isso ocorra após a configuração do didSomething . No entanto, isso não acontece. Em vez disso, parece que o site ainda pula todas as fases restantes, com o campo de input não sendo tocado. Ele renderiza novamente sem mensagem de erro.

Alguém pode me explicar onde meu entendimento de como isso funciona está errado?

   

Com immediate="true" no botão, a ação é invocada durante a fase de solicitação de valores e todas as fases restantes são ignoradas. Esse é também o único ponto deste atributo: processar (decodificar, validar, atualizar e invocar) o componente imediatamente durante a fase de aplicação dos valores de solicitação.

Todas as inputs que não possuem immediate="true" são ignoradas de qualquer maneira. Apenas as inputs que possuem immediate="true" também são processadas, mas isso também acontece durante a fase de aplicação dos valores de solicitação. Por que as fases restantes devem ser invocadas se tudo já tiver ocorrido na fase de solicitação de valores?

No artigo do ciclo de vida de debugging do JSF, você pode encontrar o seguinte resumo que deve esclarecer quando (não) usar o immediate"true" :

Ok, quando devo usar o atributo imediato?

Se ainda não estiver totalmente claro, aqui está um resumo, completo com exemplos de uso do mundo real, quando eles podem ser benéficos:

  • Se definido em UIInput (s) apenas, a fase de validações de processo será realizada na fase de aplicar valores de solicitação. Use isso para priorizar a validação para o (s) componente (s) UIInput em questão. Quando a validação / conversão falhar para qualquer um deles, os componentes não imediatos não serão validados / convertidos.

  • Se definido apenas no UICommand , a fase de valores de solicitação de aplicação até as fases de valores do modelo de atualização será ignorada para qualquer um dos componentes de UIInput . Use isso para ignorar todo o processamento do formulário. Por exemplo, botão “Cancelar” ou “Voltar”.

  • Se configurado nos componentes UICommand e UICommand , a fase de aplicar valores de solicitação até que as fases de valores do modelo de atualização sejam ignoradas para qualquer um dos componentes de UIInput que não tenham esse conjunto de atributos. Use isso para pular o processamento de todo o formulário esperado para determinados campos (com imediato). Por exemplo, o botão “Senha esquecida” em um formulário de login com um campo de senha obrigatório, mas não imediato.

Veja também:

  • Por que o atributo “imediato” foi adicionado ao EditableValueHolders?