128
1 Curso JSF Integrando JSF, Ajax4Jsf, RichFaces e Facelets Instrutor: Fábio Henrique Barros

Curso JSF FA7

Embed Size (px)

Citation preview

Page 1: Curso JSF FA7

1

Curso JSFIntegrando JSF, Ajax4Jsf,

RichFaces e Facelets

Instrutor: Fábio Henrique Barros

Page 2: Curso JSF FA7

2

Conteúdo

Java Server Faces Introdução Gerenciando a Navegação Managed Beans JSF Expression Language Java Server Faces Standard Tags Modelo de Componentes Conversão e Validação Tratando Eventos Ciclo de Vida de uma Requisição PhaseListeners Ajax e JSF Usando componentes (JBoss Richfaces) Gerenciamento de Layout com Facelets

Page 3: Curso JSF FA7

3

JSF - Introdução

O que é o Java Server Faces Framework para simplificar o desenvolvimento de

aplicações WEB Baseado em Componentes Conjunto de componentes GUI para WEB Modelo orientado a eventos Ciclo de vida de requisição bem definido. O desenvolvedor não precisa se preocupar com

detalhes sobre HTTP Não é limitado a HTML Container IoC (provê injeção de dependências)

C

Page 4: Curso JSF FA7

4

JSF - Introdução

O que é o Java Server Faces (cont.)

O

Vantagens Componentes GUI personalizados POJOs (Plain Old Java Object ): Objeto sem herança nem implementa interfaces. Tratamento de Eventos Conversão e Validação Suporte a outras tecnologias de transporte e

apresentação Managed Beans Expression Language Configuração mais simples

Page 5: Curso JSF FA7

5

JSF - Introdução

Design MVC

Page 6: Curso JSF FA7

6

JSF - Introdução

Primeira Aplicação Bibliotecas (Sun RI)

B

jsf-api.jar jsf-impl.jar

j

jstl.jar Configurações

web.xml faces-config.xml

Páginas jsp, html, js, css, etc...

Page 7: Curso JSF FA7

7

JSF - Introdução

Criando um projeto JSF no Eclipse Passo I:

Criar no projeto do tipo Dynamic Web Project Preencher o nome do projeto: CursoJsf Configurar o servidor de aplicação: Tomcat 6.0

Passo II: Configurar as versões: Web=2.5, Java=6.0, JSF=1.2

Passo III: Configurar os parâmetros: root=cursojsf,

content=web, source=src Passo IV:

Configurar o mapeamento do JSF: “*.jsf”

Page 8: Curso JSF FA7

8

JSF - Introdução

Page 9: Curso JSF FA7

9

JSF - Introdução

Page 10: Curso JSF FA7

10

JSF - Introdução

Page 11: Curso JSF FA7

11

JSF - Introdução

Page 12: Curso JSF FA7

12

JSF - Introdução

Exemplo: web.xml<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>CursoJsf</display-name><welcome-file-list>

<welcome-file>default.jsp</welcome-file></welcome-file-list><!-- Java Server Faces --><servlet><servlet-name>Faces Servlet</servlet-name>

<servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup>

</servlet><servlet-mapping>

<servlet-name>Faces Servlet</servlet-name><url-pattern>*.jsf</url-pattern>

</servlet-mapping></web-app>

Page 13: Curso JSF FA7

13

JSF - Introdução

Exemplo: faces-config.xml<?xml version="1.0" encoding="UTF-8"?><faces-config xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"version="1.2">

<application><resource-bundle>

<base-name>SystemMessages</base-name><var>msg</var>

</resource-bundle><locale-config>

<default-locale>pt_BR</default-locale></locale-config>

</application></faces-config>

Page 14: Curso JSF FA7

14

JSF - Introdução

Exemplo: default.jsp<%@taglib uri="http://java.sun.com/jstl/core" prefix="c" %><c:redirect url="/index.jsf" />

Exemplo: index.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head>

<title> <h:outputText value="Página Inicial" />

</title></head><body>

<h:outputText value="Página Inicial" /></body></html></f:view>

Page 15: Curso JSF FA7

15

JSF - Gerenciando a Navegação

Fluxo da requisição:

Page 16: Curso JSF FA7

16

JSF - Gerenciando a Navegação

Gerenciando a Navegação Definida usando Regras de Navegação

Configurado no faces-config.xml <navigation-rule> <from-view-id>/login.jsp</from-view-id>(opcional) <navigation-case > <from-action>#{loginBean.login}</from-action>(opcional) <from-outcome>sucesso</from-outcome> <to-view-id>/index.jsp</to-view-id> <redirect/> (opcional) </navigation-case></navigation-rule>

Estática – Configurado na própria página Dinâmica – Saída de uma Action

Page 17: Curso JSF FA7

17

JSF - Gerenciando a Navegação

Exemplo: faces-config.xml...<!-- Navigation --><navigation-rule>

<navigation-case><from-outcome>index</from-outcome><to-view-id>/index.jsp</to-view-id><redirect />

</navigation-case></navigation-rule>

<navigation-rule><navigation-case>

<from-outcome>ajuda</from-outcome><to-view-id>/ajuda.jsp</to-view-id><redirect />

</navigation-case></navigation-rule>...

Page 18: Curso JSF FA7

18

JSF - Gerenciando a Navegação

Exemplo: index.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head>

<title><h:outputText value="Página Inicial" />

</title></head><body>

<h:form><h:commandLink action="ajuda" value="Página de ajuda" />

</h:form></body></html></f:view>

Page 19: Curso JSF FA7

19

JSF - Gerenciando a Navegação

Exemplo: ajuda.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head><title>

<h:outputText value="Página de Ajuda" /></title></head><body>

<h:form><h:outputText value="Texto da ajuda!" /><br /><h:commandButton action="index"

value=“Voltar" /></h:form>

</body></html></f:view>

Page 20: Curso JSF FA7

20

JSF - Gerenciando a Navegação

Exercício: Crie uma página de sobre, onde esta deverá

conter as informações do sistema e do autor Crie uma navegação da página de ajuda para a

página de sobre Crie uma navegação da página de sobre para a

página de ajuda

Page 21: Curso JSF FA7

21

JSF - Message Bundles

Message Bundles Centralizar mensagens em um único lugar Arquivo .properties do tipo chave=valor Suporte a mensagens com parâmetros Suporte a internacionalização

Page 22: Curso JSF FA7

22

JSF - Message Bundles

Configuração: SystemMessages.properties

#Page: indexpage.index.title=Página Inicialpage.index.link.ajuda=Visualizar ajuda!#Page: ajudapage.ajuda.title=Página de Ajudapage.ajuda.texto=Texto da ajuda!

faces-config.xml<faces-config> <!-- Configurações gerais do JSF -->

<resource-bundle> <base-name>SystemMessages</base-name> <var>msg</var> </resource-bundle> <locale-config> <default-locale>pt_BR</default-locale> </locale-config>

<faces-config>

Page 23: Curso JSF FA7

23

JSF - Message Bundles

Exemplo: index.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head>

<title><h:outputText value="#{msg['page.index.title']}" />

</title></head><body>

<h:form><h:commandLink action="ajuda"

value="#{msg['page.index.link.ajuda']}" /></h:form>

</body></html></f:view>

Page 24: Curso JSF FA7

24

JSF - Message Bundles

Exemplo: ajuda.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head><title>

