cursojsf

266
Curso JavaServer Faces FR-800 JavaServer Faces Edição 2.0 Março 2006 http://www.mayworm.com/cursos Marcelo Mayworm - [email protected] Luis Henrique Muiz de Carvalho - [email protected]

Upload: sousamarcolino

Post on 30-Oct-2014

102 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: cursoJSF

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]

Page 2: cursoJSF

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.

Page 3: cursoJSF

Curso JavaServer Faces 3

Objetivos

Ao final desse curso o aluno estará apto a desenvolver uma aplicação WEB utilizando JavaServer Faces.

Page 4: cursoJSF

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?

Page 5: cursoJSF

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

Page 6: cursoJSF

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/

Page 7: cursoJSF

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

Page 8: cursoJSF

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

Page 9: cursoJSF

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

Page 10: cursoJSF

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

Page 11: cursoJSF

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

Page 12: cursoJSF

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!)

Page 13: cursoJSF

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

Page 14: cursoJSF

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.

Page 15: cursoJSF

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.

Page 16: cursoJSF

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

Page 17: cursoJSF

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

Page 18: cursoJSF

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.

Page 19: cursoJSF

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

Page 20: cursoJSF

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

Page 21: cursoJSF

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

Page 22: cursoJSF

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

Page 23: cursoJSF

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:

Page 24: cursoJSF

Curso JavaServer Faces 24

Instalação e Configuração

Configurando o Eclipse Apontar o workspace para o diretório

c:\curso\workspace

Page 25: cursoJSF

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

Page 26: cursoJSF

Curso JavaServer Faces 26

Instalação e Configuração

Configurando o Eclipse Configurando o JDK

Page 27: cursoJSF

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.

Page 28: cursoJSF

Curso JavaServer Faces 28

Instalação e Configuração

Configurando o Eclipse Configurar o tomcat

Selecione Apache Tomcat v5.5

Page 29: cursoJSF

Curso JavaServer Faces 29

Instalação e Configuração

Configurando o Eclipse Configurar o tomcat

Indique onde está instalado o tomcat

Page 30: cursoJSF

Curso JavaServer Faces 30

Instalação e Configuração

Configurando o Eclipse Configurar o tomcat

Page 31: cursoJSF

Curso JavaServer Faces 31

Primeira Aplicação em JSF

Criação do projeto no Eclipse File/New Web/Dynamic

Web Project

Page 32: cursoJSF

Curso JavaServer Faces 32

Primeira Aplicação em JSF

Criação do projeto no Eclipse Utilize

ExemploLogin como nome para o projeto

Page 33: cursoJSF

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

Page 34: cursoJSF

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>

Page 35: cursoJSF

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; }

}

Page 36: cursoJSF

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>

Page 37: cursoJSF

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>

Page 38: cursoJSF

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>

Page 39: cursoJSF

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>

Page 40: cursoJSF

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");%>

Page 41: cursoJSF

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>

Page 42: cursoJSF

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

Page 43: cursoJSF

Curso JavaServer Faces 43

Primeira Aplicação em JSF

Selecionaremos Tomcat 5.5 Adicionaremos o projeto

Page 44: cursoJSF

Curso JavaServer Faces 44

Primeira Aplicação em JSF

Com o servidor configurado temos as seguintes opções: Debug, Start, Profiling, Restart, Stop, Publish

Page 45: cursoJSF

Curso JavaServer Faces 45

Primeira Aplicação em JSF

Podemos testar nossa aplicação dentro do próprio Eclipse

Browser interno do Eclipse-WebTools

Page 46: cursoJSF

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...).

Page 47: cursoJSF

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.

Page 48: cursoJSF

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>

Page 49: cursoJSF

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

Page 50: cursoJSF

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

Page 51: cursoJSF

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...

Page 52: cursoJSF

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>

Page 53: cursoJSF

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

Page 54: cursoJSF

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

Page 55: cursoJSF

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>

Page 56: cursoJSF

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>

Page 57: cursoJSF

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>

Page 58: cursoJSF

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>

Page 59: cursoJSF

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

Page 60: cursoJSF

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

Page 61: cursoJSF

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']

Page 62: cursoJSF

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()

Page 63: cursoJSF

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

Page 64: cursoJSF

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}" />

Page 65: cursoJSF

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)

Page 66: cursoJSF

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

Page 67: cursoJSF

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

Page 68: cursoJSF

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>

Page 69: cursoJSF

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

Page 70: cursoJSF

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>

Page 71: cursoJSF

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>

Page 72: cursoJSF

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>

Page 73: cursoJSF

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>

Page 74: cursoJSF

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>

Page 75: cursoJSF

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>

Page 76: cursoJSF

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

Page 77: cursoJSF

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

Page 78: cursoJSF

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

Page 79: cursoJSF

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

Page 80: cursoJSF

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

Page 81: cursoJSF

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)

Page 82: cursoJSF

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)

Page 83: cursoJSF

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;

}

Page 84: cursoJSF

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

Page 85: cursoJSF

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

Page 86: cursoJSF

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

Page 87: cursoJSF

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>

