Escolar Documentos
Profissional Documentos
Cultura Documentos
JavaServer Faces
Edio 2.0 Maro 2006
Objetivos
Aprender eficientemente o desenvolvimento de aplicaes WEB utilizando o framework JavaServes Faces. O curso explora aspectos bsicos e avanados do JavaServer Faces, cobrindo tnicas de desenvolvimento para WEB. Tpico especial:
Este curso tambm abordar o uso do MyFaces, uma implementao de cdigo aberto da especificao de JavaServer Faces desenvolvida pela Apache Group.
Objetivos
Ao final desse curso o aluno estar apto a desenvolver uma aplicao WEB utilizando JavaServer Faces.
Pr-requisitos
Conhecimento de Java bsico Conhecimento de Servlet e Java Server Pages Conhecimento de HTML Conhecimento de XML
Livro-texto e fontes
Core JavaServer Faces (Sun Microsystems Press Java Series) - David Geary, Cay Horstmann
Softwares utilizados
Java 5.0
MyFaces
Hsqldb 1.8.0
Tpicos
Introduo Managed Beans Navegao Tags Componentes Data Table Conversores e Validadores Eventos e Ciclo de Vida Subvises Componentes Personalizados
Curso JavaServer Faces 7
Calendrio Estimado
Primeiro dia
Segundo dia
Terceiro dia
Quarto dia
Quinto dia
Calendrio Estimado
Sexto dia
DataTable, Conversores, Validadores Eventos, Sub-Vises Componentes Personalizados Componentes Personalizados MyFaces, Tpicos Extras
Stimo dia
Oitavo dia
Nono dia
Dcimo dia
Core JavaServer Faces O livro recomendado como referncia didtica A ordem e forma de apresentao so diferentes Nem todos os assuntos so abordados O instrutor poder fornecer material adicional As referncias no so baseadas no livro apostila/ este material dividido em captulos 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 10
Estrutura do curso
O curso alterna apresentaes tericas com exerccios prticos e demonstraes sobre os temas abordados Exemplos e demonstraes
Nesta verso, a maior parte dos exemplos so baseados no livro-texto. 1. Ambiente Java padro 2. Editor de texto (Eclipse) 3. Sistema de gerenciamento de banco de dados (HSQLDB) Os arquivos do JavaServer Faces esto distribudos nas pastas dos exemplos e exerccios quando necessrios Outros recursos sero instalados quando forem necessrios
Curso JavaServer Faces 11
Faa perguntas (a qualquer hora) Faa os exerccios; refaa os exerccios; invente Leia o livro-texto, outros livros, artigos, revistas Explore os exemplos fornecidos; busque ir alm Adapte suas aplicaes para que usem a tecnologia abordada neste curso Entre em um frum sobre o assunto Se possvel, faa tudo isto durante o curso Faa perguntas (explore o instrutor!)
12
www.mayworm.com/cursos
13
JavaServer Faces um dos mais novos frameworks para web a seguir o modelo MVC. Desenvolvido pela Sun como uma especificao (JSR 127) e com a participao de vrias outras empresas/entidades (Apache, Borland, IBM, Oracle, BEA, Macromedia, etc....)
14
Por ser uma especificao JSF tem a vantagem de possuir mais de uma implementao disponvel. Temos a RI (reference implementation) da prpria Sun e algumas outras:
Recentemente a Oracle doou o ADF para o grupo Apache, e este ser incorporado ao MyFaces.
Curso JavaServer Faces 15
MVC Model View Controler Converso de dados Validao e manipulao de erros Internacionalizao Componentes customizados Renderizao Suporte a ferramentas de desenvolvimento
16
Software necessrio
MyFaces 1.1.1
Tomcat 5.5.x
http://jakarta.apache.org/tomcat/index.html
Curso JavaServer Faces 17
Instalao e Configurao
Criar diretrio curso c:\curso. Neste diretrio 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 executvel que deve ser executado. Basta seguir os passos para sua instalao, que bastante simples. Vamos instal-lo no diretrio c:\curso\jdk5.0.
18
Instalao e Configurao
Eclipse
O Eclipse e o WebTools podem ser baixados juntos, facilitando a instalao. O arquivo wtp-all-inone-sdk-1.0-win32.zip contem o Eclipse, o WebTools e outros plug-ins necessrios para a utilizao do mesmo (EMF, GEM e JEMF). Como um arquivo zip, basta descompact-lo num diretrio para que possa ser utilizado. Vamos descompactlo no diretrio curso, teremos c:\curso\eclipse
19
Instalao e Configurao
MyFaces
O MyFaces tambm distribudo como um arquivo zip, bastando descompact-lo em um diretrio. Este arquivo contm os arquivos:
myfaces-api.jar api JSF (principalmente interfaces) myfaces-impl.jar implementao da api tomahawk.jar componentes extras sandbox.jar mais componentes (usam ajax) myfaces-all.jar todas as anteriores juntas
Instalao e Configurao
MyFaces Examples
Para facilitar o nosso trabalho vamos utilizar o arquivo de exemplos myfaces-1.1.1-examples.zip. Este arquivo possui algumas aplicaes de exemplo, uma delas uma aplicao em branco com toda as bibliotecas citadas a cima e com o myfaces previamente configurado. Descompactando este arquivo no nosso diretrio de curso teremos c:\curso\myfaces-1.1.1-examples
21
Instalao e Configurao
Blank.war
Iremos usar o arquivo blank.war. Renomeie ele para zip e descompacte no nosso diretrio de curso dentro de um subdiretrio blank (que deve ser criado), assim teremos c:\curso\blank Este arquivo j vem com as libs necessrias 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, commonsvalidator.jar, commons-lang-2.1.jar, jakarta-oro.jar, jstl.jar, log4j-1.2.8.jar, portlet-api-1.0.jar, struts.jar
22
Instalao e Configurao
Tomcat
Como servidor web iremos usar o tomcat, este tambm distribudo em um nico arquivo zip, bastando apenas descompact-lo.
Teremos:
23
Instalao e Configurao
Configurando o Eclipse
24
Instalao e Configurao
Configurando o Eclipse
Configurando o JDK
Na opo Window/Preferences, devemos selecionar a opo 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
25
Instalao e Configurao
Configurando o Eclipse
Configurando o JDK
26
Instalao e Configurao
Configurando o Eclipse
Configurar o tomcat
27
Instalao e Configurao
Configurando o Eclipse
Configurar o tomcat
28
Instalao e Configurao
Configurando o Eclipse
Configurar o tomcat
29
Instalao e Configurao
Configurando o Eclipse
Configurar o tomcat
30
31
32
33
Editar web.xml
34
35
36
<%@ 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>
37
<%@ 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>
38
39
O JEE no permite arquivos para welcome-files que no sejam jsp/html, por isso usamos este recurso para resolver esta limitao
40
41
42
43
44
45
Pginas JSF
Pginas JSF so na verdade pginas JSP utilizando algunas bibliotecas de tags que representam componentes do JSF.
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
CORE: responsvel por componentes no visuais ou auxiliares (conversores, validadores, views, etc...).
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
HTML: responsvel pelos componentes html visuais/layout (inputs, tables, forms, buttons, etc...).
46
ManagedBeans/BackingBeans
Os beans do JSF so POJOS, ou seja classes javas simples, que no tem a necessidade de estender nenhuma classe e/ou implementar nenhuma interface. Suas propriedades so visualisadas/alteradas pelos componentes da pgina (usando o padro de encapsulamento get e set) Os mtodos pblicos desta classe so as aes (actions) de nossa aplicao.
47
As regras de navegao indicam ao framework qual pgina dever ser exibida aps um formulrio 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>
48
Ciclo de Vida
Restaurar
Request Viso
Processar Eventos
Processar Validaes
Processar Eventos
Renderizar Response
Resposta
Processar Eventos
Invocar Aplicao
Processar Eventos
Exerccio
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 pgina jsp que ter os campos para entrada e a exibio da sada Fazer com que da pgina de inicio.jsp possa acessar esta nova pgina
50
Managed Beans
Componentes de interface Comportamento de um formulrio Objetos de negcio (cujas propriedades so exibidas/editadas nas pginas) Servios, fontes externas de dados, etc...
51
Managed-Beans
52
Managed-Beans
Devem ser declarados como private Devem ter mtodos get e set pblicos para acesso Atributos boolean podem ter dois tipos de acesso de leitura:
IsAtributo getAtributo
53
Managed-Beans
Request
Tem vida curta, inicia-se quando uma requisio feita e termina quando a resposta enviada iniciado quando o usurio acessa a aplicao e encerrada quando ocorre um time-out (usurio fica determinado tempo sem acessar) ou esta invalidada Inicia-se quando a aplicao iniciada e termina quando esta encerrada
Curso JavaServer Faces 54
Session
Application (Servlet-Context)
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>
55
Managed-Beans
Inicializando 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>
56
Managed-Beans
Maps
57
Managed-Beans
Encadeamento de beans
<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>
58
Managed-Beans
Encadeamento de beans
Escopos compatveis
Escopo dos Beans referenciados None None, aplication None, aplication, session None, aplication, session, request
59
Managed-Beans
Converso de Valores
Nas definies de propriedades sempre entramos com valores do tipo String, o JSF pode fazer a converso para alguns tipos especficos:
Converso Mtodo valueOf da classe wrapper, Ou 0 se for vazia Mtodo valueOf de Boolean ou false se vazia Primeiro caracter da string, ou (char) 0 se vazia Cpia da String, ou new String() se vazia
Tipo destino int, byte, short, long, float, double, (ou wrapper) Boolean ou boolean Character ou char String ou Object
60
Managed-Beans
61
Managed-Beans
Expresso #{beam.prop}
Tipo de Prop Qualquer Null Qualquer Conversvel em int Conversvel em int Qualquer Modo Escrita Erro Erro bean.put(prop,valor) bean.set(prop,valor) bean[prop] bean.setProp(valor) Modo Leitura Null Null bean.get(prop) bean.get(prop) bean[prop] bean.getProp()
62
Managed-Beans
Objetos pr-definidos
Valores Map com os parametros do cabealho HTTP, apenas o primeiro valor Map com os parametros do cabealho HTTP, array com todos os valores Map com os parametros da requisio, apenas o primeiro valor Map com os parametros da requisio, array com todos os valores Map com os nomes e valores dos cookies Map com os parametros de inicializao da aplicao Map com os atributos no escopo da requisio Map com os atributos no escopo da sesso Map com os atributos no escopo da aplicao Instancia de FacesContext dessa requisio Instancia de UIViewRoot dessa requisio
Vrivel header headerValues param ParamValues cookie initParam requestScope sessoinScope applicationScope facesContext view
63
Managed-Beans
Operadores
Aritimticos: +, -, *, / (div) e % (mod) Relacionais: < (lt), <= (le), > (gt), >= (ge), == (eq), != (ne) Lgicos: && (and), || (or), ! (not) Operador empty, ele true se for null, array ou String de tamanho 0 ou Collection de tamanho 0 Operador de seleo ternria ?
<h:outputText value="Bem vindo #{usuario.nome}, hoje sua #{usuario.cont} visita." rendered=#{usuario.logado && usuario.temPermissao}" />
64
Managed-Beans
Actions (sem parmetros, retorno String) Validators (parmetro FacesContext, UIComponent, value, retorno void) ActionListeners (parmetro ActionEvent, retorno void) ValueChangeListeners (parmetro ValueChangeEvent, retorno void)
65
Managed-Beans
Internacionalizao
login.usuarioEntry=Usuario login.senhaEntry=Senha
66
Managed-Beans
Internacionalizao
Para vrias lnguas use um sufixo no nome do arquivo indicando o cdigo ISO-639 do idioma
Para o alemo
mensagens_de.properties
(lista de cdigos pode ser encontrada em http://www.loc.gov/standards )
Pode-se utilizar o utilitrio native2ascii do jdk para realizar a converso dos arquivos
67
Managed-Beans
Internacionalizao
68
Managed-Beans
Exerccio
Apresente ao usurio uma sequncia de nmeros e solicite a ele o nmero que completa a sequncia (1, 2, 3, 4, 5) Deve haver uma lista contendo vrias sequncias que sero exibidas a medida que o usurio for respondendo Informar quantos foram os acertos A aplicao deve suportar duas linguas
69
Navegao
Navegao esttica
<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>
70
Navegao
Agrupando navegaes
71
Navegao
Navegao Dinmica
Navegao
Redirecionamento
possvel usar o redirecionamento, fazendo com que a requisio seja encerrada e um redirecionamento HTTP seja enviado ao cliente
73
Navegao
Coringas
A navegao abaixo tem o mesmo funcionamento que o agrupamento (no usar o from-view-id)
ou
<from-view-id>*</from-view-id> <from-view-id>/*</from-view-id>
74
Navegao
From-Action
Caso seja necessrio possivel termos duas actions que retornam a mesma String de ao, 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>
75
Navegao
Algortimo de Navegao
1 passo
Recebe outcome, viewID, action Se outcome==null reexibe a pgina atual Combinar todas as regras com o mesmo from-view-id
Combinar todas as regras com coringas no from-view-id que sejam semelhantes ao viewID
Se houver uma regra sem from-view-id, execute Se no encontrar nenhuma regra que coincida, reexiba a pgina atual
Curso JavaServer Faces 76
Navegao
Algortimo de Navegao
2 passo
Se uma tiver from-outcome e from-action equivalentes, execute-o Se tiver from-outcome equivalente e no tiver from-action, execute-o Se tiver from-action equivalente e no tiver from-outcome, execute-o Se houver um caso, sem from-outcome e from-action equivalente, execute-o Se no atender a nenhuma das anteriores, reexiba a mesma pgina
77
Navegao
Exerccio
Criar paginas jsp (vazias, apenas com links/command) para recriar a seguinte navegao
Novo pedido Clientes
Lista de clientes
Lista de pedidos
Alterar cliente
Alterar pedido
78
79
Tag form inputText inputTextArea inputSecret inputHidden outputLabel outputText outputFormat outputLink commandButton commandLink message messages
80
Atributos comuns
Atributos id binding rendered styleClass value valueChangeListener converter validator required Componentes Todos Todos Todos Todos Input, Output, Command Input, Output, Command Input, Output, Input Input Descrio Identificao do componente Referencia para um componente em um bean Indica se o componente ser renderizado (true/false) Nome da classe CSS Valor do componente Metodo de ao do componente Nome do conversor Nome do validador Se o preenchimento obrigatrio (true/false)
81
IDs
82
Ligaes
Ligaes (binding) permite que tenhamos variveis 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; }
83
Formulrios
Sempre usado o mtodo post A action do form definida como sendo a prpria pgina jsf 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
Atributos:
84
h:inputText h:inputSecret h:inputTextarea cols e rows (apenas para textarea) redisplay (apenas para secret)
Indica se o valor passado vai ser reexibido quando a pgina voltar da requisio
valueChangeListener
85
Atributos (cont.)
bindig, converter, id, rendered, required, styleClass, value, validator (atributos bsicos) 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
86
Exibio de textos
Tags
h:outputText
Somente exibo texto na pgina, mas se for passado um valor para styleClass, este texto fica dentro de um span com o class contendo o valor do styleClass passado Como outputText se receber um styleClass escrito dentro de um span Pode receber parmetros para o texto
<h:outputFormat value="{0} tem {1} anos"> <h:paran value="Luis"/> <h:param value="31"/> </h:outputFormat>
h:outputFormat
87
Exibio de textos
Tags
h:outputLabel
Semelhante a outputText, mas possi o atributo for que indica o id do componente ao qual este label pertence
escape
Se true utiliza cdigos escape para os caracterers <, > e & (default falso)
binding, converter, id, rendered, styleClass, value Style, title (atributos HTML 4.0)
Curso JavaServer Faces 88
Exibindo imagens
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
89
Campos escondidos
90
Botes e Links
Botes so usados para executar submeter os formulrios e executar actions Usamos a tag commandButton
<h:commandButton value="Ok" action="#{bean.gravar}"/>
91
action handler ou action que determina a prxima pgina na navegao actionListener evento a ser executado image imagem para o commandButton immediate se true as aes e eventos sero executados no inicio do cliclo de vida e no no final type para commandButton: reset, submit, button para commandLink contedo do recurso: text/html, image/gif, audio/basic, etc... value texto exibido no boto ou no link
92
accesskey, alt, binding, id, lang, rendered, styleClass dir, disabled, lang, readonly, style, tabindex, title, type Somente para comandLink
onblur, onchange, onclick, onfocus, onkeydown, onkeypress, onkeyup, onmousedown, onmousemove, onmouseout, omnouseover, onreset, onsubmit
93
Usando botes
<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}"/>
94
95
outputLink
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
96
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>
97
Tags de Seleo
98
Tags de Seleo
Atributos
disabledClass, enabledClass Classe css para elementos desabilitados e abilitados (apenas para selectOneRadio e selectManyCheckbox) layout Especifica a direo que sero 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)
99
100
101
102
h:selectOneListBox
Seleciona apenas um valor em uma lista Seleciona vrios valores em uma lista Seleciona um valor em uma combo Seleciona vrios valores em uma combo
h:selectManyListBox
h:selectOneMenu
h:selectManyMenu
103
Atributos
binding id ID do componente itemDescription usado em ferramentas (no usado no html) itemDisabled booleano, habilita/desabilita item itemLabel texto exibido do item itemValue valor enviado para o servidor value expresso que aponta para uma instncia da classe SelectItem
104
Classe SelectItem
javax.faces.model.SelectItem
new SelectItem(valor) new SelectItem("valor", "label") new SelectItem("valor","label","descrio") new SelectItem("valor","label","descrio", true/false)
105
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; }
106
nica instncia de SelectItem Coleo de instncias de SelectItem Array de Instncias de SelectItem Mapa (map), onde key/value representam label/valor do SelectItem
107
Tags de Seleo
108
Tags de Seleo
109
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("Mecnicos"); mecanios.setSelectItems(getMecanicos()); opcoes.add(mecanicos); } return opcoes;
110
111
Tags de mensagens
h:message
Exibe uma mensagem referente a um componente que tenha sido armazenada no contexto Exibe todas as mensagens armazenadas no contexto Informao Advertncia Erro Fatal
Curso JavaServer Faces 112
h:messages
Tipos de mensagens
Tags de Mensagem
Atributos
Descrio ID ao qual a mensagen se refere (h:message somente) Classe CSS para mensagens de erro Estilo CSS para mensagens de erro Classe CSS para mensagens fatais Estilo CSS para mensagens fatais Somente mensagens globais (h:messages somente) classe CSS para mensagens de informao Estilo CSS para mensagens de informao Layout da mensagem: table ou list (h:messages somente) Se os detalhes das mensagem sero exibidos: true/false Se os sumrios das mensagens sero exibidos: true/false Se os detalhes das mensagens sero exibidos na tooltip (true/false) Classe CSS para mensagens de advertncia Estilo CSS para mensagens de advertncia Atributos bsicos
Curso JavaServer Faces 113
Atributo for errorClass errorStyle fatalClass fatalStyle globalOnly infoClass infoStyle layout showDetail showSummary tootip warnClass warnStyle binding, id, rendered,
Painis - h:panelGrid
Renderiza uma tabela HTML Permite definir um cabealho e um roda p para a tabela Permite apenas um nico componente por clula No permite colspan e rowspan
114
Painis - h:panelGrid
Atributos
Descrio Cor de fundo da tabela Largura da borda Espessura das clulas Espaamento entre as celulas Lista de classes CSS para as colunas Nmero de colunas Classe CSS para o rodap Classe CSS para o cabealho Lados da tabela que sero desenhados: none, above, below, hsides, vsides, lhs, rhs, box, border Lista de classes CSS para as linhas Linhas desenhadas entre as clulas: groups, rows, columns, all Atributos bsicos Atributos HTML Eventos DHTML
Curso JavaServer Faces 115
Atributo bgcolor border cellpadding cellspacing columnClasses columns footerClass headerClass frame rowClasses rules binding, id, rendered, styleClass dir, lang, style, title, width onclick, onkeydow, etc....
Painis h:panelGroup
Usado para agrupar vrios componentes (so considerados um componente para uma clula do panelGrid) Atributos
Atributos Descrio binding, id, rendered, styleClassAtributos bsicos style Atributo HTML
116
Painis f:facet
header footer title Etc.... name nome da parte que este representa
Atributo
Painis - 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>
118
Exerccio
Nome*, endereo, telefone, cpf* Sexo* M/F (radio) Estado Civil Casado, Solteiro, Viuvo (combo) Areas de interesse informatica, automveis, esportes, etc... (checkbox) Observaes (text area) Ativo (checkbox - boolean)
Exerccio
Classes
cadastro.dao.ClienteDAO Mtodos: inserirCliente, alterarCliente, consultarCliente, excluirCliente cadastro.dao.InteressesDAO Mtodo: listarIntereses cadastro.dto.Cliente cadastro.util.Banco cadastro.web.ServerListener consulta.jsp
Curso JavaServer Faces 120
Pgina
Tabela de Dados
h:dataTable
Permite a exibio de dados em formato tabular, utilizando tabelas HTML Aceita as seguintes fontes de dados no atributo value
121
Tabela de Dados
h:dataTable
A medida que executado, cada item do valor passado se torna disponvel dentro do corpo da tag O atributo var de dataTable utilizado para dar um nome ao item durante a execuo Qualquer objeto java pode ser passado para value, neste caso, se for um escalar (no um tipo de coleo) no ocorrer iterao e o mesmo objeto ser passado para o var S permitido dentro da tag dataTable h:columns e f:facet
Curso JavaServer Faces 122
Tabela de Dados
h:dataTable
atributos
Descrio Cor de fundo da tabela Largura da borda da tabela Espessura das clulas da tabela Espaamento entre as clulas da tabela Lista separada por vrgula das classes CSS para as colunas Indice da primeira linha mostrada Classe CSS para o rodap da tabela Especificao dos lados da tabela: none, above, below, hsides, vsides lhs, rhs, box, border Classe CSS para o cabealho da tabela Lista separada por virgula das classes CSS para as linhas Nmero de linhas a ser exibida Linhas desenhadas entre clulas: groups, rows, columns, all Nome da varivel que representar o item Atributos bsicos Atributos HTML
Curso JavaServer Faces 123
Atributo bgcolor border cellpadding cellspacing columnClasses first footerClass frame headerClasse rowClasses rows rules var binging, id, rendered, .... dir, lang, style, width
Tabela de Dados
h:column
Atributos:
124
Tabela de Dados
Cabealhos e rodaps
Os facets so definidos dentro de cada coluna Podemos ter um cabealho e um rodap para a tabela, basta utilizar facets dentro da dataTable para header e footer (devem estar fora das colunas)
125
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>
126
Tabela de Dados
Estilos
Para a tabela como um todo (styleClass) Cabealhos e rodaps de colunas (headerClass e footerClass) Colunas individuais (columnClasses) Linhas individuais (rowClasses)
127
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 128
Tabela de Dados
Estilos de Colunas
129
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 130
Tabela de Dados
Estilos de Linhas
131
Tabela de Dados
Exerccio
Armazenar os dados numa list Usar uma action para ler os dados do banco usando o dao e setar a list Utilizar CSS para formatar a pgina
132
Tabela de Dados
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
Assim como nos componentes da pgina, os valores sero atualizados dentro do bean, mesmo estando dentro de uma list
Curso JavaServer Faces
133
Tabela de Dados
134
Tabela de Dados
Ao invs de termos uma lista de beans cliente, vamos usar um map, que conter o cliente e um valor booleando indicando se a linha foi excluda
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); }
135
Tabela de Dados
Tabela de Dados
Na ao do boto excluir basta verificarmos na lista quais linhas possuem no mapa o valor excluir setado para true
137
Tabela de Dados
Exerccio
Este bean deve ter um atribudo que a lista para excluso Deve-se criar uma ao para excluir as linhas A excluso dever remover do banco as linhas selecionadas A lista dever ser lida novamente ao final da excluso
138
Tabela de Dados
Modelo de tabelas
Todos os dados passados para um dataTable so empacotados dentro de um modelos Pacote javax.faces.model temos os seguinte modelos usados
139
Tabela de Dados
Modelo de tabelas
Todos os modelos tem um contrutor que recebe como parametro um objeto do seu tipo correspondente (List, ResultSet, etc...)
Curso JavaServer Faces 140
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; }
141
Tabela de Dados
Modelo de Tabelas
O mtodo 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 142
Tabela de Dados
Exerccio
Troque a lista por um ListDataModel Crie o mtodo alterar no bean Adicione uma coluna para acionar a ao alterar Crie uma tela para alterao (pode ser a mesma de incluso, ctrl+c ;-) Crie um bean e um metodo para atualizar os atributos da tela, a partir de um bean cliente Crie o mtodo que ir atualizar os dados no banco de dados chamando o DAO
Curso JavaServer Faces 143
Tabela de Dados
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) { public public public public this.wrappedData = clientes;}
int getRowIndex() {return index; } void setRowIndex(int index) {this.index = index;} Object getWrappedData() {return wrappedData; } void setWrappedData(Object data) {wrappedData = (List) data; }
144
Tabela de Dados
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; }
145
Tabela de Dados
146
Tabela de Dados
147
Tabela de Dados
148
Tabela de Dados
149
Tabela de Dados
Exerccio
150
Conversores e Validadores
Ciclo de vida
Requisio
Resposta
Conversores e Validadores
Ciclo de Vida
Restaurar view
Recupera a rvore de componentes que representa a view.
Aplicar valores do request Processar validaes Atualizar valores do modelo Executar aplicao
Resposta
Conversores e Validadores
Ciclo de vida
Requisio
Resposta
Conversores e Validadores
Ciclo de Vida
Processar validaes
Validao padro Validao customizada: Mtodo de ao Classe de validao customizada Validao de mtodo inline
Processar validaes Atualizar valores do modelo Executar aplicao
Resposta
Conversores e Validadores
Ciclo de Vida
Resposta
Conversores e Validadores
Ciclo de Vida
Executar aplicao
Chamar os eventos executar os mtodos (aes) Processar a navegao
Aplicar valores do request Processar validaes Atualizar valores do modelo Executar aplicao
Resposta
Conversores e Validadores
Ciclo de Vida
Renderizar resposta
Valores dos componentes so recuperados para renderizao
Aplicar valores do request Processar validaes Atualizar valores do modelo Executar aplicao
Resposta
Conversores e Validadores
Processo de converso
Dados lidos da requisio setado no componente o atributo submitedValue exetudado o metodo getAsObject do conversor associado ao componente feita validao (caso haja) mtodo validate Modelo atualizado (bean)
UIInput
Valor submetido=10/11/2003 valor local = objeto tipo Date
Modelo - Bean
DataNascimento = objeto tipo date
158
Conversores e Validadores
Conversores padro
f:convertNumber
Tipo String String Int Int Int Int Boolean Boolean java.util.Locale String String Descrio number (default), currency ou percent Padro de formatao, conforme java.text.DecilmalFormat Numero mximo de digitos na parte fracionria Numero mnimo de digitos na parte fracionria Numero mximo de digitos na parte inteira Numero mnimo de digitos na parte inteira Se verdadeiro, considera somente a parte inteira (default: false) Se usa separadores de grupos (default: true) Varivel de locale que sera usada na formatao e no parsing Cdigo monetario isso 4217 Simbolo monetrio a ser usado
Atributo type pattern maxFractionDigits minFractionDigits maxIntegerDigits minIntegerDigits integerOnly groupingUsed locale currencyCode currencySymbol
159
Conversores e Validadores
Conversores padro
f:convertDateTime
Tipo String String String Int java.util.Locale java.util.TimeZone Descrio date (default), time ou both default, short, medium, long ou full default, short, medium, long ou full Padro de formatao de acordo com java.text.SimpleDateFormat Localizao cujas preferncias so usadas para parsing e formatao Fuso horrio a ser usado para parsing e formatao
160
Conversores e Validadores
Atributo Converter
javax.faces.DateTime (usado no converterDateTime) javax.faces.Number (usado no converterNumber) Para tipos primitivos e wrappers
javax.faces.BigDecimal e javax.faces.BigInteger
Curso JavaServer Faces 161
Conversores e Validadores
Erros de converso
Componente gera uma mensagem de erro sempre que ocorrer um erro de converso
h:messages no muito util para exibir mensagens para cada componente, mais indicado para mensagens globais, mas caso esteja ocorrendo um erro na pgina que voc no consegue identificar, use-o para exibir todas as mensagens (detail=true)
Curso JavaServer Faces 162
Conversores e Validadores
Erros de converso
Para alterar a mensagem padro devemos criar uma nova mensagem no nosso arquivo de mensagens, com o cdigo abaixo
javax.faces.component.UIInput.CONVERSION=.... javax.faces.component.UIInput.CONVERSION_detail=....
163
Conversores e Validadores
Exerccio
Incluir o campo para data de nascimento do cliente Na tabela, incluir uma coluna com a data de nascimento
Na tela de consulta
164
Conversores e Validadores
Validadores padro
Atributos minimum, maximum minimum, maximum minimum, maximum Valida Valor double dentro de uma faixa Valor long dentro de uma faixa String com nmero mximo e mnimo de caracteres
Tag JSP Classe do validador f:validadteDoubleRange DoubleRangeValidator f:validateLongRange f:validateLength LongRangeValidator LengthValidator
165
Conversores e Validadores
Valores Obrigatrios
166
Conversores e Validadores
Erros de validao
Mensagem simples
167
Conversores e Validadores
Erros de validao
168
Conversores e Validadores
Caso na tela exista um boto para cancelar a entrada de dados, no desejaremos que seja feita uma validao dos dados entrados (no s validao, mas converso tambem) Para ignorarmos estes passos usamos o atributo immediate
169
Conversores e Validadores
Exerccio
No cadastro de clientes fazer a validao do campo observao, para que este no ultrapasse 200 caracteres.
170
Conversores e Validadores
Conversores personalizados
171
Conversores e Validadores
172
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 173
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); }
174
Conversores e Validadores
Exemplo: configurao
FacesConfig.xml
<application> <message-bundle>mensagens</message-bundle> </application> <converter> <converter-id>dateConverter</converter-id> <converter-class>converter.DateConverter</converter-class> </converter>
175
Conversores e Validadores
Exemplo: mesagens
mensagens.properties
DATECONVERTER.ERROR=Data invlida DATECONVERTER.ERROR_detail=O valor {0} entrado no campo {1} invlido DATECONVERTER.FATAL=Tipo de dados invlido DATECONVERTER.FATAL_detail=Tipo de dados {0} invlido no componente {1}
176
Conversores e Validadores
Exemplo: utilizao
177
Conversores e Validadores
public static FacesMessage getMessage( String id, String idDetail, Object[] parameters, Severity severity) {
178
Conversores e Validadores
getViewRoot view da requisio corrente getApplication retorna uma instancia de Application desta aplicao getApplication().getMessageBundle retorna o nome do arquivo de mensagens associado a aplicao
Convesores e Validadores
Validadores Personalizados
180
Conversores e Validadores
package 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); } } Curso JavaServer Faces 181
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)
182
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; } }
183
Conversores e Validadores
Exemplo: configurao
<validator> <validator-id>cpfValidator</validator-id> <validator-class>converter.CPFValidator</validator-class> </validator>
Mensagens
CPFVALIDATOR.ERROR=CPF Invlido CPFVALIDATOR.ERROR_detail=O valor {0} do campo {1} no um CPF vlido
Utilizao
<h:inputText id="cpf" value="#{bean.cpf}"> <f:validator validatorId="cpfValidator"/> </h:inputText>
184
Conversores e Validadores
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 mtodo createConverter Utilizar o super.createConverter para pegar o conversor
Conversores e Validadores
Conversores e Validadores
187
Conversores Validadores
Nossa classe de coverso deve implementar Serializable Ou implementar StateHolder (caso no possa ser usado serializable)
Deve ter um construtor padro Implementar os mtodos Object saveState(FacesContext context) void restoreState(FacesContext context, Object state) Object pode ser um array que ir armazenas as varivies que podem ser serializadas Criar uma propriedade transient (setTransient e isTransient) do tipo boolean (aparentemente no tem efento nenhum (?))
188
Converores e Validadores
Implementar Serializable Incluir mtodos 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; }
189
Conversores e Validadores
<?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 webjsptaglibrary_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 190
Conversores e Validadores
Utilizao
<%@taglib prefix="cv" uri="/WEB-INF/ConverterTag" %> <h:inputText id="gdata" value="#{teste.data}"> <cv:dataConverter pattern="dd-MM-yyyy"/> </h:inputText>
191
Conversores e Validadores
192
Conversores e Validadores
193
Conversores e Validadores
Exerccios
194
Eventos
Tipos de Eventos
195
Eventos
Ciclo de Vida
Resposta finalizada
Resposta finalizada
Restaurar
Request Viso
Processar Eventos
Processar Validaes
Processar Eventos
Renderizar Response
Resposta
Processar Eventos
Invocar Aplicao
Processar Eventos
Eventos de ao
196
Eventos
Ciclo de vida
Restaurar viso
Recria a rvore de componentes server-side Copia os parametros da requisio para valores submetidos Converte os valores submetidos e valida o valor convertido
Processar Validaes
197
Eventos
Ciclo de vida
Copia o valor convertido e validado para o modelo (atravs das expresses #{bean.atributo}) Chama os listeners de ao e as aes, nessa ordem Salva o estado e carrega a viso seguinte
Invocar Aplicao
Renderizar Resposta
198
Eventos
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 199
Eventos
javax.faces.event.ValueChangeEvent
UIComponent getComponent()
Componente que iniciou o evento Retorna o novo valor Retorna o valor anterior
Object getNewValue()
Object getOldValue()
200
Eventos
Eventos de Ao
Ocorrem sempre que uma ao disparada, usado apenas com commandButton e commandLink processada antes da ao
<h:commandButton type="submit" value="enviar" actionListener="#{bean.alteraLabel}"/>
201
Eventos
Eventos de Ao
Dica: devem ser utilizados para lgica da interface, ficando as actions com a lgica de negcios
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 202
Eventos
Mudana de valor
f:valueChangeListener
<h:selectOneMenu id="prod" value="#{bean.produto}" onchange="submit()"> <f:valueChangeListener type="br.com.cadastro.ComboProdutoListener"/> <f:selectItems value="#{bean.comboProdutos}" /> </h:selectOneMenu>
Ao invz de um mtodo ele faz referncia a uma classe que implementa a interface ValueChangeListener
public class ComboProdutoListener implements ValueChangeListener{ public void processValueChange(ValueChangeEvent event) { .... } }
203
Eventos
Ao
f:actionListener
>
Ao invz de um mtodo ele faz referncia a uma classe que implementa a interface ActionListener
public class EnviarListener implements ActionListener{ public void processAction(ActionEvent event) { .... } }
204
Eventos
Componentes Imediatos
Quando necessrio que uma determinada ao ou evento ocorra antes das fases de converso e validao
Por exemplo cancelar uma entrada de dados CommandButton e commandLink para eventos de ao e actions inputs em geral (select, inputText, etc...) para tratar eventos de valueChangeListener
205
Eventos
Componentes Imediatos
Inputs imediatos
Aes imediatas
Resposta finalizada
Resposta finalizada
Restaurar
Request Viso
Processar Eventos
Processar Validaes
Processar Eventos
Renderizar Response
Resposta
Processar Eventos
Invocar Aplicao
Processar Eventos
Eventos
Componentes Imediatos
<h:selectOneMenu id="prod" value="#{bean.produto}" valueChangeListener="#{bean.changeProduto}" onchange="submit()" immediate="true"> <f:selectItems value="#{bean.comboProdutos}" /> </h:selectOneMenu>
207
Eventos
Componentes Imediatos
Dica: ir diretamente para a fase de renderizao, ignorando as vases de validao, atualizao do modelo e execuo da aplicao (actions)
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(); }
208
Eventos
Eventos de fase
Configurados no faces-config.xml
209
Eventos
Eventos de fase
210
Eventos
Eventos de fase
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; }
211
Eventos
Exerccio
Campo para data com conversor de data Combo para clientes DataTable para itens
Combo para produtos Campo para quantidade (conversor para numeros) Exibio do preo do produto Exibio do total por linha e o total do pedido no rodape da coluna Boto para excluir item Incluir item (incluir um novo item no list do dataModel) Salvar pedido Cancelar
Curso JavaServer Faces 212
Botes para
Subvises e Tiles
Subvises
f:subview
Utilizada para fazer incluso de pores de cdigo jsp nas pginas 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 so ignoradas Pginas includas no devem ter a tag f:view
213
Subvises e Tiles
Subvises
pginas so includas em tempo de compilao pginas so includas em tempo de execuo pginas so includas em tempo de execuo, pode acessar recursos/sites externos (depende da instalao da JSTL)
214
Subvises e Tiles
Subvises
Utilizao:
<f:subviewid="cabecalho"> <jsp:includepage="cabecalho.jsp"/> </f:subview> Importante: apesar do acesso as pginas jsp serem feitas melo mapeamento da servlet FacesServlet (*.jsf, /faces/* ou *.faces) a pgina incluida no deve usar o mapeamento
Exerccio
Criar uma pgina jsf contendo um cabealho e incluir esta pgina nas pginas da nossa aplicao
Curso JavaServer Faces 215
Subvises e Tiles
Tiles
um framworkd que permite ao desenvolvedor criar modelos de pginas e de maneira fcil e declarativa incluir partes reutiliveis de pginas distribudo 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 informaes sobre o Tiles acesse http://www.lifl.fr/~dumoulin/tiles/
216
Subvises e Tiles
Tiles
217
Subvises e Tiles
Tiles
MyFaces possi um ViewHander que d suporte ao Tiles em aplicaes JSF. para us-lo basta configur-lo no nosso arquivo de configurao da aplicao
218
Subvises e Tiles
Tiles
Pagina de layout
<tablewidth="100%"> <tr><tdcolspan="2"> <f:subviewid="titulo"> <tiles:insertattribute="titulo"flush="false"/> </f:subview> </td></tr> <tr><tdwidth="10%"> <f:subviewid="menu"> <tiles:insertattribute="menu"flush="false"/> </f:subview> </td> <tdwidth="*"> <f:subviewid="corpo"> <tiles:insertattribute="corpo"flush="false"/> </f:subview> </td></tr> <tr><tdcolspan="2"> <f:subviewid="rodape"> <tiles:insertattribute="rodape"flush="false"/> </f:subview> </td></tr> </table> Curso JavaServer Faces 219
Subvises e Tiles
Tiles
Definies do tiles
<tilesdefinitions> <definitionname="layout"path="/layout.jsp"> <putname="titulo"value="/titulo.jsp"/> <putname="menu"value="/menu.jsp"/> <putname="rodape"value="/rodape.jsp"/> </definition> <definitionname="inicio.tiles"extends="layout"> <putname="corpo"value="/inicio.jsp"/> </definition> <definitionname="inserir.tiles"extends="layout"> <putname="corpo"value="/inserir.jsp"/> </definition> <definitionname="consultar.tiles"extends="layout"> <putname="corpo"value="/consultar.jsp"/> </definition> <definitionname="pedido.tiles"extends="layout"> <putname="corpo"value="/pedido.jsp"/> </definition> </tilesdefinitions>
220
Subvises e Tiles
Tiles
Pgina de menu
Pgina de cabealho
<%@tagliburi="http://java.sun.com/jsf/html"prefix="h"%> <h:outputTextvalue="CursodeJavaServerFaces"styleClass="titulos"/>
221
Subvises e Tiles
Tiles
222
Subvises e Tiles
Tiles
223
Componentes Personalizados
Separe o JavaScript em funes e verifique se estas no conflitam com outros componentes Teste seu componente com outros componentes na mesma pgina
Sendo filho deles Tendo eles como filhos (caso ele de suporte)
224
Componentes Personalizados
Implementar a classe de UI
225
Componentes Personalizados
Implementar a renderizao
void encodeBegin(FacesContext context) inicio da gerao de html (abrir tags: <div>) void encodeEnd(FacesContext context) fim da gerao de html (fechar tags: </div>) Extender a classe Renderer
226
Componentes Personalizados
String getContentType() - nome simblico do componente String getRendererType() - nome simblico do renderizador void release() - setar os atributos para nulo void setProperties(UIComponent) - passa os parametros da tag para o componente Verificar a utilizao de expresses
Componentes Personalizados
Os parametros podem ser passados por ValueBinding (expresses) ou como atributos String
228
Componentes Personalizados
229
Componentes Personalizados
Atributos da tag
230
Componentes Personalizados
Classe da tag
Atributos herdados
Atributos da tag
231
Componentes Personalizados
Classe do componente
232
Componentes Personalizados
233
Componentes Personalizados
Funcionamento do componente
234
Componentes Personalizados
Mtodos criados no componente para simplificar o desenvolvimento Curso JavaServer Faces 235
Componentes Personalizados
Componentes Personalizados
Caso o valor no seja um numero inteiro, deixa como responsabilidade do conversor exibir a mensagem de erro Curso JavaServer Faces 237
Componentes Personalizados
238
Componentes Personalizados
Arquivo TLD
Faces-Config.xml
239
Componentes Personalizados
240
Componentes Personalizados
Exerccio
Crie um novo projeto no eclipse e tomo por base as configuraes do arquivo blank.war (est junto com os exemplos do MyEclipse)
Implemente o componente HelloWorld Implemente o componente Spinner Implemente um Bean e uma Pgina para test-los
241
Dicas
Componentes do MyFaces
242
Dicas
Componentes do MyFaces
Menu
243
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>
244
Dicas
Componentes do MyFaces
Tree
245
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>
246
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>
247
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 248
Dicas
Componentes do MyFaces
Schedule
249
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 250
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 251
Dicas
<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 252
Dicas
Paginao 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
253
Dicas
Paginao 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 254
Dicas
Paginao 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) { } }
255
Dicas
Paginao 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; } }
256
Dicas
Paginao 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; } }
257
Dicas
Paginao no Banco
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; } }
258
Dicas
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);
259
Dicas
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 260
Dicas
Dicas
Layouts complexos
http://jsftutorials.net/htmLib Ele possi uma quantidade grande de componentes que representam as tags html
Dicas
A Exadel tambem fornece uma biblioteca de componentes jsf que permite adicionar funcionalidades AJAX aos componentes
https://ajax4jsf.dev.java.net
Utilizao
<%@ 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 263
Dicas
Sesso context.getExternalContext().getSession(); Atributos da sesso 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();
264
Dicas
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
/>
265
Dicas
266