<h:outputText value="#{msg['page.ajuda.title']}" /></title></head><body>

<h:form><h:outputText value="#{msg['page.ajuda.texto']}" /><br /><h:commandButton action="index"

value="#{msg['commons.voltar']}" /></h:form>

</body></html></f:view>

Page 25: Curso JSF FA7

25

JSF - Message Bundles

Exercício: Configure um Message Bundle. Altere todas as páginas criadas até agora para

usar somente o Message Bundle configurado.

A partir de agora, somente usaremosMessage Bundles

Page 26: Curso JSF FA7

26

JSF - Managed Beans

Managed Beans Usados para separação entre as lógicas de

negócio e de apresentação O que são Beans?

Definição de JavaBean : “a reusable software component that can be manipulated in a builder tool”

Construtor Vazio Propriedades privadas, acessadas por métodos get e

set (getXyz, setXyz)

s

Não é necessário herdar de nenhuma classe em especial (POJO)

e

No JSF também são chamados de backing beans Gerenciados pelo Framework

Page 27: Curso JSF FA7

27

JSF - Managed Beans

Managed Beans (cont.)

M

Definidos no faces-config.xml Nome, classe, propriedades e escopo Propriedades para os dados do Form Métodos Action (Controller)

M

Propriedades para valores de saída Associados a páginas WEB através da EL Instanciados e inicializados pelo Container

Page 28: Curso JSF FA7

28

JSF - Managed Beans

Exemplo: GuessNumberBean.javapublic class GuessNumberBean {

/** Numero a ser adivinado. */private Integer numero;/** Palpite do usuário. */private Integer palpite;/** Tentativas. */private Integer tentativas;/** Mensagem de erro. */private String mensagem;/* Gerar get e set. */public String init() {

numero = (int) (1 + (Math.random() * 100));palpite = null;mensagem = "page.guess.label.branco";return "guess";

}public String guess() {

if (palpite.equals(numero)) {mensagem = "page.guess.acerto";

} else if (numero.compareTo(palpite) < 0) {mensagem = "page.guess.menor";

} else {mensagem = "page.guess.maior";

}tentativas++;return "guess";

}}

Page 29: Curso JSF FA7

29

JSF - Managed Beans

Exemplo: faces-config.xml<faces-config> ... <!-- Managed Beans --> <managed-bean> <managed-bean-name>guessBean</managed-bean-name> <managed-bean-class> br.com.cursojsf.view.GuessNumberBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope> <managed-property> <property-name>tentativas</property-name> <value>0</value> </managed-property> </managed-bean> ... <navigation-rule> <navigation-case> <from-outcome>guess</from-outcome> <to-view-id>/guess.jsp</to-view-id> <redirect/> </navigation-case> </navigation-rule> ...</faces-config>

Page 30: Curso JSF FA7

30

JSF - Managed Beans

Exemplo: guess.jsp<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %><%@taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view><html><head>

<title><h:outputText value="#{msg['page.guess.title']}" />

</title></head><body>

<h:form id="guessForm"><h:commandLink id="link" action="#{guessBean.init}“

value="#{msg['page.guess.label.iniciar']}" /><br/><br/><h:outputLabel for="palpite" value="#{msg['page.guess.label.numero']}: " /><h:inputText id="palpite" value="#{guessBean.palpite}" /><h:commandButton value="#{msg['page.guess.label.enviar']}“

action="#{guessBean.guess}" /><br/><br/><h:outputFormat id="outtext" value="#{msg[guessBean.mensagem]}" styleClass="error">

<f:param value="#{guessBean.tentativas}" /></h:outputFormat><hr/><h:commandButton action="index" value="#{msg['commons.voltar']}" />

</h:form></body></html></f:view>

Page 31: Curso JSF FA7

31

JSF - Managed Beans

Ciclo de uma requisição:

Page 32: Curso JSF FA7

32

JSF - Managed Beans

Exercício: Construir a página “Adivinhe o número”

Page 33: Curso JSF FA7

33

JSF - JSF Expression Language

JSF Expression Language Bastante semelhante a EL JSP 2.0

Forma de uso: #{blah} Usado nas páginas e no faces-config.xml (DI)

U

Fácil acesso as propriedades de um bean #{loginBean.email}, #{loginBean.senha}, #{usuarioBean.usuario.nome}, #{usuarioBean.usuario.endereco.logradouro}

Acesso a objetos implícitos (session, request, application)

A

Acesso a propriedades e métodos dos beans Acesso simples a elementos de uma coleção Suporte a operadores (or, and, eq, lt, gt, +, -, etc)

S

Page 34: Curso JSF FA7

34

JSF - JSF Standard Tags

JSF Standard Tags Disponibilizadas pelo JSF Componentes Base para desenvolvimento Duas bibliotecas: html e core (43 tags no total)

D

São taglibs (importadas através da diretiva taglib)

S

<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> <%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %>

Page 35: Curso JSF FA7

35

JSF - JSF Standard Tags

Biblioteca core Serve como suporte para html (e outras)

S

Toda página de ter um <f:view> Raiz da árvore de componentes

Tag <f:loadBundle> usada para carregar arquivo .properties

Na versão 1.2 não é mais necessário declarar A maioria das tags representam objetos a serem

adicionados a componentes Atributos, Listeners, Converters, Validators, Facets,

Parametros, Select Items

Page 36: Curso JSF FA7

36

JSF - JSF Standard Tags

Biblioteca Html Biblioteca de componentes Html

Componentes para entrada e saída de dados Outros: forms, mensagens, componentes de layout

Tags da lib html form, inputText, inputTextArea, inputSecret, inputHidden, outputLabel, outputLink, outputFormat, outputText, commandButton, commandLink, message, messages, graphicImage, selectOneListBox, selectOneMenu, selectOneRadio, selectBooleanCheckbox, SelectManyCheckbox, SelectManyListbox, SelectManyMenu, panelGrid, panelGroup, dataTable, column

Page 37: Curso JSF FA7

37

JSF - JSF Standard Tags

Biblioteca html Categorias

Input (input...)

)

Output (output...)

)

Comandos ou actions (commandButton, commandLink)

)

Seleção (checkbox, listbox, menu, radio)

)

Layout (panelGrid, panelGroup)

)

Data Table (dataTable)

)

Erros e Mensagens (message, messages)

)

Page 38: Curso JSF FA7

38

JSF - JSF Standard Tags

Biblioteca html Atributos Comuns a todos

HTML 4.0 (accesskey, lang, dir, etc) e eventos DHTML (onclick, onmouseover, onchange, etc)

id – Identificador para o componente binding – Usado para referenciar componente em um

backing bean rendered – Booleano indicando se o componente será

mostrado styleClass – Nome da classe CSS

Page 39: Curso JSF FA7

39

JSF - JSF Standard Tags

Biblioteca html Outros Atributos

value – Valor do componente (I, O, C)

v

valueChangeListener – Método que responde a uma mudança no valor do componente (I)

m

converter – Conversor associado ao componente (I, O)

c

validator – Validador associado ao componente (I)

v

required – Booleano indicando se o campo é obrigatório (I)

o

Page 40: Curso JSF FA7

40

JSF - JSF Standard Tags

Biblioteca html - IDs e Bindings IDs

Permite acessar elementos HTML através de javascript Permite referenciar componentes em outras tags<h:inputText id="nomeUsuario" value="#{usuarioBean.nome}" /><h:message for="nomeUsuario" errorStyle="color: #FF0000;" />

