Este tópico aborda a linguagem de expressão do JavaServer Faces 1.1. Use esta linguagem de expressão com projetos J2EE 1.4 e J2EE 1.3, que usem componentes JavaServer Faces 1.1. Se você estiver trabalhando com um projeto Java EE 5, seus componentes são JavaServer Faces 1.2, que usam a linguagem de expressão unificada. Consulte a página da Web seguinte para ver um artigo sobre essa linguagem:
Para a especificação completa da linguagem de expressão unificada, você deve baixar a especificação JavaServer Pages (JSP) 2.1. A página da Web seguinte discute sobre a tecnologia JSP e fornece links para downloads:
Este tópico é para usuários avançados que desejam indicar suas próprias expressões de vinculação de valor em vez de deixar o IDE criar tais expressões. Ela possui as seguintes seções:
O JavaServer Faces fornece uma linguagem de expressão (JSF EL) que é usado em páginas da aplicação Web para acessar os componentes JavaBeans no bean de página e em outros beans associados à aplicação Web, tal como o bean de sessão e o bean de aplicação. O IDE na maioria dos casos cuida da especificação da expressão correta para você, por exemplo, quando você vincula a propriedade text do componente a um provedor de dados ou a uma propriedade JavaBean.
Para vincular uma propriedade de um componente, você pode adicionar o componente a uma página JSF Visual Web e, em seguida, clicar com o botão direito do mouse no componente e escolher Vinculações de propriedade. Você pode usar a caixa de diálogo Vinculações de propriedade para selecionar uma propriedade do componente e escolher a qual propriedade JavaBeans o componente será vinculado.
Como um exemplo de vincular um componente a uma tabela de banco de dados, a amostra de código seguinte faz referência a um componente Texto estático. Eis aqui como produzir a amostra de código:
O IDE adiciona automaticamente um objeto do provedor de dados à página e vincula
a propriedade text ao campo PERSON.PERSONID do provedor de dados. Veja o texto da alteração do componente para 123.
PERSON.NAME do provedor de dados e clique em OK para alterar a vinculação da propriedade text para o campo correto.
O código resultante no editor JSP é semelhante ao seguinte:
<ui:staticText binding="#{Page1.staticText1}"
id="staticText1"
style="position: absolute; left: 216px; top: 192px"
text="#{Page1.personDataProvider.value['PERSON.NAME']}"/>
staticText. Ela usa o qualificador ui:, que identifica o namespace XML
do componente staticText. O qualificador ui: é
definido no cabeçalho de página como xmlns:ui="http://www.sun.com/web/ui". Este
namespace aponta para uma biblioteca de marcas personalizada para renderizar componentes IU nas categorias Básico, Composto e Layout da Paleta.
Existem dois outros qualificadores que você verá no código JSP que são definidos nessa mesma linha:
h: - Definido no cabeçalho de página como xmlns:h="http://java.sun.com/jsf/html", este namespace aponta para uma biblioteca de marcas personalizada do JavaServer Faces para renderizar componentes da implementação de referência do JavaServer Faces que estão principalmente na categoria Padrão da paleta.
f: - Definido no cabeçalho de página como xmlns:f="http://java.sun.com/jsf/core", este namespace aponta para uma biblioteca de marcas personalizada do JavaServer Faces para representar manipuladores de eventos, validadores e outras ações.
A documentação TLD desses dois qualificadores se encontra em:
binding conecta este componente a um objeto JavaBeans específico staticText1 no bean de página Page1. O atributo binding e os atributos id, style e text são todos atributos de bibliotecas de marcas do JavaServer Faces. Existem três atributos, id, style e text, são representados no IDE como propriedades do componente e podem ser definidos na janela Propriedades do componente.
binding e text usam a expressão de idioma do JavaServer Faces. Você pode usar a linguagem de expressão do JavaServer Faces para definir o atributo value na janela Propriedades do componente.
Como descrito nas seções seguintes, a sintaxe da linguagem de expressão do JavaServer usa os delimitadores #{}. Uma expressão do JavaServer Faces pode ser uma expressão de vinculação de valor (para vincular componentes IU ou seus valores a fontes de dados externas)
ou uma expressão de vinculação de método (para fazer referência a métodos de bean). Ele também pode aceitar literais mistos, os operadores e a sintaxe de avaliação da linguagem de expressão 2.0.
JSF EL pode ser usada para vincular JavaBeans às propriedades de componente para simplificar a forma em que os componentes acessar os dados de vários códigos-fonte. As expressões JSF EL usam a sintaxe #{expr};
A sintaxe de uma expressão de vinculação de valor é idêntica à sintaxe de uma expressão de linguagem de expressão definida na especificação JavaServer Pages (versão 2.0), seções 2.3 a 2.9, com as seguintes exceções:
#{ e
} em vez${ e }.
Além das diferenças dos delimitadores, os dois tipos de expressão possuem semântica diferente:
getValue) em vez de pelo código compilado de uma página.
VariableResolver e PropertyResolver disponíveis através do objeto Application da aplicação Web atual, para os quais as aplicações podem fornecer classes de substituição de plug-in que oferecem recursos adicionais.
EditableValueHolder (qualquer componente de entrada de campo), a expressão é usada para modificar o valor referenciado em vez de recuperá-lo durante a fase Atualizar valores de modelo do ciclo de vida do processamento da solicitação.
Os exemplos de expressões de vinculação de valor válidas incluem:
#{Page1.name}
#{Foo.bar}
#{Foo[bar]}
#{Foo[“bar”]}
#{Foo[3]}
#{Foo[3].bar}
#{Foo.bar[3]}
#{Customer.status == ‘VIP’}
#{(Page1.City.farenheitTemp - 32) * 5 / 9}
Reporting Period: #{Report.fromDate} to #{Report.toDate}
Para expressões de vinculação de valor onde o método setValue será chamado (por exemplo, para vinculações da propriedade text para campos de entrada durante Atualizar valores de modelo), a sintaxe de uma expressão de vinculação de valor é limitada a um dos seguintes formatos, onde expr-a é uma expressão geral avaliada como algum objeto, e
value-b é um identificador:
#{expr-a.value-b}
#{expr-a[value-b]]
#{value-b}
Quando o método getValue de uma instância ValueBinding é chamado (por exemplo, quando uma expressão em um atributo de marca JSP está sendo avaliada durante a renderização da página), e a expressão é avaliada, e o resultado dessa avaliação é retornado, a avaliação é feita da seguinte forma:
. e []. expr-a.expr-b é equivalente a a["expr-b"]; ou seja,
a expressão expr-b é usada para construir uma literal cujo valor é o identificador e, em seguida, o operador[] é usado com esse valor.
VariableResolver que é adquirida da instância Application desta aplicação Web. Se o valor do lado esquerdo do operador . ou [] for um RowSet, o objeto no lado direito é tratado como um nome de coluna. Consulte a próxima seção para obter uma descrição de avaliação mais completa desses operadores.
. our [...] em uma expressão é avaliada pela instância PropertyResolver que é adquirida da instância Application desta aplicação Web.
As propriedades de variáveis são acessadas por meio do operador . e podem ser aninhadas arbitrariamente.
Quando o método setValue de um ValueBinding é chamado (por exemplo, para as vinculações da propriedade text para campos de entrada durante Atualizar valores de modelo), a sintaxe da restrição de vinculação de valor é restrita como descrito na seção anterior. A implementação deve realizar o seguinte processamento para avaliar uma expressão do formato #{expra.value-b} ou #{expr-a[value-b]}:
expr-a em value-a.
value-a for nulo, lança PropertyNotFoundException.
value-b for nulo, lança PropertyNotFoundException.
value-a for um mapa, chama value-a.put(value-b, new-value).
value-a for uma Lista ou uma matriz:
value-b para int, lançando
ReferenceSyntaxException em um erro.
value-a.set(value-b, new-value) ou
Array.set(value-b, new-value), como apropriado.
IndexOutOfBoundsException ou
ArrayIndexOutOfBoundsException for lançado, lança
PropertyNotFoundException.
EvaluationException.
value-a é um objeto JavaBeans):
value-b para String.
value-b for uma propriedade gravável de value-a (segundo a especificação JavaBeans), chama o método setter (passando new-value). Lança ReferenceSyntaxException se uma exceção for lançada.
PropertyNotFoundException.
Se a expressão inteira consiste em um único identificador, as regras seguintes se aplicam:
ReferenceSyntaxException.
novo-valor.
new-value.
A linguagem de expressão define um conjunto de objetos implícitos:
facesContext - A instância FacesContext da solicitação atual.
param - Mapeia um nome de parâmetro de solicitação para um valor único.
paramValues - Mapeia um nome de parâmetro de solicitação para uma matriz de valores.
header - Mapeia um nome de cabeçalho de solicitação para um valor único.
headerValues - Mapeia um nome de cabeçalho de solicitação para uma matriz de valores.
cookie - Mapeia um nome de cookie para um único cookie.
initParam - Mapeia um nome de parâmetro de inicialização para um único valor.
Objetos que permitem acesso a diversas variáveis de escopo:
requestScope - Mapeia nomes de variável de escopo de solicitação para seus valores.
sessionScope - Mapeia nomes de variável de escopo de sessão para seus valores.
applicationScope - Mapeia nomes de variável de escopo da aplicação para seus valores.
Quando uma expressão faz referência a um desses objetos por nome, o objeto apropriado é retornado. Um objeto implícito tem precedência sobre um atributo que possui o mesmo nome. Por exemplo, #{facesContext} retorna o objeto FacesContext, mesmo que há um atributo facesContext existente contendo algum outro valor.
A linguagem de expressão define as literais seguintes:
true e false
" sofre escape como \", ' sofre escape como \' e \ sofre escape como \\.
null
Além dos operadores . e [] abordados acima em Semântica obter valor e a seção depois dessa, a linguagem de expressão fornece os seguintes operadores:
+, - (binário), *, /,
div, %, mod, - (unário)
and, &&, ou, ||,
not, !
==, eq, !=, ne,
<, lt, >, gt, <=,
ge, >=, le. As comparações podem ser feitas com outros valores, ou com booleano, string, inteiro ou literais de ponto flutuante.
empty é uma operação de prefixo que pode ser usada para determinar se um valor é null ou empty.
A ? B : C. Avaliado como B ou C, dependendo do resultado da avaliação de A.
A precedência dos operadores do mais alto para o mais baixo, da esquerda para a direita, da seguinte forma:
[] .
() (altera a precedência de operadores)
- (unário) not ! vazio
* / div % mod
+ - (binário)
< > <= >= lt gt le ge
== != eq ne
&& e
|| ou
? :
As palavras seguintes são reservadas para a linguagem de expressão e não devem ser usadas como identificadores:
e
|
false
|
le
|
not
|
div
|
ge
|
lt
|
nulo
|
vazio
|
gt
|
mod
|
ou
|
eq
|
instanceof
|
ne
|
true
|