Qual é a diferença entre #{expr} e $ {expr} no JSF? Existem casos em que devemos preferir $ {expr}? [duplicado
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?
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.