Permite referencia componentes no código JavaFacesContext context = FacesContext.getCurrentInstance();UIComponent nome =

context.getViewRoot().findComponent("nomeUsuario");

Page 41: Curso JSF FA7

41

JSF - JSF Standard Tags

Biblioteca html - IDs e Bindings Bindings “Liga” o componente a uma propriedade do backing bean <h:inputText id="palpite" value="#{guessBean.palpite}"

binding="#{guessBean.palpiteInput}" />/** * Input do palpite. */private UIInput palpiteInput;public UIInput getPalpiteInput() { return palpiteInput;

}

public void setPalpiteInput(UIInput palpiteInput) { this.palpiteInput = palpiteInput;

}

Page 42: Curso JSF FA7

42

JSF - JSF Standard Tags

Exemplo: GuessNumberBean.javapublic String init() {

numero = (int) (1 + (Math.random() * 100));palpite = null;mensagem = "page.guess.label.branco";if (palpiteInput != null) {

palpiteInput.setRendered(true);}return "guess";

}public String guess() {

if (palpite.equals(numero)) {mensagem = "page.guess.acerto";palpiteInput.setRendered(false);} else if (numero.compareTo(palpite) < 0) {

mensagem = "page.guess.menor";} else {

mensagem = "page.guess.maior";}tentativas++;return "guess";

}

Page 43: Curso JSF FA7

43

JSF - JSF Standard Tags

Exercício: Alterar a página “guess.jsp” e o bean

“GuessNumberBean.java” para contemplar o binding.

Page 44: Curso JSF FA7

44

JSF - JSF Standard Tags

DataTable Componente para mostrar dados de forma

tabular Renderiza a tag <table> do HTML Não é necessário Loops. É só usar Definição de Cabeçalho e Rodapé É configurável por CSS

headerClass – classe css para o cabeçalho footerClass – classe css para o rodapé rowClasses – classe para as linhas (lista separada por

vírgula)

Page 45: Curso JSF FA7

45

JSF - JSF Standard Tags

Exemplo: usuarios.jsp<%@ page language="java" contentType="text/html; charset=ISO-8859-1“

pageEncoding="ISO-8859-1"%><%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%><%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%><f:view><html><head>

<title><h:outputText value="#{msg['page.usuarios.title']}" /></title></head><body><h:form> <h:dataTable value="#{usuarioBean.listaUsuarios}" var="usuario“ border="1" cellspacing="0" cellpadding="2"> <h:column> <f:facet name="header"> <h:outputText value="#{msg['page.usuarios.label.cpf']}" /> </f:facet> <h:outputText value="#{usuario.cpf}" /> </h:column>...

Page 46: Curso JSF FA7

46

JSF - JSF Standard Tags

Exemplo: usuarios.jsp (cont.) <h:column> <f:facet name="header"> <h:outputText value="#{msg['page.usuarios.label.nomeReduzido']}" /> </f:facet> <h:outputText value="#{usuario.nomeReduzido}" /> </h:column> <h:column> <f:facet name="header"> <h:outputText value="#{msg['page.usuarios.label.email']}" /> </f:facet> <h:outputLink value="mailto:#{usuario.email}"> <h:outputText value="#{usuario.email}" /> </h:outputLink> </h:column> <h:column> <f:facet name="header"> <h:outputText value="#{msg['page.usuarios.label.dataNascimento']}" /> </f:facet> <h:outputText value="#{usuario.dataNascimento}" /> </h:column>...

Page 47: Curso JSF FA7

47

JSF - JSF Standard Tags

Exemplo: usuarios.jsp (cont.) </h:dataTable> <hr/> <h:commandButton action="index" value="#{msg['commons.voltar']}" /></h:form></body></html></f:view>

Page 48: Curso JSF FA7

48

JSF - JSF Standard Tags

Exemplo: UsuarioBean.javapublic class UsuarioBean { /** Referencia para a camada de regras de negocio */ private UsuarioBusiness usuarioBusiness; /** Usuario a serusado no form. */ private Usuario usuario = new Usuario(); /** Armazena o usuario logado apos a autenticacao */ private Usuario usuarioLogado;

/* Gerar gets e sets */

public List<Usuario> getListaUsuarios() { return usuarioBusiness.selecionarTodos(); }}

Page 49: Curso JSF FA7

49

JSF - JSF Standard Tags

Exemplo: faces-config.xml<managed-bean> <managed-bean-name>usuarioDao</managed-bean-name> <managed-bean-class>br.com.cursojsf.dao.impl.UsuarioDaoImpl</managed-bean-class> <managed-bean-scope>application</managed-bean-scope></managed-bean><managed-bean> <managed-bean-name>usuarioBusiness</managed-bean-name> <managed-bean-class>br.com.cursojsf.business.impl.UsuarioBusinessImpl</managed-bean-class> <managed-bean-scope>application</managed-bean-scope> <managed-property> <property-name>usuarioDao</property-name> <value>#{usuarioDao}</value> </managed-property></managed-bean>

Page 50: Curso JSF FA7

50

JSF - JSF Standard Tags

Exemplo: faces-config.xml (cont.)<managed-bean> <managed-bean-name>usuarioBean</managed-bean-name> <managed-bean-

class>br.com.cursojsf.view.UsuarioBean</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>usuarioBusiness</property-name> <value>#{usuarioBusiness}</value> </managed-property></managed-bean><navigation-rule> <navigation-case> <from-outcome>usuarios</from-outcome> <to-view-id>/usuarios.jsp</to-view-id> </navigation-case></navigation-rule>

Page 51: Curso JSF FA7

51

JSF - JSF Standard Tags

Exercício: Construa a consulta de usuários Construa o cadastro de usuários

Página de consulta deve ter: Um link para edição Botão para adicionar um novo usuário Botão para excluir usuário

Página de edição deve ter: Form para alterar/incluir usuário

Veja os exemplos a seguir

Page 52: Curso JSF FA7

52

JSF - JSF Standard Tags

Exemplo: usuarios.jsp...<h:commandLink action="usuariosEditar"> <h:outputText value="#{usuario.cpf}" /> <f:setPropertyActionListener target="#{usuarioBean.usuario}" value="#{usuario}"/> </h:commandLink><h:column> <f:facet name="header"> <h:outputText value="#{msg['commons.excluir']}" /> </f:facet> <h:commandButton action="#{usuarioBean.excluir}" value="#{msg['commons.excluir']}"> <f:setPropertyActionListener target="#{usuarioBean.usuario}" value="#{usuario}"/> </h:commandButton></h:column>...<h:commandButton action="#{usuarioBean.novo}" value="#{msg['commons.novo']}" />

Page 53: Curso JSF FA7

53

JSF - JSF Standard Tags

Exemplo: usuariosEditar.jsp<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%><%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%><f:view><html><head> <title><h:outputText value="#{msg['page.usuarios.title']}" /></title></head><body> <h:form id="usuarioForm"> <h:panelGrid columns="2"> <h:outputLabel for="idInput" value="#{msg['page.usuarios.label.id']}:" /> <h:inputText id="idInput" value="#{usuarioBean.usuario.id}" /> <h:outputLabel for="cpfInput" value="#{msg['page.usuarios.label.cpf']}:"/> <h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}" /> <h:outputLabel for="nomeReduzidoInput" value="#{msg['page.usuarios.label.nomeReduzido']}:" /> <h:inputText id="nomeReduzidoInput" value="#{usuarioBean.usuario.nomeReduzido}" />