Page 88: cursoJSF

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)

Page 89: cursoJSF

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" />

Page 90: cursoJSF

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}" />

Page 91: cursoJSF

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>

Page 92: cursoJSF

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

Page 93: cursoJSF

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

Page 94: cursoJSF

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}"/>

Page 95: cursoJSF

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>

Page 96: cursoJSF

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

Page 97: cursoJSF

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>

Page 98: cursoJSF

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

Page 99: cursoJSF

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)

Page 100: cursoJSF

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;

}

Page 101: cursoJSF

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;}

Page 102: cursoJSF

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;}

Page 103: cursoJSF

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

Page 104: cursoJSF

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

Page 105: cursoJSF

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)

Page 106: cursoJSF

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; }

Page 107: cursoJSF

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

Page 108: cursoJSF

Curso JavaServer Faces 108

Tags JSF Padrão

Tags de Seleção

Page 109: cursoJSF

Curso JavaServer Faces 109

Tags JSF Padrão

Tags de Seleção

Page 110: cursoJSF

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;}

Page 111: cursoJSF

Curso JavaServer Faces 111

Tags JSF Padrão

Tags de seleção – Grupos de Itens

<h:selectOneListbox >

<f:selectItems value="#{bean.opcoes}"/>

</h:selectOneListbox>

Page 112: cursoJSF

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

Page 113: cursoJSF

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

Page 114: cursoJSF

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

Page 115: cursoJSF

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

Page 116: cursoJSF

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

Page 117: cursoJSF

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>

Page 118: cursoJSF

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>

Page 119: cursoJSF

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

Page 120: cursoJSF

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

Page 121: cursoJSF

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

Page 122: cursoJSF

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

Page 123: cursoJSF

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

Page 124: cursoJSF

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

Page 125: cursoJSF

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)

Page 126: cursoJSF

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>

Page 127: cursoJSF

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)

Page 128: cursoJSF

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">

Page 129: cursoJSF

Curso JavaServer Faces 129

Tabela de Dados

Estilos de Colunas

Page 130: cursoJSF

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">

Page 131: cursoJSF

Curso JavaServer Faces 131

Tabela de Dados

Estilos de Linhas

Page 132: cursoJSF

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

Page 133: cursoJSF

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

Page 134: cursoJSF

Curso JavaServer Faces 134

Tabela de Dados

Utilizando componentes nas células

Page 135: cursoJSF

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);

}

Page 136: cursoJSF

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}"/>

Page 137: cursoJSF

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

Page 138: cursoJSF

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

Page 139: cursoJSF

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

Page 140: cursoJSF

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

Page 141: cursoJSF

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;}

Page 142: cursoJSF

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";

}

Page 143: cursoJSF

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

Page 144: cursoJSF

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; }

Page 145: cursoJSF

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;

}

Page 146: cursoJSF

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());

}

};

Page 147: cursoJSF

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());

}};

Page 148: cursoJSF

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>

Page 149: cursoJSF

Curso JavaServer Faces 149

Tabela de Dados

Dica: Implementar ordenação

Page 150: cursoJSF

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

Page 151: cursoJSF

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”:

Page 152: cursoJSF

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.

Page 153: cursoJSF

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

Page 154: cursoJSF

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”

Page 155: cursoJSF

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

Page 156: cursoJSF

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

Page 157: cursoJSF

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

Page 158: cursoJSF

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

Page 159: cursoJSF

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

Page 160: cursoJSF

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

Page 161: cursoJSF

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"/>

Page 162: cursoJSF

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)

Page 163: cursoJSF

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>

Page 164: cursoJSF

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

Page 165: cursoJSF

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>

Page 166: cursoJSF

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"/>

Page 167: cursoJSF

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

Page 168: cursoJSF

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....

Page 169: cursoJSF

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" />

Page 170: cursoJSF

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.

Page 171: cursoJSF

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

Page 172: cursoJSF

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";

....

}

Page 173: cursoJSF

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; }

Page 174: cursoJSF

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);

}

Page 175: cursoJSF

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>

Page 176: cursoJSF

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}

Page 177: cursoJSF

Curso JavaServer Faces 177

Conversores e Validadores

Exemplo: utilização

<h:inputText id="data" value="#{bean.campoData}"> <f:converter converterId="dateConverter" /></h:inputText>

Page 178: cursoJSF

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; }

Page 179: cursoJSF

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

Page 180: cursoJSF

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

Page 181: cursoJSF

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)

Page 182: cursoJSF

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)

Page 183: cursoJSF

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; }

}

Page 184: cursoJSF

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>

Page 185: cursoJSF

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

Page 186: cursoJSF

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)

Page 187: cursoJSF

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

Page 188: cursoJSF

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 (?))

Page 189: cursoJSF

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; }

Page 190: cursoJSF

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>

Page 191: cursoJSF

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>

Page 192: cursoJSF

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

Page 193: cursoJSF

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");

Page 194: cursoJSF

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

Page 195: cursoJSF

Curso JavaServer Faces 195

Eventos

Tipos de Eventos Eventos de ação Eventos de mudança de valor Eventos de Fase

