Upload
sousamarcolino
View
102
Download
1
Tags:
Embed Size (px)
Citation preview
Curso JavaServer Faces
FR-800
JavaServer Faces
Edição 2.0Março 2006
http://www.mayworm.com/cursosMarcelo Mayworm - [email protected] Henrique Muiz de Carvalho - [email protected]
Curso JavaServer Faces 2
Objetivos
Aprender eficientemente o desenvolvimento de aplicações WEB utilizando o framework JavaServes Faces.
O curso explora aspectos básicos e avançados do JavaServer Faces, cobrindo ténicas de desenvolvimento para WEB.
Tópico especial: Este curso também abordará o uso do MyFaces,
uma implementação de código aberto da especificação de JavaServer Faces desenvolvida pela Apache Group.
Curso JavaServer Faces 3
Objetivos
Ao final desse curso o aluno estará apto a desenvolver uma aplicação WEB utilizando JavaServer Faces.
Curso JavaServer Faces 4
Pré-requisitos
Conhecimento de Java básico Conhecimento de Servlet e Java Server Pages Conhecimento de HTML Conhecimento de XML Qual o seu background? Expectativas?
Objetivos?
Curso JavaServer Faces 5
Livro-texto e fontes
Este curso é baseado principalmente no livro-texto Core JavaServer Faces (Sun Microsystems Press
Java Series) - David Geary, Cay Horstmann
Curso JavaServer Faces 6
Softwares utilizados
Java 5.0 http://java.sun.com/j2se/1.5.0/download.jsp
Eclipse 3.1.1 + WebTools 1.0 http://www.eclipse.org/webtools/releases/1.0/
Apache Tomcat 5.5.15 http://tomcat.apache.org/
MyFaces http://myfaces.apache.org/binary.cgi
Hsqldb 1.8.0 http://www.hsqldb.org/
Curso JavaServer Faces 7
Tópicos
Introdução Managed Beans Navegação Tags Componentes Data Table Conversores e Validadores Eventos e Ciclo de Vida Subvisões Componentes Personalizados
Curso JavaServer Faces 8
Calendário Estimado
Primeiro dia Introdução
Segundo dia Managed Beans, Navegação
Terceiro dia Tags Componentes
Quarto dia Tags Componentes
Quinto dia DataTable
Curso JavaServer Faces 9
Calendário Estimado
Sexto dia DataTable, Conversores, Validadores
Sétimo dia Eventos, Sub-Visões
Oitavo dia Componentes Personalizados
Nono dia Componentes Personalizados
Décimo dia MyFaces, Tópicos Extras
Curso JavaServer Faces 10
Sobre o material didático e CD
Este material didático é um roteiro baseado no livro-texto Core JavaServer Faces O livro é recomendado como referência didática
Cada módulo corresponde a um capítulo do livro A ordem e forma de apresentação são diferentes Nem todos os assuntos são abordados O instrutor poderá fornecer material adicional As referências não são baseadas no livro
O CD contém material de pesquisa adicional apostila/ este material dividido em capítulos software/ software usado no curso books/ livro usado como base para este material e outros extras/ software e material extra sobre o mesmo tema
Curso JavaServer Faces 11
Estrutura do curso
O curso alterna apresentações teóricas com exercícios práticos e demonstrações sobre os temas abordados
Exemplos e demonstrações Nesta versão, a maior parte dos exemplos são baseados no
livro-texto. Ambiente de desenvolvimento inicial
1. Ambiente Java padrão 2. Editor de texto (Eclipse) 3. Sistema de gerenciamento de banco de dados (HSQLDB) Os arquivos do JavaServer Faces estão distribuídos nas
pastas dos exemplos e exercícios quando necessários Outros recursos serão instalados quando forem necessários
Curso JavaServer Faces 12
Como tirar melhor proveito desse curso
Faça perguntas (a qualquer hora) Faça os exercícios; refaça os exercícios; invente Leia o livro-texto, outros livros, artigos, revistas Explore os exemplos fornecidos; busque ir além Adapte suas aplicações para que usem a tecnologia
abordada neste curso Entre em um fórum sobre o assunto Se possível, faça tudo isto durante o curso Faça perguntas (explore o instrutor!)
Curso JavaServer Faces 13
FR-800: JavaServer Faces
Versão 2.0Março 2006
Desenvolvendo Aplicações para WEB com JavaServer Faces
www.mayworm.com/cursos
Curso JavaServer Faces 14
O que é JavaServer Faces
JavaServer Faces é um dos mais novos frameworks para web a seguir o modelo MVC.
Desenvolvido pela Sun como uma especificação (JSR 127) e com a participação de várias outras empresas/entidades (Apache, Borland, IBM, Oracle, BEA, Macromedia, etc....) Um dos lideres Craig R. McClanahan o “pai” do
Struts.
Curso JavaServer Faces 15
O que é JavaServer Faces
Por ser uma especificação JSF tem a vantagem de possuir mais de uma implementação disponível. Temos a RI (reference implementation) da própria Sun e algumas outras: MyFaces – Apache ADF Faces – Oracle
Recentemente a Oracle doou o ADF para o grupo Apache, e este será incorporado ao MyFaces.
Curso JavaServer Faces 16
Visão geral do JavaServer Faces
MVC – Model View Controler Conversão de dados Validação e manipulação de erros Internacionalização Componentes customizados Renderização Suporte a ferramentas de desenvolvimento
Curso JavaServer Faces 17
Software necessário No curso usaremos os seguintes softwares; JDK 5.0
http://java.sun.com/j2se/1.5.0/download.jsp Eclipse 3.1.1 + WebTools 1.0
http://www.eclipse.org/webtools MyFaces 1.1.1 –
http://myfaces.apache.org (baixar também os exemplos)
Tomcat 5.5.x http://jakarta.apache.org/tomcat/index.html
Curso JavaServer Faces 18
Instalação e Configuração
Criar diretório curso c:\curso. Neste diretório iremos instalar o JDK e descompactar o eclipse, o MyFaces e Tomcat
JDK Para preparar o nosso ambiente devemos instalar
primeiramente o JDK. Ele é distribuido como um executável que deve ser executado. Basta seguir os passos para sua instalação, que é bastante simples. Vamos instalá-lo no diretório c:\curso\jdk5.0.
Curso JavaServer Faces 19
Instalação e Configuração
Eclipse O Eclipse e o WebTools podem ser baixados
juntos, facilitando a instalação. O arquivo wtp-all-in-one-sdk-1.0-win32.zip contem o Eclipse, o WebTools e outros plug-ins necessários para a utilização do mesmo (EMF, GEM e JEMF). Como é um arquivo zip, basta descompactá-lo num diretório para que possa ser utilizado. Vamos descompactá-lo no diretório curso, teremos c:\curso\eclipse
Curso JavaServer Faces 20
Instalação e Configuração
MyFaces O MyFaces também é distribuído como um arquivo
zip, bastando descompactá-lo em um diretório. Este arquivo contém os arquivos:
myfaces-api.jar – api JSF (principalmente interfaces) myfaces-impl.jar – implementação da api tomahawk.jar – componentes extras sandbox.jar – mais componentes (usam ajax) myfaces-all.jar – todas as anteriores juntas
Descompactando no nosso diretório de curso teremos c:\curso\myfaces-1.1.1
Curso JavaServer Faces 21
Instalação e Configuração
MyFaces Examples Para facilitar o nosso trabalho vamos utilizar o
arquivo de exemplos myfaces-1.1.1-examples.zip. Este arquivo possui algumas aplicações de exemplo, uma delas é uma aplicação em branco com toda as bibliotecas citadas a cima e com o myfaces previamente configurado. Descompactando este arquivo no nosso diretório de curso teremos c:\curso\myfaces-1.1.1-examples
Curso JavaServer Faces 22
Instalação e Configuração
Blank.war Iremos usar o arquivo blank.war. Renomeie ele
para zip e descompacte no nosso diretório de curso dentro de um subdiretório blank (que deve ser criado), assim teremos c:\curso\blank
Este arquivo já vem com as libs necessárias para o MyFaces:
commons-beanutils-1.6.1.jar,commons-codec-1.2.jar, commons-collections-3.0.jar, commons-digester-1.5.jar, commons-el.jar, commons-fileupload-1.0.jar, commons-validator.jar, commons-lang-2.1.jar, jakarta-oro.jar, jstl.jar, log4j-1.2.8.jar, portlet-api-1.0.jar, struts.jar
Curso JavaServer Faces 23
Instalação e Configuração
Tomcat Como servidor web iremos usar o tomcat, este
também é distribuído em um único arquivo zip, bastando apenas descompactá-lo.
Teremos:
Curso JavaServer Faces 24
Instalação e Configuração
Configurando o Eclipse Apontar o workspace para o diretório
c:\curso\workspace
Curso JavaServer Faces 25
Instalação e Configuração
Configurando o Eclipse Configurando o JDK
Na opção Window/Preferences, devemos selecionar a opção Java/Instaled JREs. Lá encontraremos o JRE instalado na pasta Arquivo de Programas do windows, vamos alterá-lo para o que instalamos na nossa pasta c:\curso\jdk5.0
Curso JavaServer Faces 26
Instalação e Configuração
Configurando o Eclipse Configurando o JDK
Curso JavaServer Faces 27
Instalação e Configuração
Configurando o Eclipse Configurar o tomcat
Na opção Window/Preferences, devemos selecionar a opção Server/Instaled Runtimes.
Curso JavaServer Faces 28
Instalação e Configuração
Configurando o Eclipse Configurar o tomcat
Selecione Apache Tomcat v5.5
Curso JavaServer Faces 29
Instalação e Configuração
Configurando o Eclipse Configurar o tomcat
Indique onde está instalado o tomcat
Curso JavaServer Faces 30
Instalação e Configuração
Configurando o Eclipse Configurar o tomcat
Curso JavaServer Faces 31
Primeira Aplicação em JSF
Criação do projeto no Eclipse File/New Web/Dynamic
Web Project
Curso JavaServer Faces 32
Primeira Aplicação em JSF
Criação do projeto no Eclipse Utilize
ExemploLogin como nome para o projeto
Curso JavaServer Faces 33
Primeira Aplicação em JSF
Devemos copiar o conteúdo da pasta WEB-INF da aplicação de exemplo blank: Copiar apenas lib, web.xml e examples-config.xml
Renomeie examples-config.xml para exemplo-config.xml Este é o arquivo de configuração do JSF
Curso JavaServer Faces 34
Primeira Aplicação em JSF
Editar web.xml Alterar o nome do arquivo de configuração do JSF
<context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value> /WEB-INF/exemplo-config.xml </param-value> </context-param>
Curso JavaServer Faces 35
Primeira Aplicação em JSF
Criar a classe exemplo.Loginpackage exemplo;public class Login {
private String usuario;private String senha;public String efetuarLogin(){
if ("luis".equals(usuario) && "123456".equals(senha)) return "ok";
elsereturn "falhou";
}public String getSenha() { return senha; }public void setSenha(String senha) { this.senha = senha; }public String getUsuario() { return usuario; }public void setUsuario(String usuario) { this.usuario = usuario; }
}
Curso JavaServer Faces 36
Primeira Aplicação em JSF
Configurar o “bean” no arquivo de configuração: exemplo-config.xml
Devemos apagar as configurações existentes do projeto blank.
<managed-bean><managed-bean-name>LoginBean</managed-bean-name><managed-bean-class>exemplo.Login</managed-bean-class><managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Curso JavaServer Faces 37
Primeira Aplicação em JSF
Criar a página login.jsp<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%><f:view>
<html><head><title>Exemplo de Login</title></head><body><h:form id="frmLogin">
<h:panelGrid id="tbLogin" columns="2"><h:outputText value="Usuario" /><h:inputText id="usuario" value="#{LoginBean.usuario}" /><h:outputText value="Senha" /><h:inputSecret id="senha" value="#{LoginBean.senha}" />
</h:panelGrid> <h:commandButton action="#{LoginBean.efetuarLogin}" value="Ok"/></h:form></body></html>
</f:view>
Curso JavaServer Faces 38
Primeira Aplicação em JSF
Criar a página inicio.jsp
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%><f:view> <html> <head> <title>Exemplo de Login</title> </head> <body> <h:outputText value="Login de #{LoginBean.usuario} efetuado com sucesso" /> </body> </html></f:view>
Curso JavaServer Faces 39
Primeira Aplicação em JSF
Criar a página falha.jsp
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%><f:view>
<html><head><title>Exemplo de Login</title></head><body><h:form id="frmFalha">
<h:outputText value="Login inválido!" /><h:commandButton action="login" value="Voltar"/>
</h:form></body></html>
</f:view>
Curso JavaServer Faces 40
Primeira Aplicação em JSF
Criar a página index.jsp O JEE não permite arquivos para “welcome-files”
que não sejam jsp/html, por isso usamos este recurso para resolver esta limitação
<%@ page session="false"%><%response.sendRedirect("login.jsf");%>
Curso JavaServer Faces 41
Primeira Aplicação em JSF
Devemos criar a navegação no arquivo exemplo-config.xml<navigation-rule> <from-view-id>/login.jsp</from-view-id> <navigation-case> <from-outcome>ok</from-outcome> <to-view-id>/inicio.jsp</to-view-id> </navigation-case> <navigation-case> <from-outcome>falhou</from-outcome> <to-view-id>/falha.jsp</to-view-id> </navigation-case></navigation-rule>
<navigation-rule> <from-view-id>/falha.jsp</from-view-id> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/login.jsp</to-view-id> </navigation-case></navigation-rule>
Curso JavaServer Faces 42
Primeira Aplicação em JSF
Criar uma configuração de servidor e adicionar nosso projeto a esta configuração Na janela servers, clicar com o botão direito e
selecionar novo
Curso JavaServer Faces 43
Primeira Aplicação em JSF
Selecionaremos Tomcat 5.5 Adicionaremos o projeto
Curso JavaServer Faces 44
Primeira Aplicação em JSF
Com o servidor configurado temos as seguintes opções: Debug, Start, Profiling, Restart, Stop, Publish
Curso JavaServer Faces 45
Primeira Aplicação em JSF
Podemos testar nossa aplicação dentro do próprio Eclipse
Browser interno do Eclipse-WebTools
Curso JavaServer Faces 46
Páginas JSF
Páginas JSF são na verdade páginas JSP utilizando algunas bibliotecas de tags que representam componentes do JSF.
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
CORE: é responsável por componentes não visuais ou auxiliares (conversores, validadores, views, etc...).
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
HTML: é responsável pelos componentes html visuais/layout (inputs, tables, forms, buttons, etc...).
Curso JavaServer Faces 47
ManagedBeans/BackingBeans
Os beans do JSF são POJOS, ou seja classes javas simples, que não tem a necessidade de estender nenhuma classe e/ou implementar nenhuma interface.
Suas propriedades são visualisadas/alteradas pelos componentes da página (usando o padrão de encapsulamento get e set)
Os métodos públicos desta classe são as ações (actions) de nossa aplicação.
Curso JavaServer Faces 48
Navegação das Páginas
As regras de navegação indicam ao framework qual página deverá ser exibida após um formulário ser processado
<navigation-rule><from-view-id>/login.jsp</from-view-id><navigation-case>
<from-outcome>ok</from-outcome><to-view-id>/inicio.jsp</to-view-id>
</navigation-case><navigation-case>
<from-outcome>falhou</from-outcome><to-view-id>/falha.jsp</to-view-id>
</navigation-case></navigation-rule>
Curso JavaServer Faces 49
Ciclo de Vida
O Ciclo de vida de uma requisição é formado por várias fases:
RestaurarVisão
Aplicar Valores
do request
ProcessarValidações
AtualizarValores
do Modelo
InvocarAplicação
RenderizarResposta
ProcessarEventos
ProcessarEventos
ProcessarEventos
ProcessarEventos
Request
Response
Resposta finalizada Resposta finalizada
Resposta finalizada Resposta finalizada
Rendereizar Resposta
Rendereizar Resposta
Curso JavaServer Faces 50
Exercício
Altere o aplicativo de exemplo: Crie um novo bean que permita armazenar um
nome e um sobrenome Deve possuir uma action que irá concatenar as
strings passadas em uma nova string Criar a página jsp que terá os campos para entrada
e a exibição da saída Fazer com que da página de inicio.jsp possa
acessar esta nova página
Curso JavaServer Faces 51
Managed Beans
São classes simples, com atributos encapsulados e métodos (actions)
São usados para: Componentes de interface Comportamento de um formulário Objetos de negócio (cujas propriedades são
exibidas/editadas nas páginas) Serviços, fontes externas de dados, etc...
Curso JavaServer Faces 52
Managed-Beans
São configurados no arquivo de configuração do faces. Todo bean deve ter:
Nome Classe Scopo
<managed-bean><managed-bean-name>LoginBean</managed-bean-name><managed-bean-class>exemplo.Login</managed-bean-class><managed-bean-scope>session</managed-bean-scope>
</managed-bean>
Curso JavaServer Faces 53
Managed-Beans
Os atributos do bean que serão usados devem seguir o padrão de encapsulamento: Devem ser declarados como private Devem ter métodos get e set públicos para acesso Atributos boolean podem ter dois tipos de acesso
de leitura: IsAtributo getAtributo
Curso JavaServer Faces 54
Managed-Beans
Os escopos do JSF são os mesmo do container web Request
Tem vida curta, inicia-se quando uma requisição é feita e termina quando a resposta é enviada
Session É iniciado quando o usuário acessa a aplicação e é
encerrada quando ocorre um time-out (usuário fica determinado tempo sem acessar) ou esta é invalidada
Application (Servlet-Context) Inicia-se quando a aplicação é iniciada e termina quando
esta é encerrada
Curso JavaServer Faces 55
Managed-Beans
Definindo propriedades Devemos indicar o nome da propriedade, seu tipo
(opcional para strings) e o valor
<managed-property><property-name>minimo</property-name><property-class>java.lang.Integer</property-class><value>1</value>
</managed-property><managed-property>
<property-name>maximo</property-name><property-class>java.lang.Integer</property-class><value>30</value>
</managed-property>
Curso JavaServer Faces 56
Managed-Beans
Inicializando Listas Podemos definir valores para listas
<managed-property><property-name>validos</property-name><list-entries>
<value-class>java.lang.Integer</value-class><value>3</value><value>5</value><value>8</value><value>11</value><value>17</value>
</list-entries></managed-property>
Curso JavaServer Faces 57
Managed-Beans
Maps Tambem podemos inicializar mapas
<managed-property><property-name>usuarios</property-name><map-entries>
<key-class>java.lang.String</key-class><map-entry>
<key>luis</key><value>Luis Henrique</value>
</map-entry><map-entry>
<key>leonardo</key><value>Leonardo Lopes</value>
</map-entry><map-entry>
<key>mayworm</key><value>Marcelo Mayworm</value>
</map-entry></map-entries>
</managed-property>
Curso JavaServer Faces 58
Managed-Beans
Encadeamento de beans Um Bean pode fazer referência a outro bean
<managed-bean><managed-bean-name>Problemas</managed-bean-name><managed-bean-class>exemplo.Problemas</managed-bean-class><managed-bean-scope>session</managed-bean-scope><managed-property>
<property-name>lista</property-name><list-entries>
<value-class>exemplo.problema</value-class><value>#{problema1}</value><value>#{problema2}</value><value>#{...}</value>
</list-entries></managed-property>
</managed-bean><managed-bean>
<managed-bean-name>problema1</managed-bean-name><managed-bean-class>exemplo.Problema</managed-bean-class><managed-bean-scope>session</managed-bean-scope><managed-property>
<property-name>sequencia</property-name><value>1, 4, 9, 16</value>
</managed-property><managed-property>
<property-name>resposta</property-name><value>25</value>
</managed-property></managed-bean>
Curso JavaServer Faces 59
Managed-Beans
Encadeamento de beans Escopos compatíveis
Escopo do Bean Escopo dos Beans referenciadosNone NoneApplication None, aplicationSession None, aplication, sessionRequest None, aplication, session, request
Curso JavaServer Faces 60
Managed-Beans
Conversão de Valores Nas definições de propriedades sempre entramos
com valores do tipo String, o JSF pode fazer a conversão para alguns tipos específicos:
Tipo destino Conversãoint, byte, short, long, float, Método valueOf da classe wrapper,double, (ou wrapper) Ou 0 se for vaziaBoolean ou boolean Método valueOf de Boolean ou false se vaziaCharacter ou char Primeiro caracter da string, ou (char) 0 se vaziaString ou Object Cópia da String, ou new String(“”) se vazia
Curso JavaServer Faces 61
Managed-Beans
Linguagem de Expressões (EL)
<h:inputText value="#{login.usuario}" />
Podemos acessar propriedades de 3 maneiras login.usuario login["usuario"] login['usuario']
Curso JavaServer Faces 62
Managed-Beans
Linguagem de Expressões (EL) Utilização de Map e List
Expressão #{beam.prop}
é possível usar #{bean.prop.prop.prop} , #{bean['prop'].prop['prop']}, etc....
Tipo de Bean Tipo de Prop Modo Escrita Modo LeituraNull Qualquer Erro NullQualquer Null Erro NullMap Qualquer bean.put(prop,valor) bean.get(prop)List Conversível em int bean.set(prop,valor) bean.get(prop)Array Conversível em int bean[prop] bean[prop]Objeto (bean) Qualquer bean.setProp(valor) bean.getProp()
Curso JavaServer Faces 63
Managed-Beans
Linguagem de Expressões (EL) Objetos pré-definidos
Váriável Valoresheader Map com os parametros do cabeçalho HTTP, apenas o primeiro valorheaderValues Map com os parametros do cabeçalho HTTP, array com todos os valoresparam Map com os parametros da requisição, apenas o primeiro valorParamValues Map com os parametros da requisição, array com todos os valorescookie Map com os nomes e valores dos cookiesinitParam Map com os parametros de inicialização da aplicaçãorequestScope Map com os atributos no escopo da requisiçãosessoinScope Map com os atributos no escopo da sessãoapplicationScope Map com os atributos no escopo da aplicaçãofacesContext Instancia de FacesContext dessa requisiçãoview Instancia de UIViewRoot dessa requisição
Curso JavaServer Faces 64
Managed-Beans
Linguagem de Expressões (EL) Operadores
Aritiméticos: +, -, *, / (div) e % (mod) Relacionais: < (lt), <= (le), > (gt), >= (ge),
== (eq), != (ne) Lógicos: && (and), || (or), ! (not) Operador empty, ele é true se for null, array ou String de
tamanho 0 ou Collection de tamanho 0 Operador de seleção ternária ?
<h:outputText value="Bem vindo #{usuario.nome}, hoje é sua #{usuario.cont} visita." rendered=#{usuario.logado && usuario.temPermissao}" />
Curso JavaServer Faces 65
Managed-Beans
Linguagem de Expressões (EL) Expressões de Ligação de Método
<h:commandButton action="#{login.efetuarLogin}" />
Podem ser usadas em: Actions (sem parâmetros, retorno String) Validators (parâmetro FacesContext, UIComponent, value,
retorno void) ActionListeners (parâmetro ActionEvent, retorno void) ValueChangeListeners (parâmetro ValueChangeEvent, retorno
void)
Curso JavaServer Faces 66
Managed-Beans
Internacionalização String de mensagens fica em um arquivo do tipo
properties login.usuarioEntry=Usuario login.senhaEntry=Senha
Este arquivo é carregado na página usando:<f:loadBundle basename="exemplo.mensagens" var="msg" />
É usado como se fosse um bean<h:outputText value="#{msg['login.usuarioEntry']}" />
Este arquivo seria WEB-INF/classes/exemplo/mensagens.properties
Curso JavaServer Faces 67
Managed-Beans
Internacionalização Para várias línguas use um sufixo no nome do
arquivo indicando o código ISO-639 do idioma Para o alemão
mensagens_de.properties(lista de códigos pode ser encontrada em http://www.loc.gov/standards )
Para caracteres especiais (acentos, etc...) devemos usar o padrão unicode
Pode-se utilizar o utilitário native2ascii do jdk para realizar a conversão dos arquivos
Curso JavaServer Faces 68
Managed-Beans
Internacionalização Podemos definir uma localidade padrão para uma
página:<f:view locale="de" />
Podemos tambem definir as localidades padrão e opcionais no arquivo de configuração do faces
<application><locale-config>
<default-locale>pt</default-locale><supported-locale>en</supported-locale>
</locale-config></application>
Curso JavaServer Faces 69
Managed-Beans
Exercício Desenvolver uma aplicação que:
Apresente ao usuário uma sequência de números e solicite a ele o número que completa a sequência (1, 2, 3, 4, 5)
Deve haver uma lista contendo várias sequências que serão exibidas a medida que o usuário for respondendo
Informar quantos foram os acertos A aplicação deve suportar duas linguas
Curso JavaServer Faces 70
Navegação
Navegação estática
<h:commandButton action="login" value="Ok" />
<navigation-rule><from-view-id>/index.jsp</from-view-id><navigation-case>
<from-outcome>login</from-outcome><to-view-id>/login.jsp</to-view-id>
</navigation-case></navigation-rule>
Curso JavaServer Faces 71
Navegação
Agrupando navegações Se não informarmos o from-view-id, a navegação
será usada em todas as views
<navigation-rule><navigation-case>
<from-outcome>login</from-outcome><to-view-id>/login.jsp</to-view-id>
</navigation-case></navigation-rule>
Curso JavaServer Faces 72
Navegação
Navegação Dinâmica Depende do resultado de uma action
public String efetuarLogin(){if ("luis".equals(usuario) && "123456".equals(senha))
return "ok";else
return "falhou";}
<navigation-rule><from-view-id>/login.jsp</from-view-id><navigation-case>
<from-outcome>ok</from-outcome><to-view-id>/inicio.jsp</to-view-id>
</navigation-case><navigation-case>
<from-outcome>falhou</from-outcome><to-view-id>/falha.jsp</to-view-id>
</navigation-case></navigation-rule>
Curso JavaServer Faces 73
Navegação
Redirecionamento É possível usar o redirecionamento, fazendo
com que a requisição seja encerrada e um redirecionamento HTTP seja enviado ao cliente
<navigation-case><from-outcome>ok</from-outcome><to-view-id>/inicio.jsp</to-view-id><redirect/>
</navigation-case>
Curso JavaServer Faces 74
Navegação
Coringas Podemos usar coringas no elemento from-view-id
A navegação abaixo tem o mesmo funcionamento que o agrupamento (não usar o from-view-id)
ou
<navigation-rule><from-view-id>/seguranca/*</from-view-id><navigation-case>
...</navigation-case>
</navigation-rule>
<from-view-id>*</from-view-id>
<from-view-id>/*</from-view-id>
Curso JavaServer Faces 75
Navegação
From-Action Caso seja necessário é possivel termos duas
actions que retornam a mesma String de ação, mas com “destinos” diferentes
Para isso usamos o from-action
<navigation-case><from-action>#{login.efetuarLogin}</from-action><from-outcome>ok</from-outcome><to-view-id>/inicio.jsp</to-view-id><redirect/>
</navigation-case><navigation-case>
<from-action>#{Numeros.calcularResutlado}</from-action><from-outcome>ok</from-outcome><to-view-id>/resultado.jsp</to-view-id>
</navigation-case>
Curso JavaServer Faces 76
Navegação
Algorítimo de Navegação 1º passo
Recebe outcome, viewID, action Se outcome==null reexibe a página atual Combinar todas as regras com o mesmo from-view-id
Se encontrar uma, execute Combinar todas as regras com coringas no from-view-id
que sejam semelhantes ao viewID Se encontrar uma que se aproxime ao máximo do viewID,
execute Se houver uma regra sem from-view-id, execute Se não encontrar nenhuma regra que coincida, reexiba a
página atual
Curso JavaServer Faces 77
Navegação
Algorítimo de Navegação 2º passo
Se for encontrado mais de uma regra que corresponda ao viewID
Se uma tiver from-outcome e from-action equivalentes, execute-o Se tiver from-outcome equivalente e não tiver from-action,
execute-o Se tiver from-action equivalente e não tiver from-outcome,
execute-o Se houver um caso, sem from-outcome e from-action equivalente,
execute-o Se não atender a nenhuma das anteriores, reexiba a mesma
página
Curso JavaServer Faces 78
Navegação
Exercício Criar paginas jsp (vazias, apenas com
links/command) para recriar a seguinte navegação
InicioClientes Pedidos
Novo pedido
Novo cliente
Lista de clientes
Lista depedidos
Alterar cliente
Alterarpedido
Curso JavaServer Faces 79
Tags Padrão JSF
Tags fundamentas JSF (core)● <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
Tag Descriçãoview Visãosubview Subvisãofacet Facet de um componenteattribute Adiciona um atributo a um componenteparam Adiciona um parametro a um componenteactionListener Adiciona listener de ação para um componentevalueChangeListener Adiciona listener de alteração de valorconverter Adiciona um conversor a um componenteconvertDate Adiciona um conversor de datas a um componenteconvertNumber Adiciona um conversor Numérico a um componentevalidator Adiciona um validador a um componentevalidatorDoubleRange Adiciona um validador de faixa de numeros doublevalidateLength Adiciona um validador de extensãovalidateLongRange Adiciona um validador de vaixa de numeros longloadBundle Carrega o arquivo de mensagensselectItens Itens para um componente do tipo SelectselectItem Item para um comopnente de tipo Selectverbatim Adiciona codigo a página (não validado pelo JSF
Curso JavaServer Faces 80
Tags Padrão JSF
Tags html JSF● <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
Tag Descriçãoform Formulario htmlinputText Tag input type=textinputTextArea Tag textareainputSecret Tag input type=passwordinputHidden Tag input type=hiddenoutputLabel Rótulo de componenteoutputText Output de texto de uma linhaoutputFormat Mesmo que o anterior, mas formata o textooutputLink Ancora htmlcommandButton Buttom, submit, resetcommandLink Linkmessage Mensagem mais recente para um componentemessages Todas as mensagens
Tag DescriçãoselectOneListbox Caixa de listagemselectOneMenu ComboselectOneRadio Botões radioselectBooleanCheckbox CheckboxselectManyCheckbox Conjunto de checkboxselectManyListbox Caixa de listagem de seleção multiplaselectManyMenu Combo de seleção multiplapanelGrid Tabela htmlpanelGroup Componente são dispostos como umdataTable Tabela com mais funçõescolumn Coluna de uma data table
Curso JavaServer Faces 81
Tags Padrão JSF
Atributos comuns
Atributos Componentes Descriãoid Todos Identificação do componentebinding Todos Referencia para um componente em um beanrendered Todos Indica se o componente será renderizado (true/false)styleClass Todos Nome da classe CSS value Input, Output, Command Valor do componentevalueChangeListener Input, Output, Command Metodo de ação do componenteconverter Input, Output, Nome do conversorvalidator Input Nome do validadorrequired Input Se o preenchimento é obrigatório (true/false)
Curso JavaServer Faces 82
Tags Padrão JSF
IDs Ids são usadas para identificar os componentes
<h:inputText id="nome" .... /><h:message for="nome" />
(exibirá as mensagens referentes ao componente nome)
Curso JavaServer Faces 83
Tags Padrão JSF
Ligações Ligações (binding) permite que tenhamos variáveis
no bean “ligadas” a um componente da tela
<h:outputText binding="#{bean.resultado}" />
private UIComponent resultado = new UIOutput();
public UIComponent getResultato(){ return resultado; }
public void setResultado(UIComponent resultado){
this.resultado = resultado;
}
Curso JavaServer Faces 84
Tags Padrão JSF
Formulários A tag h:form do JSF representa uma tag form do
HTML Sobre a tag form:
Sempre é usado o método post A action do form é definida como sendo a própria página jsf
Atributos: binding, id, rendered, styleClass accept, acceptcharset, dir, enctype, lang, style, target, title onblur, onchange, onclick, onfocus, onkeydown, onkeypress,
onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
Curso JavaServer Faces 85
Tags JSF Padrão
Campos Texto e Área de texto Temos 3 tags diferentes para entrada de texto:
h:inputText h:inputSecret h:inputTextarea
Possuem os seguintes atributos: cols e rows (apenas para textarea) redisplay (apenas para secret)
Indica se o valor passado vai ser reexibido quando a página voltar da requisição
valueChangeListener
Curso JavaServer Faces 86
Tags JSF Padrão
Campos Texto e Área de texto Atributos (cont.)
bindig, converter, id, rendered, required, styleClass, value, validator (atributos básicos)
Accesskey, alt, dir, disabled, lang, maxlength, readonly, size, style, tabindex, title (atributos HTML 4.0)
onblur, onchange, onclick, onfocus, onkeydown, onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
Curso JavaServer Faces 87
Tags JSF Padrão
Exibição de textos Tags
h:outputText Somente exibo texto na página, mas se for passado um valor
para styleClass, este texto fica dentro de um span com o class contendo o valor do styleClass passado
h:outputFormat Como outputText se receber um styleClass é escrito dentro de
um span Pode receber parâmetros para o texto
<h:outputFormat value="{0} tem {1} anos"> <h:paran value="Luis"/> <h:param value="31"/></h:outputFormat>
Curso JavaServer Faces 88
Tags JSF Padrão
Exibição de textos Tags
h:outputLabel Semelhante a outputText, mas possúi o atributo “for” que indica
o id do componente ao qual este label pertence Atributos para outputText, outputLabel e
outputFormat escape
Se true utiliza códigos escape para os caracterers <, > e & (default é falso)
binding, converter, id, rendered, styleClass, value Style, title (atributos HTML 4.0)
Curso JavaServer Faces 89
Tags JSF Padrão
Exibindo imagens Para exibir imagens usamos a tag h:graphicImage
Ela é transformada na tag <img > do html Atributos
Binding, id, rendered, styleClass, value alt, dir, height, ismap, lang, longdesc, style, title, url, usemap,
width onblur, onchange, onclick, onfocus, onkeydown, onkeypress,
onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
<h:graphicImage value="/imagens/logo.jpg" />
Curso JavaServer Faces 90
Tags JSF Padrão
Campos escondidos A tag h:inputHidden é usada para armezenar
valores ocultos no formulário É transformada em input type=hidden Atributos
Binding, converter, ind required, validator, value, valueChangeListener
<h:inputHidden value="#{bean.propriedade}" />
Curso JavaServer Faces 91
Tags JSF Padrão
Botões e Links Botões são usados para executar submeter os
formulários e executar actions Usamos a tag commandButton
<h:commandButton value="Ok" action="#{bean.gravar}"/>
Existem 2 tipos de links, um como os botões<h:commandLink value="xpto" action="#{bean.salvar}"> <h:graphicImage value="/imgs/bg_gravar" /></h:commandLink>
O outro funciona como um href do html<h:outputLink value="http://www.java.net"> <h:outputText value="Java.net"/></h:outputLink>
Curso JavaServer Faces 92
Tags JSF Padrão
Atributos de commandButton e commandLink action – handler ou action que determina a próxima
página na navegação actionListener – evento a ser executado image – imagem para o commandButton immediate – se true as ações e eventos serão
executados no inicio do cliclo de vida e não no final type – para commandButton: reset, submit, button – para
commandLink conteúdo do recurso: text/html, image/gif, audio/basic, etc...
value – texto exibido no botão ou no link
Curso JavaServer Faces 93
Tags JSF Padrão
Atributos para commandButton e comandLink (cont).
accesskey, alt, binding, id, lang, rendered, styleClass dir, disabled, lang, readonly, style, tabindex, title, type Somente para comandLink
coords, href lang, rel, shape, target onblur, onchange, onclick, onfocus, onkeydown,
onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
Curso JavaServer Faces 94
Tags JSF Padrão
Usando botões<h:commandButton value="submit" type="submit"/>
<h:commandButton value="reset" type="reset"/>
<h:commandButton value="Click" type="button" onclick="alert('clicado');" />
<h:commandButton value="submit" type="submit"/>
<h:commandButton value="inicio" action="inicio"/>
<h:commandButton value="Logout" action="#{bean.logout}"/>
Curso JavaServer Faces 95
Tags JSF Padrão
Usando Links<h:commandLink> <h:outputText value="registrar" /></h:commandLink>
<h:commandLink style="font-style:intalic"> <h:outputText value="#{msg.linkRegistrar}" /></h:commandLink>
<h:commandLink value="#{msg.bemvindo}" action="#{bean.bemVindo}" actionListener="#{bean.eventBemVindo}"> <h:outputText value="registrar" /></h:commandLink>
<h:commandLink> <h:graphicImage value="/imagem/bt.jpg"/></h:commandLink>
Curso JavaServer Faces 96
Tags JSF Padrão
outputLink Funcionam como a tag <a href> do html Atributos
accesskey, binding, id, lang, rendered, styleClass, value Charset, coords, der, hreflang, rel, rev, shape, style,
tabindex, target, title, type onblur, onchange, onclick, onfocus, onkeydown,
onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
Curso JavaServer Faces 97
Tags JSF Padrão
Usando outputLinks<h:outputLink value="http://www.java.sun.com"> <h:graphicImage value="/img/logo_sun.jpg"/></h:outputLink>
<h:outputLink value="#{bean.linkSelected}"> <h:outputText value="#{bean.titleLinkSelected}"/></h:outputLink>
<h:outputLink value="#top"> <f:verbatim> <h4>Topo</h4> </f:verbatim></h:outputLink>
Curso JavaServer Faces 98
Tags JSF Padrão
Tags de Seleção O JSF possui as seguintes tags para seleção:
h:selectBooleanCheckbox h:selectManyCheckBox h:selectOneRadio h:selectOneListBox h:selectManyListBox h:selectOneMenu h:selectManyMenu
Curso JavaServer Faces 99
Tags JSF Padrão
Tags de Seleção Atributos
disabledClass, enabledClass Classe css para elementos desabilitados e abilitados
(apenas para selectOneRadio e selectManyCheckbox) layout
Especifica a direção que serão dispostos os elementos (LINE DIRECTION e PAGE DIRECTION)
binding, converter, id, styleClass, required, rendered, validator, value, valueChangeListener
accessKey, border, dir, disabled, lang, readonly, style, size, tabindex, title (border apenas para selectOneRadio e selectManyCheckbox, size selectOneListBox e selectManyListBox)
onblur, onchange, .... (evenos html)
Curso JavaServer Faces 100
Tags JSF Padrão
Tags de Seleção – CheckBox selectBooleanCheckbox pode ser vinculada a uma
propriedade booleana
<h:selectBooleanCheckbox value="#{bean.ativo}" />
private boolean ativo;
public boolean getAtivo() { return this.ativo; }
public void setAtivo(boolean ativo){
this.ativo=ativo;
}
Curso JavaServer Faces 101
Tags JSF Padrão
Tags de Seleção – CheckBox selectManyCheckbox pode ser vinculada a um array
ou a uma lista
<h:selectManyCheckbox value="#{bean.disponiveis}"> <f:selectItem itemValue="Sala 01"/> <f:selectItem itemValue="Sala 02"/> <f:selectItem itemValue="Sala 03"/></h:selectManyCheckbox>
private String[] disponiveis;public String[] getDisponiveis(){ return this.disponiveis; }public void setDisponiveis(String[] disponiveis){ this.disponiveis=disponiveis;}
Curso JavaServer Faces 102
Tags JSF Padrão
Tags de Seleção – RadioButton selectOneRadio pode ser vinculada a um unico
valor
<h:selectOneRadio value="#{bean.periodo}"> <h:selectItem itemValue="Manha"/> <h:selectItem itemValue="Tarde"/> <h:selectItem itemValue="Noite"/></h:selectOneRadio>
private String periodo;public String getPeriodo(){ return this.periodo; }public void setPeriodo(String periodo){ this.periodo=periodo;}
Curso JavaServer Faces 103
Tags JSF Padrão
Tags de Seleção – Combos e Listas h:selectOneListBox
Seleciona apenas um valor em uma lista h:selectManyListBox
Seleciona vários valores em uma lista h:selectOneMenu
Seleciona um valor em uma combo h:selectManyMenu
Seleciona vários valores em uma combo
Curso JavaServer Faces 104
Tags JSF Padrão
Tags de Seleção – Item f:selectItem representa um item de uma seleção
Atributos binding - id – ID do componente itemDescription – usado em ferramentas (não usado no html) itemDisabled – booleano, habilita/desabilita item itemLabel – texto exibido do item itemValue – valor enviado para o servidor value – expressão que aponta para uma instância da classe
SelectItem
Curso JavaServer Faces 105
Tags JSF Padrão
Classe SelectItem javax.faces.model.SelectItem
new SelectItem(“valor”) new SelectItem("valor", "label") new SelectItem("valor","label","descrição") new SelectItem("valor","label","descrição", true/false)
(true/false indica se está habilitado ou desabilitado)
Curso JavaServer Faces 106
Tags JSF Padrão
Tags de Seleção – Itens f:selectItems<h:selectOneRadio> <h:selectItems value="#{bean.opcoes}"/></selectOneRadio>
private SelectItem opcoes = { new SelectItem("C","Casado(a)"), new SelectItem("S","Solteiro(a)"), new SelectItem("V","Viuvo(a)"), new SelectItem("D","Desquitado(a)")};
public SelectItem[] getOpcoes(){ return this.opcoes; }
Curso JavaServer Faces 107
Tags JSF Padrão
Tags de Seleção – Itens Atributo value pode ser:
Única instância de SelectItem Coleção de instâncias de SelectItem Array de Instâncias de SelectItem Mapa (map), onde key/value representam label/valor do
SelectItem
Curso JavaServer Faces 108
Tags JSF Padrão
Tags de Seleção
Curso JavaServer Faces 109
Tags JSF Padrão
Tags de Seleção
Curso JavaServer Faces 110
Tags JSF Padrão
Tags de seleção – Grupos de Itens Usado para agrupar itens em uma list ou combo
public List getOpcoes(){ List opcoes = new ArrayList();
SelectItemGroup eletronicos = new SelectItemGroup("Eletronicos", //valor "Opcionais Eletronicos", //descricao true, //habilitado/desabilitado getEletronicos()); //array de SelectItens opcoes.add(eletronicos);
SelectItemGroup mecanicos = new SelectItemGroup("Mecânicos");mecanios.setSelectItems(getMecanicos());
opcoes.add(mecanicos);
return opcoes;}
Curso JavaServer Faces 111
Tags JSF Padrão
Tags de seleção – Grupos de Itens
<h:selectOneListbox >
<f:selectItems value="#{bean.opcoes}"/>
</h:selectOneListbox>
Curso JavaServer Faces 112
Tags JSF Padrão
Tags de mensagens h:message
Exibe uma mensagem referente a um componente que tenha sido armazenada no contexto
h:messages Exibe todas as mensagens armazenadas no contexto
Tipos de mensagens Informação Advertência Erro Fatal
Curso JavaServer Faces 113
Tags JSF Padrão
Tags de Mensagem AtributosAtributo Descriçãofor ID ao qual a mensagen se refere (h:message somente)errorClass Classe CSS para mensagens de erroerrorStyle Estilo CSS para mensagens de errofatalClass Classe CSS para mensagens fataisfatalStyle Estilo CSS para mensagens fataisglobalOnly Somente mensagens globais (h:messages somente)infoClass classe CSS para mensagens de informaçãoinfoStyle Estilo CSS para mensagens de informaçãolayout Layout da mensagem: table ou list (h:messages somente)showDetail Se os detalhes das mensagem serão exibidos: true/falseshowSummary Se os sumários das mensagens serão exibidos: true/falsetootip Se os detalhes das mensagens serão exibidos na tooltip (true/false)warnClass Classe CSS para mensagens de advertênciawarnStyle Estilo CSS para mensagens de advertênciabinding, id, rendered, Atributos básicos
Curso JavaServer Faces 114
Tags JSF Padrão
Painéis - h:panelGrid Renderiza uma tabela HTML Permite definir um cabeçalho e um roda pé para a
tabela Permite apenas um único componente por célula Não permite colspan e rowspan
Curso JavaServer Faces 115
Tags JSF Padrão
Painéis - h:panelGrid Atributos
Atributo Descriçãobgcolor Cor de fundo da tabelaborder Largura da bordacellpadding Espessura das célulascellspacing Espaçamento entre as celulascolumnClasses Lista de classes CSS para as colunascolumns Número de colunasfooterClass Classe CSS para o rodapéheaderClass Classe CSS para o cabeçalhoframe Lados da tabela que serão desenhados: none, above, below, hsides, vsides, lhs, rhs, box, borderrowClasses Lista de classes CSS para as linhasrules Linhas desenhadas entre as células: groups, rows, columns, allbinding, id, rendered, Atributos básicosstyleClass dir, lang, style, title, width Atributos HTMLonclick, onkeydow, etc.... Eventos DHTML
Curso JavaServer Faces 116
Tags JSF Padrão
Painéis – h:panelGroup Usado para agrupar vários componentes (são
considerados um componente para uma célula do panelGrid)
Atributos
Atributos Descriçãobinding, id, rendered, styleClassAtributos básicosstyle Atributo HTML
Curso JavaServer Faces 117
Tags JSF Padrão
Painéis – f:facet Não tem representação visual É utilizado para indicar partes de um componente
header footer title Etc....
Atributo name – nome da “parte” que este representa<f:facet name="header">
<h:outputText value="Lista de valores" /></f:facet>
Curso JavaServer Faces 118
Tags JSF Padrão
Painéis - Exemplo
<h:panelGrid columns="2"><f:facet name="header"><h:outputText value="Login"/></f:facet><h:outputText value="Nome" /> <h:panelGroup>
<h:inputText id="nome" value="#{bean.nome}" required="true" />
<h:message for="nome" errorStyle="color:red" /></h:panelGroup> <h:outputText value="Nome" /> <h:panelGroup>
<h:inputSecret id="Senha" value="#{bean.periodo}" required="true" />
<h:message for="senha" errorStyle="color:red" /></h:panelGroup> <f:facet name="footer">
<h:commandButton value="Ok" action="#{bean.efetuarLogin}"/></f:facet>
</h:panelGrid>
Curso JavaServer Faces 119
Tags JSF Padrão
Exercício Criar uma tela (jsp e bean) de cadastro de clientes
contendo: Nome*, endereço, telefone, cpf* Sexo* – M/F (radio) Estado Civil – Casado, Solteiro, Viuvo (combo) Areas de interesse – informatica, automóveis, esportes,
etc... (checkbox) Observações – (text area) Ativo – (checkbox - boolean)
Campos com * são obrigatórios, deve-se usar mensagens e painéis para o layout
Curso JavaServer Faces 120
Tag JSF Padrão
Exercício Utilize o projeto ExemploCadastro e o banco de
dados que o acompanha (hsqldb) Classes
cadastro.dao.ClienteDAO Métodos: inserirCliente, alterarCliente, consultarCliente,
excluirCliente cadastro.dao.InteressesDAO
Método: listarIntereses cadastro.dto.Cliente cadastro.util.Banco cadastro.web.ServerListener
Página consulta.jsp
Curso JavaServer Faces 121
Tabela de Dados
h:dataTable Permite a exibição de dados em formato tabular,
utilizando tabelas HTML Aceita as seguintes fontes de dados no atributo
value array java.util.List java.sql.ResultSet javax.servlet.jsp.jstl.sql.Result javax.faceslmodel.DataModel
Curso JavaServer Faces 122
Tabela de Dados
h:dataTable A medida que é executado, cada item do valor
passado se torna disponível dentro do corpo da tag O atributo var de dataTable é utilizado para dar um
nome ao item durante a execução Qualquer objeto java pode ser passado para value,
neste caso, se for um escalar (não é um tipo de coleção) não ocorrerá iteração e o mesmo objeto será passado para o var
Só é permitido dentro da tag dataTable h:columns e f:facet
Curso JavaServer Faces 123
Tabela de Dados
h:dataTable atributos
Atributo Descriçãobgcolor Cor de fundo da tabelaborder Largura da borda da tabelacellpadding Espessura das células da tabelacellspacing Espaçamento entre as células da tabelacolumnClasses Lista separada por vírgula das classes CSS para as colunasfirst Indice da primeira linha mostradafooterClass Classe CSS para o rodapé da tabelaframe Especificação dos lados da tabela: none, above, below, hsides, vsides
lhs, rhs, box, borderheaderClasse Classe CSS para o cabeçalho da tabelarowClasses Lista separada por virgula das classes CSS para as linhasrows Número de linhas a ser exibidarules Linhas desenhadas entre células: groups, rows, columns, allvar Nome da variável que representará o itembinging, id, rendered, .... Atributos básicosdir, lang, style, width Atributos HTML
Curso JavaServer Faces 124
Tabela de Dados
h:column Representa uma coluna da tabela Só é permitida a utilização de componentes faces
Para exibir textos deve-se utilizar h:outputText ou f:verbatim
Atributos: binding id rendered
Curso JavaServer Faces 125
Tabela de Dados
Cabeçalhos e rodapés Para termos cabeçalhos de colunas e rodapés de
colunas basta usar facets footer para rodapés header para cabeçalhos
Os facets são definidos dentro de cada coluna Podemos ter um cabeçalho e um rodapé para a
tabela, basta utilizar facets dentro da dataTable para header e footer (devem estar fora das colunas)
Curso JavaServer Faces 126
Tabela de Dados
Exemplo
<h:dataTable value="#{bean.lista}" var="cliente"><f:facet name="header">
<h:outputText value="Lista de Clientes"/></f:facet><h:column>
<f:facet name="header"><h:outputText value="Nome" />
</f:facet><h:outputText value="#{cliente.nome}"/>
</h:column><h:column>
<f:facet name="header"><h:outputText value="Telefone" />
</f:facet><h:outputText value="#{cliente.telefone}"/>
</h:column></h:dataTable>
Curso JavaServer Faces 127
Tabela de Dados
Estilos Você pode definir estilos:
Para a tabela como um todo (styleClass) Cabeçalhos e rodapés de colunas (headerClass e
footerClass) Colunas individuais (columnClasses) Linhas individuais (rowClasses)
Curso JavaServer Faces 128
Tabela de Dados
Estilos de Colunas<style>
.tabela {width: 100%;
}.cabecalho { font-weight: bold; font-family: sans-serif; background-color: teal;}.colunaNome { background-color: gray; }.colunaTelefone { background-color: silver;}
</style>.......
<h:dataTable value="#{clienteInsert.listaClientes}" var="cliente" styleClass="tabela" headerClass="cabecalho" columnClasses="colunaNome, colunaTelefone">
Curso JavaServer Faces 129
Tabela de Dados
Estilos de Colunas
Curso JavaServer Faces 130
Tabela de Dados
Estilos de Linhas<style>
.tabela {width: 100%;
}.cabecalho { font-weight: bold; font-family: sans-serif; background-color: teal;}.linhaImpar { background-color: yellow; }.linhaPar { background-color: silver;}</style>
....
<h:dataTable value="#{clienteInsert.listaClientes}" var="cliente" styleClass="tabela" headerClass="cabecalho" rowClasses="linhaImpar,linhaPar">
Curso JavaServer Faces 131
Tabela de Dados
Estilos de Linhas
Curso JavaServer Faces 132
Tabela de Dados
Exercício Criar uma tela para consultar os clientes
cadastrados Criar um bean para a tela de consulta
Armazenar os dados numa list Usar uma action para ler os dados do banco usando o dao e
setar a list Criar uma pagina para consulta utilizando dataTable
Utilizar CSS para formatar a página
Curso JavaServer Faces 133
Tabela de Dados
Utilizando componentes nas células Todos os componentes que vimos podem ser
usados dentro das celulas de uma tabela Podem ser manipulados da mesma maneira que
componentes fora da tabela Renderização condicionar Desabitá-los Eventos Ações Etc...
Assim como nos componentes da página, os valores serão atualizados dentro do bean, mesmo estando dentro de uma list
Curso JavaServer Faces 134
Tabela de Dados
Utilizando componentes nas células
Curso JavaServer Faces 135
Tabela de Dados
Dica: selecionar linhas para exclusão Ao invés de termos uma lista de beans cliente,
vamos usar um map, que conterá o cliente e um valor booleando indicando se a linha foi excluída
List tmp = dao.consultarCliente();clientes = new ArrayList();for(int i = 0; i<tmp.size(); i++) {
Map mapa = new HashMap();mapa.put("cliente", tmp.get(i));mapa.put("excluir", Boolean.valueOf(false));clientes.add(mapa);
}
Curso JavaServer Faces 136
Tabela de Dados
Dica: selecionar linhas para exclusão
<h:dataTable value="#{clienteInsert.listaExcluir}" var="mapa" styleClass="tabela" headerClass="cabecalho"rowClasses="linhaImpar,linhaPar">
<f:facet name="header"><h:outputText value="Lista de Clientes"/>
</f:facet><h:column>
<f:facet name="header"><h:outputText value="Excluir" />
</f:facet><h:selectBooleanCheckbox value="#{mapa.excluir}" />
</h:column><h:column>
<f:facet name="header"><h:outputText value="Nome" />
</f:facet><h:outputText value="#{mapa.cliente.nome}"/>
</h:column>.....
<h:commandButton value="Excluir" action="#{bean.excluir}"/>
Curso JavaServer Faces 137
Tabela de Dados
Dica: selecionar linhas para exclusão Na ação do botão excluir basta verificarmos na lista
quais linhas possuem no mapa o valor excluir setado para true
Curso JavaServer Faces 138
Tabela de Dados
Exercício Seguindo a dica anterior, implemente a exclusão no
nosso exemplo de cadastro Crie um bean para a tela de manutenção
Este bean deve ter um atribudo que é a lista para exclusão Deve-se criar uma ação para excluir as linhas A exclusão deverá remover do banco as linhas selecionadas A lista deverá ser lida novamente ao final da exclusão
Crie a tela para manutenção como na dica
Curso JavaServer Faces 139
Tabela de Dados
Modelo de tabelas Todos os dados passados para um dataTable são
“empacotados” dentro de um modelos Pacote javax.faces.model temos os seguinte
modelos usados ArrayDataModel ListDataModel ResultDataModel ResultSetDataModel ScalarDataModel
Curso JavaServer Faces 140
Tabela de Dados
Modelo de tabelas Todos os modelos extendem a classe DataModel
esta possui os seguintes métodos:
Todos os modelos tem um contrutor que recebe como parametro um objeto do seu tipo correspondente (List, ResultSet, etc...)
Método Descriçãoget/setWrappedData Retorna/seta o objeto que contem os dados do modeloget/setRowIndex Retorna/seta o indice da linha para exibiçãogetRowData Retorna o item correspondente ao indice setadoisRowAvaliable Retorna true se a linha está disponívelgetRowCount Retorna o número total de linhas
Curso JavaServer Faces 141
Tabela de Dados
Modelo de Tabelas
public ListDataModel getListaExcluir(){ if (dataModel!=null) return dataModel;
ClienteDAO dao = new ClienteDAO();List tmp = dao.consultarCliente();clientesExcluir = new ArrayList();for(int i = 0; i<tmp.size(); i++) {
Map mapa = new HashMap();mapa.put("cliente", tmp.get(i));mapa.put("excluir", Boolean.valueOf(false));clientesExcluir.add(mapa);
}dataModel = new ListDataModel(clientesExcluir);
return dataModel;}
Curso JavaServer Faces 142
Tabela de Dados
Modelo de Tabelas O método getRowData pode ser utilizado para
recuperarmos o item de uma linha onde uma action foi acionada:
public String alterar(){Map mapa = (Map)dataModel.getRowData();Cliente cliente = (Cliente) mapa.get("cliente");alterarClienteMB.setCliente(cliente);return "alterarCliente";
}
Curso JavaServer Faces 143
Tabela de Dados
Exercício Implemente a opção de altera no exemplo de
cadastro Troque a lista por um ListDataModel Crie o método alterar no bean Adicione uma coluna para acionar a ação alterar Crie uma tela para alteração (pode ser a mesma de
inclusão, ctrl+c ;-) Crie um bean e um metodo para atualizar os atributos da
tela, a partir de um bean cliente Crie o método que irá atualizar os dados no banco de
dados chamando o DAO
Curso JavaServer Faces 144
Tabela de Dados
Dica: Implementar ordenação Extender DataModel
package cadastro.mb;import java.util.Collections;import java.util.Comparator;import java.util.List;import java.util.Map;import javax.faces.model.DataModel;import cadastro.dto.Cliente;
public class SortedDataModel extends DataModel {List wrappedData = null;int index = 0;
public SortedDataModel(List clientes) { this.wrappedData = clientes;}
public int getRowIndex() {return index; }public void setRowIndex(int index) {this.index = index;}public Object getWrappedData() {return wrappedData; }public void setWrappedData(Object data) {wrappedData = (List) data; }
Curso JavaServer Faces 145
Tabela de Dados
Dica: Implementar ordenação
public int getRowCount() {return wrappedData != null ? wrappedData.size() : 0;
}
public Object getRowData() {if (wrappedData != null && index >= 0 && index < wrappedData.size()) {
return wrappedData.get(index);}return null;
}public boolean isRowAvailable() {
if (wrappedData != null && index >= 0 && index < wrappedData.size()) {return true;
}return false;
}
Curso JavaServer Faces 146
Tabela de Dados
Dica: Implementar ordenação
public void ordenarPorNome(){Collections.sort(wrappedData, comparatorNome);
}
public static Comparator comparatorNome= new Comparator(){public int compare(Object o1, Object o2) {
Cliente cli1 = (Cliente) ((Map)o1).get("cliente");Cliente cli2 = (Cliente) ((Map)o2).get("cliente");return cli1.getNome().compareTo(cli2.getNome());
}
};
Curso JavaServer Faces 147
Tabela de Dados
Dica: Implementar ordenação
public void ordenarPorTelefone(){Collections.sort(wrappedData, comparatorTelefone);
}
public static Comparator comparatorTelefone= new Comparator(){public int compare(Object o1, Object o2) {
Cliente cli1 = (Cliente) ((Map)o1).get("cliente");Cliente cli2 = (Cliente) ((Map)o2).get("cliente");return cli1.getTelefone().compareTo(cli2.getTelefone());
}};
Curso JavaServer Faces 148
Tabela de Dados
Dica: Implementar ordenação
<h:column><f:facet name="header">
<h:commandLink action="#{cliente.listaManutencao.ordenarPorNome}"><h:outputText value="Nome" />
</h:commandLink></f:facet><h:outputText value="#{mapa.cliente.nome}" />
</h:column><h:column>
<f:facet name="header"><h:commandLink
action="#{cliente.listaManutencao.ordenarPorTelefone}"><h:outputText value="Telefone" />
</h:commandLink></f:facet><h:outputText value="#{mapa.cliente.telefone}" />
</h:column>
Curso JavaServer Faces 149
Tabela de Dados
Dica: Implementar ordenação
Curso JavaServer Faces 150
Tabela de Dados
Exercício Implementar o DataModel com capacidades de
ordenação Implementar ordenação por:
Nome Telefone Endereço
Curso JavaServer Faces 151
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de vida O Ciclo de vida de uma requisição JSF possúi
várias “fases”:
Curso JavaServer Faces 152
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de Vida Restaurar view
Recupera a árvore de componentes que representa a view.
Curso JavaServer Faces 153
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de vida Aplicar valores do request
É realizada a conversão default Conversão customizada
Curso JavaServer Faces 154
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de Vida Processar validações
Validação padrãoValidação customizada:
Método de açãoClasse de validação customizadaValidação de método “inline”
Curso JavaServer Faces 155
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de Vida Atualizar valores do modelo
Os beans (model) são atualizados com os valores dos componentes
Curso JavaServer Faces 156
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de Vida Executar aplicação
Chamar os eventosexecutar os métodos (ações)Processar a navegação
Curso JavaServer Faces 157
Conversores e Validadores
Requisição
RestaurarView
Aplicar valoresdo request
Processarvalidações
Atualizar valores do modelo
Executaraplicação
RenderizarResposta
Resposta
Ciclo de Vida Renderizar resposta
Valores dos componentes são recuperados para renderização
Curso JavaServer Faces 158
Valor submetido=”10/11/2003”valor local = objeto tipo Date
Conversores e Validadores
Processo de conversão Dados lidos da requisição É setado no componente o atributo submitedValue É exetudado o metodo getAsObject do conversor
associado ao componente É feita validação (caso haja) método validate Modelo é atualizado (bean)
UIInput
DataNascimento = objeto tipo date
Modelo - Bean
Curso JavaServer Faces 159
Conversores e Validadores
Conversores padrão f:convertNumber
Atributo Tipo Descriçãotype String number (default), currency ou percentpattern String Padrão de formatação, conforme java.text.DecilmalFormatmaxFractionDigits Int Numero máximo de digitos na parte fracionáriaminFractionDigits Int Numero mínimo de digitos na parte fracionáriamaxIntegerDigits Int Numero máximo de digitos na parte inteiraminIntegerDigits Int Numero mínimo de digitos na parte inteiraintegerOnly Boolean Se verdadeiro, considera somente a parte inteira (default: false)groupingUsed Boolean Se usa separadores de grupos (default: true)locale java.util.Locale Variável de locale que sera usada na formatação e no parsingcurrencyCode String Código monetario isso 4217currencySymbol String Simbolo monetário a ser usado
Curso JavaServer Faces 160
Conversores e Validadores
Conversores padrão f:convertDateTime
Atributo Tipo Descriçãotype String date (default), time ou both dateStyle String default, short, medium, long ou full timeStylle String default, short, medium, long ou full Pattern Int Padrão de formatação de acordo com java.text.SimpleDateFormatlocale java.util.Locale Localização cujas preferências são usadas para parsing e formataçãotimeZone java.util.TimeZone Fuso horário a ser usado para parsing e formatação
Curso JavaServer Faces 161
Conversores e Validadores
Atributo Converter É possivel atribuir um conversor a um componente
sem a necessidade de usar a tag de conversão
Deve-se usar um id definido para o conversor: javax.faces.DateTime (usado no converterDateTime) javax.faces.Number (usado no converterNumber) Para tipos primitivos e wrappers
javax.faces.Boolean, javax.faces.Byte, javax.faces.Character, javax.faces.Double, javax.faces.Float, javax.faces.Integer, javax.faces.Long javax.faces.Short
javax.faces.BigDecimal e javax.faces.BigInteger
<h:inputText id="limite" value="#{clienteInsert.limiteCredido}" converter="javax.faces.Double"/>
Curso JavaServer Faces 162
Conversores e Validadores
Erros de conversão Componente gera uma mensagem de erro sempre
que ocorrer um erro de conversão Deve-se usar h:message ou h:messages para exibir a
mensagem A página é exibida novamente Dica:
h:messages não é muito util para exibir mensagens para cada componente, é mais indicado para mensagens globais, mas caso esteja ocorrendo um erro na página que você não consegue identificar, use-o para exibir todas as mensagens (detail=true)
Curso JavaServer Faces 163
Conversores e Validadores
Erros de conversão Para alterar a mensagem padrão devemos criar
uma nova mensagem no nosso arquivo de mensagens, com o código abaixo
javax.faces.component.UIInput.CONVERSION=.... javax.faces.component.UIInput.CONVERSION_detail=....
Devemos incluir nosso arquivo de mensagens no arquivo de configuração da aplicação<application>
<message-bundle>cadastro.mensagens</message-bundle></application>
Curso JavaServer Faces 164
Conversores e Validadores
Exercício Na tela de inclusão de clientes
Incluir o campo para data de nascimento do cliente Na tela de consulta
Na tabela, incluir uma coluna com a data de nascimento
Curso JavaServer Faces 165
Conversores e Validadores
Validadores padrão
Tag JSP Classe do validador Atributos Validaf:validadteDoubleRange DoubleRangeValidator minimum, Valor double dentro de uma faixa
maximum f:validateLongRange LongRangeValidator minimum, Valor long dentro de uma faixa
maximum f:validateLength LengthValidator minimum, String com número máximo e mínimo
maximum de caracteres
<h:inputTextarea id="obs" value="#{clienteInsert.obs}" cols="50" rows="3"><f:validateLength maximum="400"/>
</h:inputTextarea>
Curso JavaServer Faces 166
Conversores e Validadores
Valores Obrigatórios Para obrigar o preenchimento de um componente,
basta usar o atributo required=“true”
<h:inputText id="nome" value="#{clienteInsert.nome}" maxlength="50" required="true"/>
Curso JavaServer Faces 167
Conversores e Validadores
Erros de validação São exibidos da mesma maneira que os erros de
conversão Mensagens padrão:
Mensagem simples javax.faces.component.UIInput.REQUIRED
Mensagem com parametros ( {0} max, {1} min) javax.faces.validator.NOT_IN_RANGE javax.faces.validator.DoubleRangeValidator.MAXIMUM javax.faces.validator.LongRangeValidator.MAXIMUM javax.faces.validator.DoubleRangeValidator.MINIMUM javax.faces.validator.LongRangeValidator.MINIMUM
Curso JavaServer Faces 168
Conversores e Validadores
Erros de validação Mensagens padrão (cont):
javax.faces.validator.DoubleRangeValidator.TYPE javax.faces.validator.LongRangeValidator.TYPE javax.faces.validator.LengthValidator.MAXIMUM javax.faces.validator.LengthValidator.MINIMUM
Estas mensagens tambem tem a opção detail javax.faces.component.UIInput.REQUIRED_detail javax.faces.validator.NOT_IN_RANGE_detail etc....
Curso JavaServer Faces 169
Conversores e Validadores
Ignorando a validação e a conversão Caso na tela exista um botão para cancelar a
entrada de dados, não desejaremos que seja feita uma validação dos dados entrados (não só validação, mas conversão tambem)
Para ignorarmos estes passos usamos o atributo immediate
<h:commandLink value="Cancelar" action="#{clienteInsert.cancelar}" immediate="true" />
Curso JavaServer Faces 170
Conversores e Validadores
Exercício No cadastro de clientes fazer a validação do campo
observação, para que este não ultrapasse 200 caracteres.
Curso JavaServer Faces 171
Conversores e Validadores
Conversores personalizados Devemos implementar a interface
javax.faces.convert.ConverterObject getAsObject(FacesContext context, UIComponent component, String newValue)
String getAsString(FacesContext context, UIComponent component, Object value)
Caso ocorra erro na execução deve ser lançada a exception javax.faces.convert.ConverterException
Curso JavaServer Faces 172
Conversores e Validadores
Exemplo: conversor de Data com suporte a GregorianCalendar
pakage converter;import java.text.SimpleDateFormat;import java.util.Date;import java.util.GregorianCalendar;import javax.faces.application.FacesMessage;import javax.faces.component.UIComponent;import javax.faces.context.FacesContext;import javax.faces.convert.Converter;import javax.faces.convert.ConverterException;
public class DateConverter implements Converter{
private String pattern="dd/MM/yyyy";
....
}
Curso JavaServer Faces 173
Conversores e Validadores
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value==null || value.trim().length()==0) return null; SimpleDateFormat sd = new SimpleDateFormat(pattern); sd.setLenient(false); Object retorno = null; try { Date dt = sd.parse(value); if (component.getValueBinding("value").getType(context) ==
Date.class) { retorno = dt; } else if (component.getValueBinding("value").getType(context) ==
GregorianCalendar.class) { retorno = new GregorianCalendar(); ((GregorianCalendar)retorno).setTime(dt); } } catch (Exception e ){ Object[] parametros = new Object[]{value, component.getId()}; FacesMessage mensagem = FacesUtil.getMessage("DATECONVERTER.ERROR",
"DATECONVERTER.ERROR_detail", parametros, FacesMessage.SEVERITY_ERROR);
throw new ConverterException(mensagem); } return retorno; }
Curso JavaServer Faces 174
Conversores e Validadores
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (value==null) return ""; SimpleDateFormat sd = new SimpleDateFormat(pattern); sd.setLenient(false); if (value instanceof Date) { return sd.format((Date) value); } if (value instanceof GregorianCalendar) { return sd.format(((GregorianCalendar) value).getTime()); } Object[] parametros = new Object[]{value.getClass(),
component.getId()}; FacesMessage mensagem = FacesUtil.getMessage("DATECONVERTER.FATAL",
"DATECONVERTER.FATAL_detail", parametros, FacesMessage.SEVERITY_FATAL);
throw new ConverterException(mensagem);
}
Curso JavaServer Faces 175
Conversores e Validadores
Exemplo: configuração FacesConfig.xml
<application> <message-bundle>mensagens</message-bundle> </application> <converter> <converter-id>dateConverter</converter-id> <converter-class>converter.DateConverter</converter-class> </converter>
Curso JavaServer Faces 176
Conversores e Validadores
Exemplo: mesagens mensagens.properties
DATECONVERTER.ERROR=Data inválidaDATECONVERTER.ERROR_detail=O valor {0} entrado no campo {1} é inválidoDATECONVERTER.FATAL=Tipo de dados inválidoDATECONVERTER.FATAL_detail=Tipo de dados {0} inválido no componente {1}
Curso JavaServer Faces 177
Conversores e Validadores
Exemplo: utilização
<h:inputText id="data" value="#{bean.campoData}"> <f:converter converterId="dateConverter" /></h:inputText>
Curso JavaServer Faces 178
Conversores e Validadores
Como ler mensagens: public static FacesMessage getMessage( String id, String idDetail,
Object[] parameters, Severity severity) { FacesContext context = FacesContext.getCurrentInstance(); UIViewRoot viewRoot = context.getViewRoot(); Locale locale = viewRoot.getLocale(); String bundleName = context.getApplication().getMessageBundle(); ClassLoader loader = Thread.currentThread().getContextClassLoader(); ResourceBundle bundle = ResourceBundle.getBundle(bundleName, locale, loader); String idMessage = bundle.getString(id); String idDetailMessage = bundle.getString(idDetail); MessageFormat formatter = new MessageFormat(idMessage, locale); String mensagem = formatter.format(parameters); formatter = new MessageFormat(idDetailMessage, locale); String mensagemDetalhe= formatter.format(parameters); FacesMessage fm = new FacesMessage(severity, mensagem, mensagemDetalhe); return fm; }
Curso JavaServer Faces 179
Conversores e Validadores
Como ler Mensagens FacesContext – contexto faces
getViewRoot – view da requisição corrente getApplication – retorna uma instancia de Application
desta aplicação getApplication().getMessageBundle – retorna o nome do
arquivo de mensagens associado a aplicação FacesMessage – classe que representa uma
mensagem do faces SEVERITY_ERROR, SEVERITY_FATAL,
SEVERITY_INFO, SEVERITY_WARN: constantes de tipos de mensagens
Curso JavaServer Faces 180
Convesores e Validadores
Validadores Personalizados Devem implementar a interface
javax.faces.validator.Validatorvoid validate(FacesContext context, UIComponent
component, Object value) Em caso de erro de validação deve ser lancaça a
exception javax.faces.validator.ValidatorException
Curso JavaServer Faces 181
Conversores e Validadores
Exemplo: validador de CPFpackage converter;import javax.faces.application.FacesMessage;import javax.faces.component.UIComponent;import javax.faces.context.FacesContext;import javax.faces.validator.Validator;import javax.faces.validator.ValidatorException;
public class CPFValidator implements Validator{
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value==null) return; boolean valido = false; try { valido = valid(value.toString()); } catch (NumberFormatException e) { valido = false; } if (!valido) { Object[] parametros = new Object[]{value.toString(), component.getId()}; FacesMessage mensagem = FacesUtil.getMessage("CPFVALIDATOR.ERROR",
"CPFVALIDATOR.ERROR_detail", parametros, FacesMessage.SEVERITY_ERROR);
throw new ValidatorException(mensagem); } }(continua)
Curso JavaServer Faces 182
Conversores e Validadores
private static boolean valid(String cpf) throws NumberFormatException { if (cpf==null || cpf.trim().length()==0) return true; if (cpf.length()!=11){ return false; } //calcula primeiro digito int[] valores = new int[]{10,9,8, 7, 6, 5, 4, 3, 2}; int[] total = new int[9]; int somatorio = 0; for (int i = 0; i<9; i++){ total[i] = valores[i] * (Integer.parseInt(String.valueOf(cpf.charAt(i)))); somatorio+=total[i]; } int resultado = (int) somatorio/11; int resto = somatorio % 11; int primeiroDigito=0; if (resto>2) { primeiroDigito = 11-resto; }
(continua)
Curso JavaServer Faces 183
Conversores e Validadores
//calcula segundo digito valores = new int[]{11,10,9,8, 7, 6, 5, 4, 3, 2}; total = new int[10]; somatorio = 0; for (int i = 0; i<10; i++){ total[i] = valores[i] * (Integer.parseInt(String.valueOf(cpf.charAt(i)))); somatorio+=total[i]; } resultado = (int) somatorio/11; resto = somatorio % 11; int segundoDigito = 0; if (resto>2) { segundoDigito = 11-resto; } //compara digitos if (cpf.substring(9,11).equals("" + primeiroDigito + "" + segundoDigito)){ return true; } return false; }
}
Curso JavaServer Faces 184
Conversores e Validadores
Exemplo: configuração
Mensagens
Utilização
<validator> <validator-id>cpfValidator</validator-id> <validator-class>converter.CPFValidator</validator-class> </validator>
CPFVALIDATOR.ERROR=CPF InválidoCPFVALIDATOR.ERROR_detail=O valor {0} do campo {1} não é um CPF válido
<h:inputText id="cpf" value="#{bean.cpf}"> <f:validator validatorId="cpfValidator"/></h:inputText>
Curso JavaServer Faces 185
Conversores e Validadores
Tag para conversor personalizado Util para conversores que necessitem de
parametros Deve-se criar uma classe que extenda
javax.faces.webapp.ConverterTag No construtor da classe deve ser setado o id do
conversor, utilizando super.setConverterId Subrescrever o método createConverter Utilizar o super.createConverter para pegar o conversor
É nessesário criar um arquivo TLD para identificar a nossa tag de conversor
Curso JavaServer Faces 186
Conversores e Validadores
Exemplo: tag para nosso DataConverter
package converter;import javax.faces.application.Application;import javax.faces.context.FacesContext;import javax.faces.convert.Converter;import javax.faces.webapp.ConverterTag;import javax.faces.webapp.UIComponentTag;import javax.servlet.jsp.JspException;public class DataConverterClass extends ConverterTag{ private String pattern; public String getPattern() { return pattern; }
public void setPattern(String pattern) { this.pattern = pattern; } public DataConverterClass() { setConverterId("dataConverter"); }
(continua)
Curso JavaServer Faces 187
Conversores e Validadores
public Converter createConverter() throws JspException { DateConverter converter = (DateConverter) super.createConverter(); converter.setPattern(eval(getPattern())); return converter; } public static String eval(String expression){ if (expression!=null && UIComponentTag.isValueReference(expression)){ FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication(); return "" + app.createValueBinding(expression).getValue(context); } else return expression; }
}
Exemplo: tag para nosso DataConverter
Curso JavaServer Faces 188
Conversores Validadores
Exemplo: tag para nosso DataConverter Salvar estados do conversor
Nossa classe de coversão deve implementar Serializable Ou implementar StateHolder (caso não possa ser usado
serializable) Deve ter um construtor padrão Implementar os métodos
Object saveState(FacesContext context) void restoreState(FacesContext context, Object state)
Object pode ser um array que irá armazenas as variávies que podem ser serializadas
Criar uma propriedade transient (setTransient e isTransient) do tipo boolean (aparentemente não tem efento nenhum (?))
Curso JavaServer Faces 189
Converores e Validadores
Exemplo: tag para nosso DataConverter Alterar classe do conversor
Implementar Serializable Incluir métodos de acesso na nossa classe
DateConverter para o parametro pattern
public class DateConverter implements Converter, Serializable{
public String getPattern() { return pattern; } public void setPattern(String pattern) { this.pattern = pattern; }
Curso JavaServer Faces 190
Conversores e Validadores
Exemplo: tag para nosso DataConverter Criar arquivo TLD para a tag
<?xml version="1.0" encoding="UTF-8"?><taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version> <short-name>convertertag</short-name> <uri>/WEB-INF/ConverterTag</uri> <tag> <name>dataConverter</name> <tag-class>converter.DataConverterTag</tag-class> <body-content>EMPTY</body-content> <attribute> <name>pattern</name> <rtexprvalue>true</rtexprvalue> </attribute> </tag></taglib>
Curso JavaServer Faces 191
Conversores e Validadores
Exemplo: tag para nosso DataConverter Utilização
<%@taglib prefix="cv" uri="/WEB-INF/ConverterTag" %>
<h:inputText id="gdata" value="#{teste.data}"> <cv:dataConverter pattern="dd-MM-yyyy"/></h:inputText>
Curso JavaServer Faces 192
Conversores e Validadores
Tag para validadores personalizados Segue o mesmpo padrão de conversores
Deve-se extender a classe javax.faces.webapp.ValidatorTag
No construtor usar setValidatorId Sobrescrever createValidator
Classe do Validator deve implementar Serializable ou StateHolder
Implementar os métodos saveState restoreState isTransiente setTransient
Curso JavaServer Faces 193
Conversores e Validadores
Passando atributos sem usar uma tag personalizada Utiliza-se a tag f:attribute
Deve-se pegar o atributo direto do componente
<h:inputText id="data" value="#{bean.data}"><f:converter converterId="dateConverter" /><f:attribute name="pattern" value="dd-mm-yyyy"/>
</h:inputText>
pattern = (String) component.getAttributes().get("pattern");
Curso JavaServer Faces 194
Conversores e Validadores
Exercícios Implementar o conversor de data com suporte a
GregorianCalendar Implementar a tag para receber o parâmetro pattern Implementar a classe FacesUtil
Implementar o validador de CPF
Curso JavaServer Faces 195
Eventos
Tipos de Eventos Eventos de ação Eventos de mudança de valor Eventos de Fase
Curso JavaServer Faces 196
Eventos
Ciclo de Vida
RestaurarVisão
Aplicar Valores
do request
ProcessarValidações
AtualizarValores
do Modelo
InvocarAplicação
RenderizarResposta
ProcessarEventos
ProcessarEventos
ProcessarEventos
ProcessarEventos
Request
Response
Resposta finalizada Resposta finalizada
Resposta finalizada Resposta finalizada
Rendereizar Resposta
Rendereizar Resposta
Eventos de mudança de valor
Eventos de ação
Curso JavaServer Faces 197
Eventos
Ciclo de vida Restaurar visão
Recria a árvore de componentes server-side Aplicar valores de Requisição
Copia os parametros da requisição para valores submetidos
Processar Validações Converte os valores submetidos e valida o valor
convertido
Curso JavaServer Faces 198
Eventos
Ciclo de vida Atualizar valores do Modelo
Copia o valor convertido e validado para o modelo (através das expressões #{bean.atributo})
Invocar Aplicação Chama os listeners de ação e as ações, nessa ordem
Renderizar Resposta Salva o estado e carrega a visão seguinte
Curso JavaServer Faces 199
Eventos
Eventos de mudança de valor Ocorrem sempre que o valor do componente ao
qual o evento esta associado é alterado
<h:selectOneMenu id="prod" value="#{bean.produto}" valueChangeListener="#{bean.changeProduto}"onchange="submit()" >
<f:selectItems value="#{bean.comboProdutos}" /></h:selectOneMenu>
public void changeProduto(ValueChangeEvent event) { Integer codProduto = (Integer)event.getNewValue(); ProdutoDAO dao = new ProdutoDAO(); Produto prod = dao.getProduto(codProduto); ItemPedido item = (ItemPedido)itens.getRowData(); item.setValorUnitario(prod.getPreco()); FacesContext.getCurrentInstance().renderResponse(); }
Curso JavaServer Faces 200
Eventos
Eventos de mudança de valor javax.faces.event.ValueChangeEvent
UIComponent getComponent() Componente que iniciou o evento
Object getNewValue() Retorna o novo valor
Object getOldValue() Retorna o valor anterior
Curso JavaServer Faces 201
Eventos
Eventos de Ação Ocorrem sempre que uma ação é disparada, usado
apenas com commandButton e commandLink É processada antes da ação
<h:commandButton type="submit" value="enviar" actionListener="#{bean.alteraLabel}"/>
public void alteraLabel(ActionEvent e) { UICommand c = (UICommand) e.getComponent(); c.setValue("novo label"); }
Curso JavaServer Faces 202
Eventos
Eventos de Ação Dica: devem ser utilizados para lógica da interface,
ficando as actions com a lógica de negócios
public void clickImagem(ActionEvent e) {FacesContext context = FacesContext.getCurrentInstance();
//parametros do request Map parametros=context.getExternalContext().getRequestParameterMap(); String clientId = e.getComponent().getClientId(context); int x = Integer.parseInt(clientId + ".x"); int y = Integer.parseInt(clientId + ".y"); if ( x>=0 && x<=100 && y>=0 && y<=200) this.acao="incluir"; else if (x>100 && x<=200 && y>=0 && y<=200) this.acao="cancelar"; .... } public void doAcao(){ if (acao.equals("incluir")) { .... }
Curso JavaServer Faces 203
Eventos
Tags Event Listener Mudança de valor
f:valueChangeListener
Ao invéz de um método ele faz referência a uma classe que implementa a interface ValueChangeListener
<h:selectOneMenu id="prod" value="#{bean.produto}" onchange="submit()"><f:valueChangeListener type="br.com.cadastro.ComboProdutoListener"/><f:selectItems value="#{bean.comboProdutos}" />
</h:selectOneMenu>
public class ComboProdutoListener implements ValueChangeListener{ public void processValueChange(ValueChangeEvent event) { .... }}
Curso JavaServer Faces 204
Eventos
Tags Event Listener Ação
f:actionListener
Ao invéz de um método ele faz referência a uma classe que implementa a interface ActionListener
<h:commandButton type="submit" value="enviar" > <f:actionListener type="br.com.cadastro.EnviarListener"/></h:commandButton>
public class EnviarListener implements ActionListener{ public void processAction(ActionEvent event) { .... }}
Curso JavaServer Faces 205
Eventos
Componentes Imediatos Quando é necessário que uma determinada ação
ou evento ocorra antes das fases de conversão e validação
Por exemplo cancelar uma entrada de dados Para habilitar usa-se o atributo immediate=true
CommandButton e commandLink para eventos de ação e actions
inputs em geral (select, inputText, etc...) para tratar eventos de valueChangeListener
Curso JavaServer Faces 206
Eventos
Componentes Imediatos
RestaurarVisão
Aplicar Valores
do request
ProcessarValidações
AtualizarValores
do Modelo
InvocarAplicação
RenderizarResposta
ProcessarEventos
ProcessarEventos
ProcessarEventos
ProcessarEventos
Request
Response
Resposta finalizada Resposta finalizada
Resposta finalizada Resposta finalizada
Rendereizar Resposta
Rendereizar Resposta
Inputs imediatos
Ações imediatas
Curso JavaServer Faces 207
Eventos
Componentes Imediatos Basta incluir o atributo immediate=true
<h:selectOneMenu id="prod" value="#{bean.produto}" valueChangeListener="#{bean.changeProduto}"onchange="submit()" immediate="true">
<f:selectItems value="#{bean.comboProdutos}" /></h:selectOneMenu>
<h:commandButton type="submit" value="Cancelar" actionListener="#{bean.alteraLabel}"immediate="true"/>
Curso JavaServer Faces 208
Eventos
Componentes Imediatos Dica: ir diretamente para a fase de renderização,
ignorando as vases de validação, atualização do modelo e execução da aplicação (actions)
Executar o método renderRespose do contexto
public void changeProduto(ValueChangeEvent event) { Integer codProduto = (Integer)event.getNewValue(); ProdutoDAO dao = new ProdutoDAO(); Produto prod = dao.getProduto(codProduto); ItemPedido item = (ItemPedido)itens.getRowData(); item.setValorUnitario(prod.getPreco()); FacesContext.getCurrentInstance().renderResponse(); }
Curso JavaServer Faces 209
Eventos
Eventos de fase São executados antes e depois de cada fase Implementam a interface PhaseListener
PhaseId getPhaseId void afterPhase() void beforePhase()
Configurados no faces-config.xml<faces-config>
<lifecycle><phase-listener>br.com.cadastro.Trace</phase-listener>
</lifecycle>......</faces-config>
Curso JavaServer Faces 210
Eventos
Eventos de fase Método getPhaseId pode retornar:
PhaseId.ANY_PHASE PhaseId.RESTORE_VIEW PhaseId.APPLY_REQUEST_VALUES PhaseId.PROCESS_VALIDATIONS PhaseId.UPDATE_MODEL_VALUES PhaseId.INVOKE_APPLICATION PhaseId.RENDER_RESPONSE
Muito útil para realizar debug da aplicação
Curso JavaServer Faces 211
Eventos
Eventos de fase
public class Trace implements PhaseListener {
public void afterPhase(PhaseEvent event) {System.out.println("AFTER: " + event.getPhaseId());
}
public void beforePhase(PhaseEvent event) {System.out.println("BEFORE: " + event.getPhaseId());
}
public PhaseId getPhaseId() {return PhaseId.ANY_PHASE;
}
}
Curso JavaServer Faces 212
Eventos
Exercício Criar uma tela para cadastro de pedidos
Campo para data com conversor de data Combo para clientes DataTable para itens
Combo para produtos Campo para quantidade (conversor para numeros) Exibição do preço do produto Exibição do total por linha e o total do pedido no rodape da coluna Botão para excluir item
Botões para Incluir item (incluir um novo item no list do dataModel) Salvar pedido Cancelar
Curso JavaServer Faces 213
Subvisões e Tiles
Subvisões f:subview
Utilizada para fazer inclusão de porções de código jsp nas páginas
Devem ter o atributo id definido Assim como forms e dataTabes, o id da subview passa a
fazer parte dos ids dos clientes dos componentes que fazem parte da subview
Tags HTML são ignoradas Páginas incluídas não devem ter a tag f:view
Curso JavaServer Faces 214
Subvisões e Tiles
Subvisões Para incluir conteudo dentro de uma subview são
utilizadas: <%@ include file= “conteudo.jsp” %>
páginas são incluídas em tempo de compilação <jsp:include page= “conteudo.jsp” %>
páginas são incluídas em tempo de execução <c:import url= “conteudo.jsp” %>
páginas são incluídas em tempo de execução, pode acessar recursos/sites externos (depende da instalação da JSTL)
Curso JavaServer Faces 215
Subvisões e Tiles
Subvisões Utilização:
<f:subview id="cabecalho"> <jsp:include page="cabecalho.jsp" /></f:subview> Importante: apesar do acesso as páginas jsp serem
feitas melo mapeamento da servlet FacesServlet (*.jsf, /faces/* ou *.faces) a página incluida não deve usar o mapeamento
Exercício Criar uma página jsf contendo um cabeçalho e incluir
esta página nas páginas da nossa aplicação
Curso JavaServer Faces 216
Subvisões e Tiles
Tiles É um framworkd que permite ao desenvolvedor
criar modelos de páginas e de maneira fácil e declarativa incluir partes reutiliáveis de páginas
É distribuído junto com o Struts no arquivo struts.jar ou separadamente (tiles.jar)
Pode-se utilizar o struts.jar sem problemas com o JSF/MyFaces
Para mais informações sobre o Tiles acesse http://www.lifl.fr/~dumoulin/tiles/
Curso JavaServer Faces 217
Subvisões e Tiles
Tiles Definindo o arquivo de configuracão do tiles
<contextparam> <paramname>tilesdefinitions</paramname> <paramvalue>/WEBINF/tiles.xml</paramvalue> </contextparam>
Curso JavaServer Faces 218
Subvisões e Tiles
Tiles MyFaces possúi um ViewHander que dá suporte ao
Tiles em aplicações JSF. para usá-lo basta configurá-lo no nosso arquivo de configuração da aplicação
<application> <viewhandler> org.apache.myfaces.application.jsp.JspTilesViewHandlerImpl </viewhandler></application>
Curso JavaServer Faces 219
Subvisões e Tiles
Tiles Pagina de layout
<table width="100%"> <tr ><td colspan="2"> <f:subview id="titulo"> <tiles:insert attribute="titulo" flush="false"/> </f:subview> </td> </tr> <tr><td width="10%"> <f:subview id="menu"> <tiles:insert attribute="menu" flush="false"/> </f:subview> </td> <td width="*"> <f:subview id="corpo"> <tiles:insert attribute="corpo" flush="false"/> </f:subview> </td></tr> <tr> <td colspan="2"> <f:subview id="rodape"> <tiles:insert attribute="rodape" flush="false"/> </f:subview> </td></tr></table>
Curso JavaServer Faces 220
Subvisões e Tiles
Tiles Definições do tiles
<tilesdefinitions> <definition name="layout" path="/layout.jsp" > <put name="titulo" value="/titulo.jsp" /> <put name="menu" value="/menu.jsp" /> <put name="rodape" value="/rodape.jsp" /> </definition> <definition name="inicio.tiles" extends="layout" > <put name="corpo" value="/inicio.jsp" /> </definition> <definition name="inserir.tiles" extends="layout" > <put name="corpo" value="/inserir.jsp" /> </definition> <definition name="consultar.tiles" extends="layout" > <put name="corpo" value="/consultar.jsp" /> </definition> <definition name="pedido.tiles" extends="layout" > <put name="corpo" value="/pedido.jsp" /> </definition></tilesdefinitions>
Curso JavaServer Faces 221
Subvisões e Tiles
Tiles Página de menu
Página de cabeçalho
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%><h:form> <h:panelGrid columns="1" styleClass="subtabela"> <h:commandLink value="Inserir" action="inserir"></h:commandLink> <h:commandLink value="Consultar" action="#{clienteInsert.consultar}"></h:commandLink> <h:commandLink value="Pedido" action="pedido"></h:commandLink> </h:panelGrid></h:form>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h"%><h:outputText value="Curso de JavaServerFaces" styleClass="titulos" />
Curso JavaServer Faces 222
Subvisões e Tiles
Tiles
Curso JavaServer Faces 223
Subvisões e Tiles
Tiles Exercício, incluir o tiles na nossa aplicação em
todas as paginas
Curso JavaServer Faces 224
Componentes Personalizados
Dicas para desenvolver um componente: Simule o resultado em HTML antes de implementar
Teste o visual, javascript, etc... Separe o JavaScript em funções e verifique se
estas não conflitam com outros componentes Teste seu componente com outros componentes
na mesma página Sendo filho deles Tendo eles como filhos (caso ele de suporte)
Verifique se ele funciona em diferentes browsers
Curso JavaServer Faces 225
Componentes Personalizados
Passos para o desenvolvimento de um componente Implementar a classe de UI
Implementar a interface UIComponent, ou Estender UIComponentBase, ou Estender um outro componente já existente
UIInput, UIOutput, etc...
Curso JavaServer Faces 226
Componentes Personalizados
Passos para o desenvolvimento de um componente Implementar a renderização
Pode ser implementada no próprio método encodeBegin e encodeEnd
void encodeBegin(FacesContext context) – inicio da geração de html (abrir tags: <div>)
void encodeEnd(FacesContext context) – fim da geração de html (fechar tags: </div>)
Implementar um renderizador externo Extender a classe Renderer
Curso JavaServer Faces 227
Componentes Personalizados
Passos para o desenvolvimento de um componente Implementar a Tag do componente
Estender a classe UIComponenteTag String getContentType() - nome simbólico do componente String getRendererType() - nome simbólico do renderizador void release() - setar os atributos para nulo void setProperties(UIComponent) - passa os parametros da tag
para o componente Verificar a utilização de expressões
Criar arquivo TLD para a tag Registrar o componente no faces-config.xml
Curso JavaServer Faces 228
Componentes Personalizados
Componente HelloWorld - HelloUIEstender UIComponenteBase
Família do componente
Método de encode
ResponseWriter é usuado para gerar o HTML
StartElement inicia um elemento (<input) e writeAttribute acrescenta um atributo
Os parametros podem ser passados por ValueBinding (expressões) ou como atributos String
Curso JavaServer Faces 229
Componentes Personalizados
Componente HelloWorld - HelloUITagEstender UIComponenteTag
Tipo do componente (família)
Componente não tem renderizador separado
Passa os parametros para o componente
Verifica se o parametro é uma expressão ou se é uma String
Curso JavaServer Faces 230
Componentes Personalizados
Componente HelloWorld - HelloUITag
Atributos da tag
Limpa os atributos
Curso JavaServer Faces 231
Componentes Personalizados
Componente HelloWorld – arquivo TLD
Classe da tag
Atributos herdados
Atributos da tag
Curso JavaServer Faces 232
Componentes Personalizados
Componente HelloWorld – configuração no faces-config.xml
Familia do componente
Classe do componente
Curso JavaServer Faces 233
Componentes Personalizados
Componente HelloWorld – Utilização
Curso JavaServer Faces 234
Componentes Personalizados
Funcionamento do componente
Curso JavaServer Faces 235
Componentes Personalizados
Componente de Entrada - SpinnerUI
SetConverter define um conversor para o componente
Métodos criados no componente para simplificar o desenvolvimento
ClientID retorna o id gerado no cliente: “idform:idcampo”
Curso JavaServer Faces 236
Componentes Personalizados
Componente de Entrada - SpinnerUI
Método para criar o campo
Cria o botão para incrementar
Cria o botão para decrementar
Curso JavaServer Faces 237
Componentes Personalizados
Componente de Entrada – SpinnerUI Método decode responsável por ler os parametros
do request
Verifica se um dos botões foi pressionado
Caso o valor não seja um numero inteiro, deixa como responsabilidade do conversor exibir a mensagem de erro
Curso JavaServer Faces 238
Componentes Personalizados
Componente de Entrada – SpinnerTag
Curso JavaServer Faces 239
Componentes Personalizados
Componente de Entrada – Configuração Spinner Arquivo TLD
Faces-Config.xml
Curso JavaServer Faces 240
Componentes Personalizados
Componente de Entrada – Utilização
Curso JavaServer Faces 241
Componentes Personalizados
Exercício Crie um novo projeto no eclipse e tomo por base as
configurações do arquivo blank.war (está junto com os exemplos do MyEclipse)
Implemente o componente HelloWorld Implemente o componente Spinner Implemente um Bean e uma Página para testá-los
Curso JavaServer Faces 242
Dicas
Componentes do MyFaces Menu Tree NewsPaper Table Tabbed Pane Calendar Schedule DataScroller
Curso JavaServer Faces 243
Dicas
Componentes do MyFaces Menu
Curso JavaServer Faces 244
Dicas
Componentes do MyFaces Menu
<t:jscookMenu [ user-role-support-attributes ] [layout="values {hbr, hbl, hur, hul, vbr, vbl, vur, vul}"] [theme="values {ThemeIE, ThemeMiniBlack, ThemeOffice, ThemePanel}"] Nested <t:navigationMenuItem> or <t:navigationMenuItems> tags (menu items)</t:jscookMenu>
Curso JavaServer Faces 245
Dicas
Componentes do MyFaces Tree
<t:tree2 value="TreeModel" var="String" varNodeToggler="String"> ...(anyComponent)...</t:tree2>
Curso JavaServer Faces 246
Dicas
Componentes do MyFaces NewsPaper Table
<t:newspaperTable newspaperColumns="3" value="#{addressBB.states}" var="state"> <f:facet name="spacer"> <f:verbatim> </f:verbatim> </f:facet> <h:column> <h:outputText value="#{state.abbr}"/> </h:column> <h:column> <h:outputText value="#{state.name}"/> </h:column></t:newspaperTable>
Curso JavaServer Faces 247
Dicas
Componentes do MyFaces Tabbed Pane
<t:panelTabbedPane selectedIndex="int" activeTabStyleClass="CSSClass" inactiveTabStyleClass="CSSClass" disabledTabStyleClass="CSSClass" activeSubStyleClass="CSSClass" inactiveSubStyleClass="CSSClass" tabContentStyleClass="CSSClass"> <t:panelTab ...> ...(anyComponents)... </t:panelTab></t:panelTabbedPane>
Curso JavaServer Faces 248
Dicas
Componentes do MyFaces Calendar
<t:inputCalendar [ HTML universal attributes ] [ HTML event handler attributes ] [ UIInput standard attributes (i.e. valueChangeListener) ] [monthYearRowClass="month-and-year-header-row-css-class"] [weekRowClass="week-header-row-css-class"] [dayCellClass="empty-or-date-cell-css-class"] [currentDayCellClass="currently-selected-day-cell-css-class"]></t:inputCalendar>
Curso JavaServer Faces 249
Dicas
Componentes do MyFaces Schedule
Curso JavaServer Faces 250
Dicas
Componentes do MyFaces Schedule
<s:schedule [ UI component attributes ] [ UI command attributes ] [value="#{backingBean.scheduleModel}"] [visibleStartHour="7"] [visibleEndHour="21"] [workingStartHour="9"] [workingEndHour="17"] [readonly={true|false}] [submitOnClick={true|false}] [mouseListener="#{backingBean.scheduleClicked}"] [tooltip={true|false}] [theme={default|outlookxp|evolution}] [headerDateFormat="dd-MM-yyyy"] [compactWeekRowHeight="200"] [compactMonthRowHeight="100"]></s:schedule>
Curso JavaServer Faces 251
Dicas
Componentes do MyFaces DataScroller
<t:dataScroller [ user-role-support-attributes ] [for="reference to UIData"] [fastStep="values {ThemeIE, ThemeMiniBlack, ThemeOffice, ThemePanel}"] [pageIndexVar="A parameter name, under which the actual page index is set in request scope similar to the var parameter."] [pageCountVar="A parameter name, under which the actual page count is set in request scope similar to the var parameter."]> Nested Facets: first, previous, next, last, fastforward, fastrewind</t:dataScroller>
Curso JavaServer Faces 252
Dicas
Paginação com o MyFaces
<h:dataTable id="dados" value="#{beanPaginacao.modelo}" var="cliente" rows="5"> <h:column> <f:facet name="header"><h:outputText value="Nome"/></f:facet> <h:outputText value="#{cliente.nome}"/> </h:column> <h:column> <f:facet name="header"><h:outputText value="Telefone"/></f:facet> <h:outputText value="#{cliente.telefone}"/> </h:column></h:dataTable> <t:dataScroller for="dados" pageCountVar="totpg" pageIndexVar="pg" paginator="true" > <f:facet name="next"><h:outputText value="proxima"/></f:facet> <f:facet name="previous"><h:outputText value="anterior"/></f:facet> <f:facet name="first"><h:outputText value="primeira"/></f:facet> <f:facet name="last"><h:outputText value="ultima"/></f:facet> <f:facet name="fastforward"><h:outputText value="+5"/></f:facet> <f:facet name="fastrewind"><h:outputText value="-5"/></f:facet> <h:outputText value="Pagina #{pg} de #{totpg}"/></t:dataScroller>
Curso JavaServer Faces 253
Dicas
Paginação no Banco PaginatorModel
package dicas;import java.util.HashMap;import java.util.Map;import java.util.List;import javax.faces.model.DataModel;public abstract class PaginatorModel extends DataModel { private List wrappedData; private int linhasPorPagina; private int totalDeLinhas; private int rowIndex; private Filtro filtro; public PaginatorModel(Filtro filtro) { this.filtro = filtro; this.linhasPorPagina= filtro.getLinhasPorPagina(); updateData(); } //atualiza os dados da pagina que esta sendo exibida private void updateData() { filtro.setLinhaInicial(getPaginaAtual() * linhasPorPagina); Retorno retorno = getData(filtro); totalDeLinhas = retorno.getTotal(); wrappedData = retorno.getRegistros(); }
Curso JavaServer Faces 254
Dicas
Paginação no Banco PaginatorModel
//metodo a ser implementado que ira acessar o banco //e retornar total de registros e linhas da "pagina" protected abstract Retorno getData(Filtro filtro) ; //retorna o dado da linha a ser exibida //caso esta nao esteja na pagina atual, chama updateData public Object getRowData() { int pg = getPaginaAtual(); Object retorno = null; if (rowIndex<getRowCount()) { if (rowIndex<filtro.getLinhaInicial() || rowIndex > ((filtro.getLinhaInicial() + linhasPorPagina)-1) ){ updateData(); } int linha = rowIndex - ((pg * linhasPorPagina) ); retorno = wrappedData.get(linha); } return retorno; } private int getPaginaAtual() { int pg = (int)( (double)(rowIndex)/(double)linhasPorPagina) ; return pg; }
Curso JavaServer Faces 255
Dicas
Paginação no Banco PaginatorModel
//metodos restantes do DataModel public int getRowCount() { return totalDeLinhas; } public int getRowIndex() { return rowIndex; } public void setRowIndex(int rowIndex) { this.rowIndex = rowIndex; }
public boolean isRowAvailable() { return true; } public Object getWrappedData() { return wrappedData; } public void setWrappedData(java.lang.Object object) { }
Curso JavaServer Faces 256
Dicas
Paginação no Banco PaginatorModel
//classe usada para filtrar os dados public static class Filtro { private Map parametros= new HashMap(); private String ordem; private int linhaInicial; private int linhasPorPagina; public Map getParametros() { return parametros;} public void setParametros(Map parametros) { this.parametros = parametros; } public String getOrdem() { return ordem; } public void setOrdem(String ordem) { this.ordem = ordem; } public int getLinhaInicial() { return linhaInicial; } public void setLinhaInicial(int linhaInicial) { this.linhaInicial = linhaInicial; } public int getLinhasPorPagina() { return linhasPorPagina; } public void setLinhasPorPagina(int linhasPorPagina) { this.linhasPorPagina = linhasPorPagina; } }
Curso JavaServer Faces 257
Dicas
Paginação no Banco PaginatorModel
//classe usada para retornar os dados public static class Retorno{ private List registros; private int total; public List getRegistros() { return registros; } public void setRegistros(List registros) { this.registros = registros; } public int getTotal() { return total; } public void setTotal(int total) { this.total = total; } }
Curso JavaServer Faces 258
Dicas
Paginação no Banco Utilização no bean - PaginatorModel
import java.util.ArrayList;import java.util.List;import javax.faces.model.DataModel;
public class BeanPaginacao { private DataModel modelo; public DataModel getModelo(){ if (modelo==null){ PaginatorModel.Filtro filtro = new PaginatorModel.Filtro(); filtro.setLinhaInicial(0); filtro.setLinhasPorPagina(5); modelo = new PaginatorModel(filtro){ protected PaginatorModel.Retorno getData(PaginatorModel.Filtro filtro) { return PaginacaoDados.busca(filtro); } }; } return modelo; } }
Curso JavaServer Faces 259
Dicas
Gerando dados binários (JasperReports)
FacesContext context = FacesContext.getCurrentInstance();List dados = Banco.getDados();
JRBeanCollectionDataSource jrRS = new JRBeanCollectionDataSource(dados);
HttpServletRequest request = (HttpServletRequest)context.getExternalContext().getRequest();HttpServletRequest response = (HttpServletResponse)context.getExternalContext().getResponse();String server = "http://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath();Map parametros = new HashMap();parametros.put("locale", facesContext.getExternalContext().getRequestLocale());parametros.put("server",server);
Curso JavaServer Faces 260
Dicas
Gerando dados binários (JasperReports)
try {InputStream is = Thread.currentThread().getContextClassLoader().
getResourceAsStream(jasper);JasperPrint print = JasperFillManager.
fillReport(is, parametros,jrRS);bayte[] data = JasperExportManager.exportReportToPdf(print);relatorio=true;response.setContentType("application/pdf"); response.setHeader("Content-disposition",
"inline;filename=relatorio.pdf");response.setHeader("Cache-Control",
"must-revalidate, max_age=360"); response.setContentLength(data.length); ServletOutputStream ouputStream = null;ouputStream = response.getOutputStream();ouputStream.write(data, 0, data.length);ouputStream.flush();ouputStream.close();
} catch (Exception e) { e.printStackTrace();}
faces.responseComplete();
Curso JavaServer Faces 261
Dicas
Limpando campos com immediate (cancelar) public void cancelar(){ setNome(null); setTelefone(null); FacesContext context = FacesContext.getCurrentInstance(); UIViewRoot vr = context.getViewRoot(); UIInput inputNome = (UIInput) find(vr,"nome"); UIInput inputTelefone = (UIInput) find(vr,"telefone"); inputNome.setSubmittedValue(null); inputTelefone.setSubmittedValue(null); } private UIComponent find(UIComponent base, String id) { for (int i = 0; i<base.getChildCount(); i++) { UIComponent filho = (UIComponent)base.getChildren().get(i); if (id.equals(filho.getId())) return filho; if (filho.getChildCount()>0) { UIComponent tmp= find(filho,id); if (tmp!=null) return tmp; } } return null; }
Curso JavaServer Faces 262
Dicas
Layouts complexos Utilizar o pacote de componentes fornecido pela
Exadel (free) http://jsftutorials.net/htmLib Ele possúi uma quantidade grande de componentes que
representam as tags html htm:table htm:tr htm:td htm:div htm:font htm:script htm:br, etc...
Curso JavaServer Faces 263
Dicas
Utilizar ajax em jsf A Exadel tambem fornece uma biblioteca de
componentes jsf que permite adicionar funcionalidades AJAX aos componentes
Link para download https://ajax4jsf.dev.java.net
Utilização
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%>
<h:inputText value="#{bean.text}"> <a4j:support event="onkeyup" reRender="repeater" /></h:inputText><h:outputText value="Text in the AJAX Response:" /><h:outputText id="repeater" value="#{bean.text}" />
Curso JavaServer Faces 264
Dicas
Acessar dados do contexto web Sessão
context.getExternalContext().getSession(); Atributos da sessão
context.getExternalContext().getSession().get(“atributo”); HttpServletRequest e HttpServletResponse
context.getExternalContext().getRequest(); context.getExternalContext().getResponse();
Parametro do request context.getExternalContext().getRequestParameterMap().get
(“parametro”); Headers e Cookies
context.getExternalContext().getRequestCookieMap(); context.getExternalContext().getRequestHeaderMap();
Curso JavaServer Faces 265
Dicas
Criando uma tela dinamicamente (binding) private String nome="nome default"; private String telefone="telefone default"; private UIPanel painel; public UIPanel getPainel(){ if (painel!=null) return painel; FacesContext context = FacesContext.getCurrentInstance(); Application app = context.getApplication();
painel = new UIPanel(); painel.getAttributes().put("columns", new Integer(2)); UIOutput output = new UIOutput(); output.setValue("Nome"); painel.getChildren().add(output); UIInput input = new UIInput(); ValueBinding vb = app.createValueBinding("#{beanCancel.nome}"); input.setValueBinding("value",vb); painel.getChildren().add(input); output = new UIOutput(); output.setValue("Telefone"); painel.getChildren().add(output); input = new UIInput(); vb = app.createValueBinding("#{beanCancel.telefone}"); input.setValueBinding("value",vb); painel.getChildren().add(input); return painel; }
<h:panelGrid binding="#{beanCancel.painel}" />
Curso JavaServer Faces 266
Dicas
Links para mais informações http://www.jsfcentral.com http://www.jsftutorials.net http://www.coreservlets.com/JSF-Tutorial http://java.sun.com/javaee/javaserverfaces http://developers.sun.com/prodtech/javatools/jscrea
tor/index.jsp