Page 54: Curso JSF FA7

54

JSF - JSF Standard Tags

Exemplo: usuariosEditar.jsp <h:outputLabel for="nomeCompletoInput" value="#{msg['page.usuarios.label.nomeCompleto']}:" /> <h:inputTextarea id="nomeCompletoInput" value="#{usuarioBean.usuario.nomeCompleto}" rows="5" cols="20"/> <h:outputLabel for="emailInput" value="#{msg['page.usuarios.label.email']}:" /> <h:inputText id="emailInput" value="#{usuarioBean.usuario.email}" /> <h:outputLabel for="senhaInput" value="#{msg['page.usuarios.label.senha']}:" /> <h:inputText id="senhaInput" value="#{usuarioBean.usuario.senha}" /> </h:panelGrid> <hr/> <h:commandButton action="#{usuarioBean.salvar}" value="#{msg['commons.salvar']}" /> <h:commandButton action="usuarios" value="#{msg['commons.voltar']}" /> </h:form></body></html></f:view>

Page 55: Curso JSF FA7

55

JSF - JSF Standard Tags

Exemplo: faces-config.xml<navigation-rule> <navigation-case> <from-outcome>usuariosEditar</from-outcome> <to-view-id>/usuariosEditar.jsp</to-view-id> </navigation-case></navigation-rule> Exemplo: UsuarioBean.javapublic String novo() { usuario = new Usuario(); return "usuariosEditar";}public String salvar() { usuarioBusiness.salvarUsuario(usuario); return "usuarios";}public String excluir() { usuarioBusiness.excluirUsuario(usuario); return "usuarios";}

Page 56: Curso JSF FA7

56

JSF - JSF Standard Tags

Recursos de implementação JSP: <f:setPropertyActionListener>

Carrega propriedade de um Managed Bean Destino: target="#{usuarioBean.usuario}“ Origem: value="#{usuario}"

Faces-config.xml: <redirect /> Envia comando http para o browser efetuar nova

requisição para a página desejada Não deve ser usada em conjunto com beans que estão

em escopo de request Como o browser faz nova requisição, apenas os objetos que

estão na sessão estarão visíveis.

Page 57: Curso JSF FA7

57

JSF - Modelo de Componentes

O que são componentes UI? Idioma bem definido para projeto de UIs São elementos configuráveis e reutilizáveis que

compõem a interface da aplicações JSF Podem ser simples, como um botão, ou

composto, como uma tabela, de múltiplos componentes

Extensíveis através de composição e herança São acessados através tags JSP

Page 58: Curso JSF FA7

58

JSF - Modelo de Componentes

Page 59: Curso JSF FA7

59

JSF - Modelo de Componentes

Modelo de Componentes Conjunto de classes javax.faces.component.UIComponent especificando o estado e o comportamento dos componentes UI

Modelo de Renderização. Define como renderizar (“mostrar”) os componentes de diferentes maneiras

Modelo de Eventos e Listeners que define como tratar os eventos dos componentes

Modelo de conversão que define como diferentes conversores são “plugados” nos componentes

Modelo de validação que define como registrar validadores em um componente

Page 60: Curso JSF FA7

60

JSF - Modelo de Componentes

Modelo de Componentes UIComponent Classes

Define a funcionalidade do componente (comportamento e estado)

(

JSF provê um conjunto de classes UIComponent. É possível estender essas classes para criar componentes personalizados

A maioria dos componentes podem ser mostrados de formas diferentes (ex. commandButton e commandLink)

c

UICommand, UIForm, UIGraphic, UIInput, UISelectBoolean, UISelectMany, UISelectOne, etc

Page 61: Curso JSF FA7

61

JSF - Modelo de Componentes

Modelo de Componentes Modelo de Renderização – RenderKit

A renderização é manipulado pelo Render Kit, não pelo componente em si

O Render Kit define como componentes serão mostrados para um cliente em particular

A implementação do JSF inclui um Render Kit para clientes HTML 4.01

Os Render Kits podem usar um look and feel (skin)

O

Podem ser específicos para um plataforma (celular, PC) ou linguagem de marcação (HTML, WML, SVG, etc)

e

Podem ser mudados “on the fly”

Page 62: Curso JSF FA7

62

JSF - Modelo de Componentes

Modelo de Componentes Modelo de Renderização – Renderer Object

Definir o comportamento de um componente uma vez, e criar vários renderizadores (commandButton e commandLink)

c

Para cada componente que o Render Kit suporta, existe um conjunto de Renderer Objects

Define como um componente irá ser mostrado. O UISelectOne define três Renderer Objects diferentes

Combo Box Radio Button List Box

Page 63: Curso JSF FA7

63

JSF - Modelo de Componentes

FacesContext Contém todas as informações sobre estado

relacionadas ao processamento de uma única requisição

É passado para, e potencialmente modificado por, cada fase do ciclo de vida da requisição

Acessado através de el #{facesContext} ou nos Beans através do método FacesContext.getCurrentInstance()

F

Page 64: Curso JSF FA7

64

JSF - Modelo de Componentes

Exemplo: FacesContextpublic String autenticar() { try { usuarioLogado = usuarioBusiness.autenticarUsuario( usuario.getCpf(), usuario.getSenha()); return "principal"; } catch (UsuarioInvalidoException e) { FacesMessage message = new FacesMessage(); message.setSeverity(FacesMessage.SEVERITY_ERROR); message.setDetail("Usuário ou senha inválidos!"); FacesContext.getCurrentInstance() .addMessage("loginForm", message); return null; }}

Page 65: Curso JSF FA7

65

JSF - Conversão e Validação

Conversão e Validação – Converters Em aplicações WEB os dados enviados do cliente

são sempre Strings Java é uma linguagem tipada Precisamos converter os dados enviados JSF provê Conversores para todos os tipos

básicos do Java (Date, Integer, Double, Long)

b

Convertem o valor dos componentes de e para string

Aplicam formatação ou internacionalização Podemos definir novos conversores e associar aos

componentes

Page 66: Curso JSF FA7

66

JSF - Conversão e Validação

Exemplo: corverters<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %><%@ taglib prefix="f" uri="http://java.sun.com/jsf/core" %><f:view>...<h:form> ... <h:outputText value="#{msg['page.usuarios.cpf']}" /> <h:inputText id="ganhosUsuario" value="#{usuarioBean.usuario.ganhos}"> <f:convertNumber type="currency"/> </h:inputText> <h:message for="ganhosUsuario" /> <h:outputText value="#{msg['page.usuarios.cpf']}" /> <h:inputText id="cpfUsuario" value="#{usuarioBean.usuario.cpf}" converter="converters.CpfConverter" /> <h:message for="cpfUsuario" /> <h:outputText value="#{msg['page.usuarios.dataNascimento']}" /> <h:inputText id="dataNascimentoUsuario" value="#{usuarioBean.usuario.dataNascimento}"> <f:convertDateTime pattern="dd/MM/yyyy"/> </h:inputText> <h:message for="dataNascimentoUsuario" /> ...</h:form></body></html></f:view>

Page 67: Curso JSF FA7

67

JSF - Conversão e Validação

Conversão e Validação – Converters É possível definir Converters Implementar Interface javax.faces.convert.Converter

Métodos getAsString e getAsObject Registrar o converter no faces-config.xml.

Reutilizar em várias partes da aplicação Defini-se um id para o converter Associa o converter a uma classe . Todas as instâncias

dessa classe utilizaram esse converter (<converter-for-class>)

)