Page 196: cursoJSF

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

Page 197: cursoJSF

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

Page 198: cursoJSF

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

Page 199: cursoJSF

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(); }

Page 200: cursoJSF

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

Page 201: cursoJSF

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"); }

Page 202: cursoJSF

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")) { .... }

Page 203: cursoJSF

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) { .... }}

Page 204: cursoJSF

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) { .... }}

Page 205: cursoJSF

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

Page 206: cursoJSF

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

Page 207: cursoJSF

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"/>

Page 208: cursoJSF

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(); }

Page 209: cursoJSF

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>

Page 210: cursoJSF

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

Page 211: cursoJSF

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;

}

}

Page 212: cursoJSF

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

Page 213: cursoJSF

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

Page 214: cursoJSF

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)

Page 215: cursoJSF

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

Page 216: cursoJSF

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/

Page 217: cursoJSF

Curso JavaServer Faces 217

Subvisões e Tiles

Tiles Definindo o arquivo de configuracão do tiles

    <context­param>        <param­name>tiles­definitions</param­name>        <param­value>/WEB­INF/tiles.xml</param­value>    </context­param>

Page 218: cursoJSF

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>   <view­handler>     org.apache.myfaces.application.jsp.JspTilesViewHandlerImpl   </view­handler></application>

Page 219: cursoJSF

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> 

Page 220: cursoJSF

Curso JavaServer Faces 220

Subvisões e Tiles

Tiles Definições do tiles

<tiles­definitions>    <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></tiles­definitions>

Page 221: cursoJSF

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" />

Page 222: cursoJSF

Curso JavaServer Faces 222

Subvisões e Tiles

Tiles

Page 223: cursoJSF

Curso JavaServer Faces 223

Subvisões e Tiles

Tiles Exercício, incluir o tiles na nossa aplicação em

todas as paginas

Page 224: cursoJSF

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

Page 225: cursoJSF

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...

Page 226: cursoJSF

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

Page 227: cursoJSF

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

Page 228: cursoJSF

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

Page 229: cursoJSF

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

Page 230: cursoJSF

Curso JavaServer Faces 230

Componentes Personalizados

Componente HelloWorld - HelloUITag

Atributos da tag

Limpa os atributos

Page 231: cursoJSF

Curso JavaServer Faces 231

Componentes Personalizados

Componente HelloWorld – arquivo TLD

Classe da tag

Atributos herdados

Atributos da tag

Page 232: cursoJSF

Curso JavaServer Faces 232

Componentes Personalizados

Componente HelloWorld – configuração no faces-config.xml

Familia do componente

Classe do componente

Page 233: cursoJSF

Curso JavaServer Faces 233

Componentes Personalizados

Componente HelloWorld – Utilização

Page 234: cursoJSF

Curso JavaServer Faces 234

Componentes Personalizados

Funcionamento do componente

Page 235: cursoJSF

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”

Page 236: cursoJSF

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

Page 237: cursoJSF

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

Page 238: cursoJSF

Curso JavaServer Faces 238

Componentes Personalizados

Componente de Entrada – SpinnerTag

Page 239: cursoJSF

Curso JavaServer Faces 239

Componentes Personalizados

Componente de Entrada – Configuração Spinner Arquivo TLD

Faces-Config.xml

Page 240: cursoJSF

Curso JavaServer Faces 240

Componentes Personalizados

Componente de Entrada – Utilização

Page 241: cursoJSF

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

Page 242: cursoJSF

Curso JavaServer Faces 242

Dicas

Componentes do MyFaces Menu Tree NewsPaper Table Tabbed Pane Calendar Schedule DataScroller

Page 243: cursoJSF

Curso JavaServer Faces 243

Dicas

Componentes do MyFaces Menu

Page 244: cursoJSF

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>

Page 245: cursoJSF

Curso JavaServer Faces 245

Dicas

Componentes do MyFaces Tree

<t:tree2 value="TreeModel" var="String" varNodeToggler="String"> ...(anyComponent)...</t:tree2>

Page 246: cursoJSF

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>&#160;</f:verbatim> </f:facet> <h:column> <h:outputText value="#{state.abbr}"/> </h:column> <h:column> <h:outputText value="#{state.name}"/> </h:column></t:newspaperTable>

Page 247: cursoJSF

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>

Page 248: cursoJSF

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>

Page 249: cursoJSF

Curso JavaServer Faces 249

Dicas

Componentes do MyFaces Schedule

Page 250: cursoJSF

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>

Page 251: cursoJSF

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>

Page 252: cursoJSF

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>

Page 253: cursoJSF

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(); }

Page 254: cursoJSF

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; }

Page 255: cursoJSF

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) { }

Page 256: cursoJSF

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; } }

Page 257: cursoJSF

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; } }

Page 258: cursoJSF

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; } }

Page 259: cursoJSF

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);

Page 260: cursoJSF

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();

Page 261: cursoJSF

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; }

Page 262: cursoJSF

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...

Page 263: cursoJSF

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}" />

Page 264: cursoJSF

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();

Page 265: cursoJSF

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}" />

Page 266: cursoJSF

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