Qual é a diferença entre #{expr} e $ {expr} no JSF? Existem casos em que devemos preferir $ {expr}? [duplicado

StackOverflow https://stackoverflow.com/questions/1847751

  •  13-09-2019
  •  | 
  •  

Pergunta

Esta pergunta já tem uma resposta aqui:

Eu li há algum tempo sobre a diferença no 'Core JSF', mas agora não consigo encontrar esse lugar.

No entanto, não me lembro que havia uma palavra sobre casos em que devemos usar $ {expr} no JSF. Então, estou apenas curioso, qual é a diferença (em uma castanha) e se houver um caso para usar $ {expr} no aplicativo JSF?

Foi útil?

Solução

Resumir em linguagem clara: ${expression} apenas faz pegue, enquanto #{expression} pode fazer as duas coisas pegue e definir. Isso é porque o ${expression} é avaliado apenas uma vez (imediato), enquanto o #{expression} é avaliado em todo acesso (diferido).

No JSF no JSP 2.0 ou FaceLets 1.x, quando você coloca algo assim como a primeira expressão da página

${bean.property}

Onde bean é um feijão gerenciado com escopo de solicitação, você verá nada. Mas se bean é um feijão gerenciado com escopo com sessão e já foi criado antes, você verá o valor da propriedade sendo impresso. Isso também se aplica se a solicitação de feijão gerenciado com escopo for criado anteriormente por #{bean.xxx} Na mesma página.

Se você fizer o que a primeira expressão da página

#{bean.property}

Então El testará se bean é nulo e se assim for, então vai definir (Crie) um novo. Se a propriedade for definida durante a construção do feijão, você verá a propriedade sendo exibida por essa expressão.

Tudo isso é obrigatório para obter entre outros JSF UIInput componentes como <h:inputText> trabalhar. Quando você envia o formulário, o #{expression} vai definir os valores no feijão.

Outras dicas

A partir de Javaee Tutorial:

Todas as expressões usando a sintaxe $ {} são avaliadas imediatamente. Essas expressões só podem ser usadas no texto do modelo ou como o valor de um atributo de tag JSP que pode aceitar expressões de tempo de execução. [...] Expressões de avaliação imediata são sempre expressões de valor somente leitura. A expressão mostrada acima só pode obter o preço total do feijão do carrinho; Não pode definir o preço total.
As expressões de avaliação diferidas assumem o formulário #{expr} e podem ser avaliadas em outras fases de um ciclo de vida da página, conforme definido por qualquer tecnologia que esteja usando a expressão. No caso da tecnologia JavaServer Faces, seu controlador pode avaliar a expressão em diferentes fases do ciclo de vida, dependendo de como a expressão está sendo usada na página.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top