Associar ao componente desejado

Page 68: Curso JSF FA7

68

JSF - Conversão e Validação

Exemplo: CpfConverter.javapublic class CpfConverter implements Converter { public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException { if (value != null && !value.equals("")) { String cpf = value.replaceAll("\\.", "").replaceAll("\\-", ""); try { // Testa se somente existem numeros. Long.valueOf(cpf); return cpf; } catch (NumberFormatException e) { FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro de conversão", "Não foi possível converter o valor para um

cpf"); throw new ConverterException(message); } } return value; } public String getAsString(FacesContext context, UIComponent component, Object value) throws ConverterException { String cpf = (value == null? null: value.toString()); if (cpf != null && !cpf.equals("") { cpf = cpf.substring(0, 3) + "." + cpf.substring(3, 6) + "." + cpf.substring(6, 9) + "-" + cpf.substring(9); } return cpf; }}

Page 69: Curso JSF FA7

69

JSF - Conversão e Validação

Exemplo: faces-config.xml<faces-config> ... <converter> <converter-id>converters.CpfConverter</converter-id> <converter-class> br.com.cursojsf.view.converters.CpfConverter </converter-class> </converter> ...</faces-config> Exemplo: usuariosEditar.jsp<h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}" converter="converters.CpfConverter" />

ou<h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}"> <f:converter converterId="converters.CpfConverter" /></h:inputText>

Page 70: Curso JSF FA7

70

JSF - Conversão e Validação

Conversão e Validação – Validators Tarefa que praticamente toda aplicação web precisa

Verifica se todos os campos obrigatórios foram preenchido corretamente

Mostrar página novamente se ocorrer algum problema Para campos obrigatórios o JSF provê o atributo required Provê também validação básicas (domínio e tamanho)

P

<f:validateDoubleRange maximum="1" minimum="2"/> <f:validateLongRange maximum="1" minimum="2"/> <f:validateLength maximum="3" minimum="3"/>

Podemos definir nosso próprio Validator Por default não suporta validação do lado do cliente :-(

Page 71: Curso JSF FA7

71

JSF - Conversão e Validação

Exemplo: validators<h:outputText value="#{msg['page.usuarios.nome']}: " /><h:inputText id="nomeUsuario" value="#{usuarioBean.usuario.nome}" required="true"> <f:validateLength minimum="5"/></h:inputText><h:message for="nomeUsuario" errorClass="erro" /><h:outputText value="#{msg['page.usuarios.dependentes']}: " /><h:inputSecret id="numeroDependentesUsuario" value="#{usuarioBean.usuario.numeroDependentes}"> <f:validateLongRange maximum="3"/></h:inputSecret><h:message for="senhaUsuario" errorClass="erro" /><h:outputText value="#{msg['page.usuarios.senha']}: " /><h:inputSecret id="senhaUsuario" value="#{usuarioBean.usuario.senha}" required="true"> <f:validateLength minimum="6" maximum="10"/></h:inputSecret><h:message for="senhaUsuario" errorClass="erro" />

Page 72: Curso JSF FA7

72

JSF - Conversão e Validação

Exemplo: usuarioEditar.jsp<h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}" required="true">

Dica: Como exibir asmensagens em Português Brasil? Veja o conteúdo da biblioteca

de implementação do JSF (jsf-impl-?.?_??.jar) Abra o arquivo Messages.properties Salve-o no pacote “javax.faces” no “src” do seu projeto

com o nome de “Messages_pt_BR.properties” Edite o conteúdo do arquivo

Page 73: Curso JSF FA7

73

JSF - Conversão e Validação

Conversão e Validação – Validators Duas maneiras de implementar validação Implementar a interface javax.faces.validator.Validator

Criar a classe que será o Validador Registrar no faces-config.xml Associar aos componentes desejados

Usar um método do backing bean para validação Método deve seguir a segunda assinatura:void validaCpf(FacesContext ctx, UIComponent comp, Object value) throws ValidatorException

Associar ao componente usando el:<h:inputText id="cpfUsuario" value="#{usuarioBean.usuario.cpf}" validator="#{usuarioBean.validaCpf}">

Page 74: Curso JSF FA7

74

JSF - Conversão e Validação

Exemplo: CpfValidator.javapublic class CpfValidator implements Validator { public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { if (value != null) { String valor = value.toString(); if (!ValidacaoHelper.validaCpf(valor)) { FacesMessage message = new FacesMessage(); message.setSeverity(FacesMessage.SEVERITY_ERROR); message.setSummary("Erro de Validação"); message.setDetail("CPF Inválido"); throw new ValidatorException(message); } } }}

Page 75: Curso JSF FA7

75

JSF - Conversão e Validação

Exemplo: faces-config.xml<faces-config> ... <validator> <validator-id>validators.CpfValidator</validator-id> <validator-class> br.com.cursojsf.view.validators.CpfValidator </validator-class> </validator> ...</faces-config> Exemplo: usuariosEditar.jsp<h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}" required="true"> <f:validator validatorId="validators.CpfValidator" /></h:inputText>...<h:commandButton action="usuarios" value="#{msg['commons.voltar']}"

immediate="true" />

Page 76: Curso JSF FA7

76

JSF - Conversão e Validação

Atributo “immediate” Presente em <h:commandButton> e

<h:commandLink> Informa ao faces que este deve pular a fase de

ApplyRequetValues e Validation

Page 77: Curso JSF FA7

77

JSF - Tratando Eventos

Eventos e Listeners Usa o modelo de eventos JavaBean (semelhante

ao Swing)

a

Componentes criam eventos que são “consumidos” por Listeners

Listeners podem ser métodos de um backing bean ou uma classe uma classe separada

Quando o cliente ativa um componente (apertar um botão), um evento é disparado

Page 78: Curso JSF FA7

78

JSF - Tratando Eventos

Eventos e Listeners Duas variedades de eventos UI

Eventos que disparam processamento back-end Eventos que afetam apenas a forma da interface

Código para tratar esses eventos: action controllers e event listeners

Action Controllers (Action) lida com o envio completo do form

Disparados após preenchimento das propriedades do bean

Disparados após lógicas de validação Retorna Strings que afetam a navegação

Page 79: Curso JSF FA7

79

JSF - Tratando Eventos

Eventos e Listeners (cont.)

E

Event Listeners lidam com eventos da UI Geralmente são disparados antes do preenchimento

das propriedades do bean Geralmente pula a fase de validação Não afeta a navegação (continua na página atual)

N

Page 80: Curso JSF FA7

80

JSF - Tratando Eventos

Tipos de Listeners ActionListener

Disparados por commandButton ou commandLink <h:commandButton>,<h:commandLink>

Automaticamente envia o form ValueChangeListener

Disparados por combo boxes, checkboxes, radio buttons, textfields e outros

Não enviam o form automaticamente

Page 81: Curso JSF FA7

81

JSF - Tratando Eventos

Action Listeners Método de um backing bean ou classe separada

Método deve seguir a seguinte assinaturapublic void nomeDoMetodo(ActionEvent event)

Implementar interface javax.faces.event.ActionListenerpublic interface ActionListener extends FacesListener { void processAction(ActionEvent actionEvent) throws AbortProcessingException;}

Associar listener a um componente Caso seja uma classe<h:commandButton action="#{usuarioBean}"

value="Mostar/Esconder Ajuda" /> Caso seja um método<h:commandButton action="#{usuarioBean.mostraEsconderAjuda}" value="Mostar/Esconder Ajuda" />

Page 82: Curso JSF FA7

82

JSF - Tratando Eventos

ValueChangeListeners Método de um backing bean ou classe serparada

Método deve seguir a seguinte assinaturapublic void nomeDoMetodo(ValueChangeEvent event)

Implementar interface javax.faces.event.ValueChangeListenerpublic interface ValueChangeListener extends FacesListener { void processValueChange(ValueChangeEvent event) throws AbortProcessingException;}

Associar listener a um componente Caso seja uma classe<h:checkBox valueChangeListener="#{usuarioBean}" value="#{usuarioBean.mostrarAjuda}"

onclick="this.form.submit()" /> Caso seja um método<h:selectOneMenu

valueChangeListener="#{usuarioBean.mudarTipoRelatorio}" value="#{usuarioBean.tipoRelatorio}">

Page 83: Curso JSF FA7

83

JSF - Tratando Eventos

Exemplo: guess.jsp<h:inputText id="palpite" value="#{guessBean.palpite}" binding="#{guessBean.palpiteInput}" valueChangeListener="#{guessBean.onChange}" onblur="this.form.submit()"></h:inputText> GuessBean.java

public void onChange(ValueChangeEvent event) { if (event.getNewValue() == null) { mensagem = "page.guess.digiteNumero"; } else { mensagem = "page.guess.label.branco"; } }

Page 84: Curso JSF FA7

84

JSF - Ciclo de Vida da Requisição

Existem seis fases no ciclo de vida de um requisição 1. Restore view 2. Apply request values 3. Process validations 4. Update model values 5. Invoke application 6. Render response

Page 85: Curso JSF FA7

85

JSF - Ciclo de Vida da Requisição

Modelo de requisição:

Page 86: Curso JSF FA7

86

JSF - Ciclo de Vida da Requisição

1. Restore view O controlador examina a requisição que vem do

FacesServlet e extrai o “view ID”, que é determinado pelo nome da página JSP.

View State Restore Method Pode ser configurado no web.xml<context-param>

<param-name>javax.faces.STATE_SAVING_METHOD</param-name> <param-value>client</param-value> </context-param> Tem dois valores possíveis:

client = salva o estado no browser (menor consumo de memória e maior tráfego de rede)

server = salva o estado no servidor (maior consumo de memória e menor tráfego de rede)

Page 87: Curso JSF FA7

87

JSF - Ciclo de Vida da Requisição

2. Apply Request Values Cada componente deverá recuperar seu estado

corrente. Os valores das propriedades dos componentes

devem ser extraídas dos parâmetros do “request”, de “cookies” ou do “header” da requisição

Page 88: Curso JSF FA7

88

JSF - Ciclo de Vida da Requisição

3. Process Validation Cada componente (propriedade “value”) será validado de

acordo com as regras de validação definidas na aplicação As regras de validação são definidas através dos

“validators” Cada valor é então validado e caso seja inválido, uma

mensagem de erro é adicionada no FacesContext e o componente é marcado como inválido

Se um componente for marcado como inválido, o JSF pula para a fase “Render Response”

Caso nenhum componente esteja inválido o JSF passa para a próxima fase

Page 89: Curso JSF FA7

89

JSF - Ciclo de Vida da Requisição

4. Update Model Values Sua principal atividade é atribuir os valores

informados pelo usuário no formulário, para as respectivas propriedades associadas aos BackBeans (também conhecidos como Managed Beans)

Essa atribuição é feita utilizando o “converter” definido para o componente

Pode haver erro na conversão, fazendo com que o JSF dispare um erro de tempo de execução

Page 90: Curso JSF FA7

90

JSF - Ciclo de Vida da Requisição

5: Invoke application Nesta fase o controlador (controller) do JSF

chama o método associado no submit, disparando assim a camada de regras de negócio da aplicação

Todos os valores foram validados e carregados nas fases anteriores, por isso poderemos usá-los conforme necessitar.

Métodos ou outcomes carregados na propriedade “action” dos componentes

Page 91: Curso JSF FA7

91

JSF - Ciclo de Vida da Requisição

6.Render Response Fase responsável por montar a resposta onde

cada componente é processado e o resultado é unificado aos demais

Page 92: Curso JSF FA7

92

JSF - PhaseListeners

PhaseListeners São componentes capazes de escutar as fases do

ciclo de vida de uma requisição Devem implementar a interface

javax.faces.event.PhaseListener public void beforePhase(PhaseEvent event);

Determina o código que será executado antes entrar na fase public void afterPhase(PhaseEvent event);

Determina o código que será executado após concluir a fase public PhaseId getPhaseId()

Determina qual fase dverá ser escutada. Valores possíveis estão na classe “javax.faces.event.PhaseId”

Page 93: Curso JSF FA7

93

JSF - PhaseListeners

Exemplo: MyPhaseListener.javapublic class MyPhaseListener implements PhaseListener { private static final long serialVersionUID = 7700487457990644826L;

/** Metodo executado antes da fase. */ public void beforePhase(PhaseEvent event) { System.out.println("Antes da fase: " + event.getPhaseId()); } /** Metodo executado depois da fase. */ public void afterPhase(PhaseEvent event) { System.out.println("Depois da fase: " + event.getPhaseId()); } /** Metodo que indica qual fase sera "escutada". */ public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; }}

Page 94: Curso JSF FA7

94

JSF - PhaseListeners

Exemplo: faces-config.xml<faces-config>... <lifecycle> <phase-listener> br.com.cursojsf.view.listeners.MyPhaseListener </phase-listener> </lifecycle>...</faces-config>

Page 95: Curso JSF FA7

95

JSF - PhaseListeners

Exercício: Criar um PhaseListener para validação e

autenticação de usuário. Criar uma página de login e logout Criar as regras de navegação no faces-config.xml Criar método de autenticação no UsusarioBean

Page 96: Curso JSF FA7

96

JSF - PhaseListeners

Exemplo: LoginPhaseListener.javapublic class LoginPhaseListener implements PhaseListener { public void afterPhase(PhaseEvent event) { FacesContext context = event.getFacesContext(); String viewId = context.getViewRoot().getViewId(); UsuarioBean usuarioBean = (UsuarioBean) context.getApplication() .evaluateExpressionGet(context, "#{usuarioBean}", UsuarioBean.class); if (viewId.equals("/logout.jsp") || viewId.equals("/login.jsp")) { ExternalContext externalContext = context.getExternalContext(); HttpSession httpSession = (HttpSession) externalContext.getSession(false); httpSession.invalidate(); } else if (usuarioBean.getUsuarioLogado() == null) { navigateToView(context, "login"); } } private void navigateToView(FacesContext context, String view) { Application application = context.getApplication(); NavigationHandler navigationHandler = application.getNavigationHandler(); navigationHandler.handleNavigation(context, null, view); } public void beforePhase(PhaseEvent event) { /* nop */ }

public PhaseId getPhaseId() { return PhaseId.RESTORE_VIEW; }}

Page 97: Curso JSF FA7

97

JSF - PhaseListeners

Exemplo: faces-config.xml<faces-config>... <lifecycle> <phase-listener> br.com.cursojsf.view.listeners.LoginPhaseListener </phase-listener> </lifecycle>...</faces-config>

Page 98: Curso JSF FA7

98

JSF - PhaseListeners

Exemplo: login.jsp<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%><%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%><f:view><html><head><title><h:outputText value="#{msg['page.login.title']}" /></title></head><body> <div align="center"> <h1>Login</h1> <h:form id="loginForm"> <h:message for="loginForm" errorStyle="color: red;" /> <h:panelGrid columns="3"> <h:outputLabel for="cpfInput" value="#{msg['page.login.label.cpf']}:" /> <h:inputText id="cpfInput" value="#{usuarioBean.usuario.cpf}" maxlength="11" size="12" required="true" /> <h:message for="cpfInput" errorStyle="color: red;" /> <h:outputLabel for="senhaInput" value="#{msg['page.login.label.senha']}:" /> <h:inputSecret id="senhaInput" value="#{usuarioBean.usuario.senha}" maxlength="11" size="12" required="true" /> <h:message for="senhaInput" errorStyle="color: red;" /> </h:panelGrid> <h:commandButton action="#{usuarioBean.autenticar}" value="#{msg['page.login.label.entrar']}" /> </h:form> </div></body></html></f:view>

Page 99: Curso JSF FA7

99

JSF - PhaseListeners

Exemplo: logout.jsp<%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%><%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%><f:view><html><head> <title> <h:outputText value="#{msg['page.logout.title']}" /> </title></head><body> <h1><h:outputText value="#{msg['page.logout.title']}" /></h1> <h:outputText value="#{msg['page.logout.mensagem']}" /> <h:form> <h:commandLink value="#{msg['page.index.title']}" action="index" /> </h:form></body></html></f:view>

Page 100: Curso JSF FA7

100

JSF - PhaseListeners

Exemplo: faces-config.xml<faces-config> <managed-bean> <managed-bean-name>usuarioBean</managed-bean-name> <managed-bean-class>br...UsuarioBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> ... </managed-bean> <navigation-rule> <navigation-case> <from-outcome>login</from-outcome> <to-view-id>/login.jsp</to-view-id> <redirect /> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>logout</from-outcome> <to-view-id>/logout.jsp</to-view-id> <redirect /> </navigation-case> </navigation-rule></faces-config>

Page 101: Curso JSF FA7

101

JSF - PhaseListeners

Exemplo: UsuarioBean.javapublic class UsuarioBean {... public String autenticar() { try { usuarioLogado = usuarioBusiness.autenticarUsuario( usuario.getCpf(), usuario.getSenha()); return "index"; } catch (UsuarioInvalidoException e) { FacesMessage message = new FacesMessage(); message.setSeverity(FacesMessage.SEVERITY_ERROR); message.setDetail("Usuário ou senha inválidos!"); FacesContext.getCurrentInstance() .addMessage("loginForm", message); return null; } }}

Page 102: Curso JSF FA7

102

JSF – PhaseListeners

Exercício: Crie um BackBean capaz de alterar o idioma

corrente da aplicação. Altere a página inicial, adicionando um Combo

para chamar a alteração de idioma do bean criado.

Crie um Listener capaz perpetuar o idioma selecionada entre as requisições.

Veja os exemplos nos slides posteriores.

Page 103: Curso JSF FA7

103

JSF – PhaseListeners

Exemplo: LocaleBean.javapublic class LocaleBean { private static final List<SelectItem> LOCALES; static { LOCALES = new ArrayList<SelectItem>(2); LOCALES.add(new SelectItem("pt_BR", "Português")); LOCALES.add(new SelectItem("en", "English")); } private String locale = "pt_BR"; public String getLocale() { return locale; } public void setLocale(String locale) { this.locale = locale; } public List<SelectItem> getLocaleList() { return LOCALES; }

public void changeLocale(ValueChangeEvent event) { locale = event.getNewValue().toString(); FacesContext.getCurrentInstance().getViewRoot() .setLocale(new Locale(locale)); }}

Page 104: Curso JSF FA7

104

JSF – PhaseListeners

Exemplo: faces-config.xml<application> ... <locale-config> <default-locale>pt_BR</default-locale> <supported-locale>en</supported-locale> </locale-config></application><managed-bean> <managed-bean-name>localeBean</managed-bean-name> <managed-bean-class> br.com.cursojsf.view.LocaleBean </managed-bean-class> <managed-bean-scope>session</managed-bean-scope></managed-bean> Exemplo: index.jsp<h:selectOneMenu value="#{localeBean.locale}" valueChangeListener="#{localeBean.changeLocale}" onchange="this.form.submit()"> <f:selectItems value="#{localeBean.localeList}" /></h:selectOneMenu>

Page 105: Curso JSF FA7

105

JSF – PhaseListeners

Exemplo: LocalePhaseListener.javapublic class LocalePhaseListener implements PhaseListener { public void afterPhase(PhaseEvent event) {/* nop */}

public void beforePhase(PhaseEvent event) { FacesContext context = event.getFacesContext(); LocaleBean localeBean = (LocaleBean) context.getApplication().evaluateExpressionGet( context, "#{localeBean}", LocaleBean.class); context.getViewRoot().setLocale( new Locale(localeBean.getLocale())); }

public PhaseId getPhaseId() { return PhaseId.RENDER_RESPONSE; }}

Page 106: Curso JSF FA7

106

JSF – PhaseListeners

Exemplo: faces-config.xml...<lifecycle> <phase-listener> br.com.cursojsf.view.listeners.LocalePhaseListener </phase-listener> <phase-listener> br.com.cursojsf.view.listeners.LoginPhaseListener </phase-listener></lifecycle>...

Page 107: Curso JSF FA7

107

JSF – Exercício Desafio

Exercício: Crie um cadastro mestre-detalhe das entidades

“Estado” e “Cidade”. Veja nos slides posteriores, como o exercício

deve ficar.

Page 108: Curso JSF FA7

108

JSF – Exercício Desafio

inde

x.js

p

Page 109: Curso JSF FA7

109

JSF – Exercício Desafio

esta

dos.

jsp

Page 110: Curso JSF FA7

110

JSF – Exercício Desafio

esta

dosE

dita

r.js

p

Page 111: Curso JSF FA7

111

JSF – Exercício Desafio

cida

desE

dita

r.js

p

Page 112: Curso JSF FA7

112

JSF – Ajax4Jsf

Framework desenvolvido inicialmente pela Exadel e que mais tarde foi doado para a JBoss

Parte integrante do framework RichFaces Tem por objetivo adicionar suport a Ajax para

aplicações JSF. Extremamente fácil de utilizar

Page 113: Curso JSF FA7

113

JSF – Ajax4Jsf

Como configurar Copiar os arquivos "richfaces-api-?.?.?.jar" , "richfaces-

impl-?.?.?.jar" , "richfaces-ui-?.?.?.jar" para a pasta "WEB-INF/lib" da aplicação.

Adicionar o filtro no web.xml <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param>

Page 114: Curso JSF FA7

114

JSF – Ajax4Jsf

Como configurar (cont.) Importar a taglib na página que desejar <%@ taglib prefix="a4j" uri="http://richfaces.org/a4j" %> Utilizar as tags <a4j:commandButton> ,

<a4j:commandLink>, <a4j:poll> ou <a4j:support>

<h:inputText id="palpite" value="#{guessBean.palpite}" binding="#{guessBean.palpiteInput}" valueChangeListener="#{guessBean.onChange}"> <a4j:support event="onkeyup" reRender="outtext" /> </h:inputText>

Page 115: Curso JSF FA7

115

JSF – Ajax4Jsf

Como funciona: Adiciona suporte a chamada Ajax para Listeners

do JSF Atua sobre um evento JavaScript Re-renderiza um ou mais componentes (nomes

separados por “,”) <h:inputText id="palpite" value="#{guessBean.palpite}" binding="#{guessBean.palpiteInput}" valueChangeListener="#{guessBean.onChange}"> <a4j:support event="onkeyup" reRender="outtext" requestDelay="1000" /> </h:inputText> <h:outputFormat id="outtext" value="#{msg[guessBean.mensagem]}"> <f:param value="#{guessBean.tentativas}" /> </h:outputFormat>

Page 116: Curso JSF FA7

116

JSF – Ajax4Jsf

Principais atributos: event: evento JavaScript (“onkeyup”,

“onmouseover”, “onclick”, etc.) reRender: ID do(s) componente(s) a ser(em) re-

renderizado(s) após receber a resposta da chmada Ajax

requestDelay: usado para regular o número de chamadas Ajax, ou seja, o evento só poderá ser disparado após X milisegundos.

Page 117: Curso JSF FA7

117

JSF – Ajax4Jsf

Principais tags: <a4j:commandButton> e <a4j:commandLink>:

Usadas para enviar uma requisição Ajax no "onclick" Herdam de <h:commandButton> e

<h:commandLink> <a4j:poll>:

Usadas para enviar uma requisição Ajax através de um timer

<a4j:support>: Permite adicionar suporte a requisições Ajax para os

componentes padrões do JSF Permite disparar as requisições em eventos JavaScript

Page 118: Curso JSF FA7

118

JSF – Ajax4Jsf

Principais tags: (cont.) <a4j:status>

Permite executar ou exibir informações sobre o andamento da requisição

<a4j:status startText="Aguarde" stopText="Concluído" />

<a4j:status> <f:facet name="start"> <h:graphicImage value="ajax_process.gif" /> </f:facet> <f:facet name="stop"> <h:graphicImage value="ajax_stoped.gif" /> </f:facet></a4j:status>

<a4j:status startText="#{msg['commons.aguarde']}" stopText="#{msg['commons.concluido']}" />

Page 119: Curso JSF FA7

119

JSF – RichFaces

Framework desenvolvido inicialmente pela Exadel e que mais tarde foi doado para a JBoos

Tem por objetivo adicionar interfaces de usuário mais ricas com suporte a Ajax para aplicações JSF.

Extremamente fácil de utilizar Dezenas de componentes Muito bem documentado com exemplos

Page 120: Curso JSF FA7

120

JSF – RichFaces

Como configurar Copiar os arquivos "richfaces-api-?.?.?.jar" , "richfaces-

impl-?.?.?.jar" , "richfaces-ui-?.?.?.jar" para a pasta "WEB-INF/lib" da aplicação.

Adicionar o filtro no web.xml <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping> <context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> </context-param>

Page 121: Curso JSF FA7

121

JSF – RichFaces

Como configurar (cont.) Importar a taglib na página que desejar <%@ taglib prefix="rich" uri="http://richfaces.org/rich" %> Utilizar as tags:

<rich:panel header="#{msg['page.login.title']}"> ... </rich:panel> Exemplos em:

Page 122: Curso JSF FA7

122

JSF – Facelets

Introdução: A principal funcionalidade é auxiliar no gerenciamento de layout

Similar ao Tiles e SiteMesh, sendo mais parecido com o segundo Funcionalidades

Compatível JSF 1.1 e JSF 1.2, tanto Sun's RI e Apache MyFaces. Implementação rápida de Templates/Decorators para Components e

Páginas Habilidade de especificar a árvore de UIComponent em arquivos

separados (UICompositions) Relatório de erro preciso em nível de Linha/Tag/Atributo Suporte completo a EL, incluindo funções Validação de EL em tempo de Build Configuração independente de XML Atributo 'jsfc' reservado que permite escrever tags HTML (jwcid Tapestry)

(Exemplo: <input id="bar" type="text" jsfc="h:inputText" value="#{foo.bar}"/>)

Funciona com qualquer RenderKit API independente do Web Container

Page 123: Curso JSF FA7

123

JSF – Facelets

Como configurar: Copiar o arquivo "jsf-facelets-?.?.?.jar" para a pasta "WEB-INF/lib" da

aplicação. Adicionar parâmetros no web.xml <web-app> ... <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.jspx</param-value> </context-param> <context-param> <param-name>facelets.DEVELOPMENT</param-name> <param-value>true</param-value> </context-param> <context-param> <param-name>facelets.REFRESH_PERIOD</param-name> <param-value>1</param-value> </context-param> ... </web-app>

Page 124: Curso JSF FA7

124

JSF – Facelets

Como configurar: (cont.) Adicionar parâmetros no faces-config.xml

<faces-config> ... <application> ... <view-handler> com.sun.facelets.FaceletViewHandler </view-handler> ... </application> ...</faces-config>

Alterar as extenções das tags <to-view-id> para “*.jspx” no faces-config.xml

Renomear os arquivos citados nas tags <to-view-id> do faces-config.xml para “*.jspx”

Page 125: Curso JSF FA7

125

JSF – Facelets

Como configurar: (cont.) Criar um arquivo de template: /templates/padrao.jspx<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"xmlns:c="http://java.sun.com/jstl/core" xml:lang="pt" lang="pt-br"><f:view><head> <title> <h:outputText value=": #{msg['application.name']} - #{msg['application.version']} : "/> <ui:insert name="title" /> </title> <link href="styles/padrao.css" rel="stylesheet" type="text/css" /></head><body> <h3><ui:insert name="title" /></h3> <hr/> <ui:insert name="body" /></body></f:view></html>

Page 126: Curso JSF FA7

126

JSF – Facelets

Como configurar: (cont.) Altear todas as paginas para o seguinte formato:<?xml version="1.0" encoding="iso-8859-1" ?><jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:c="http://java.sun.com/jstl/core"><f:view><ui:composition template="/templates/padrao.jspx"> <ui:define name="title">#{msg['page.ajuda.title']}</ui:define> <ui:define name="body"> <h:form> <h:outputText value="#{msg['page.ajuda.texto']}" /><br /> <h:commandButton action="index" value="#{msg['commons.voltar']}" /> </h:form> </ui:define></ui:composition></f:view></jsp:root>

Page 127: Curso JSF FA7

127

JSF – Facelets

Como configurar: (cont.) Cuidado especial no LoginPhaseListener que

implementamos pois usamos “*.jsp” na implementação.

Page 128: Curso JSF FA7

128

JSF - Referências

The J2EE(TM) 1.5 Tutorial http://java.sun.com/j2ee/1.5/docs/tutorial/doc/

Core Servlets http://www.coreservlets.com/

Strecks (Java 6) http://strecks.sourceforge.net/

The Server Side http://www.theserverside.com/

IBM developerWorks http://www-128.ibm.com/developerworks