• Nenhum resultado encontrado

Introdução ao Java Server Faces

N/A
N/A
Protected

Academic year: 2021

Share "Introdução ao Java Server Faces"

Copied!
120
0
0

Texto

(1)

Introdução ao Java Server Faces

(2)

O que é Java Server Faces (JSF)?

É a especificação de um framework de

componentes para o desenvolvimento web

em Java, definido pela JCP.

JSF é baseado no padrão de projeto MVC

Programação através de componentes( o

controle é feito através de uma servlet

chamada Faces Servlet)

(3)
(4)

O que é Java Server Faces (JSF)?

Por ser uma especificação precisamos recorrer

a uma implementação do JSP:

– Mojarra – Implementação de referência.

http://javaserverfaces.java.net/

MyFaces da Apache

(5)

Histórico do Java Server Faces

Versão 1.0 (2004)

Desvantagens:

– Propunha situações que na prática não eram ideais

– Concorria com outros frameworks (Struts e Spring)

Vantagem:

– Era extensível

– Vários outros frameworks eram plugáveis a ele:

• Facelets • Ajax3jsf

(6)

Histórico do Java Server Faces

Versão 2.0 (2009)

Desvantagens:

– Integração custosa com frameworks de design

– Recursos limitados para sites responsivos

Vantagem:

– Nasceu de projetos reais

– Padrão de interfaces da especificação J2EE

Suporte a anotações e escopo de Beans

– Acrescentou diversos plugings

• Facelets • Ajax

(7)

Configuração do Ambiente

JDK (Java development kit -

versão 8.0 ou superior

)

Instalação do servidor Apache Tomcat

(versão 8.0

ou superior)

Eclipse

(Mars 4.5.0 ou superior)

Instalação do MySQL e o WorkBench

(8)

Configuração do Ambiente

Faça o download do zip de instalação do

servidor Apache Tomcat e descompacte a pasta.

Descompacte o arquivo em um diretório desejado Ex: c:\

(9)

Configuração do Ambiente

Crie as seguintes variáveis de sistema:

Indique o diretório de instalação do Java

Indique o diretório que o Tomcat foi

(10)

Configuração do Ambiente

Verifique se o servidor está executando

corretamente:

1. Execute o arquivo startup.bat dentro da pasta “bin” 2. Digite no browser o endereço http://localhost:8080

(11)

Configuração do Ambiente

Configurando o Tomcat no Eclipse:

1. Clique no menu: Windows > Preference 2. Siga os passos abaixo:

(12)
(13)
(14)

Configuração do Ambiente

3. Clique com o botão direito do mouse dentro da aba

(15)

Configuração do Ambiente

(16)

Configuração do Ambiente

Dê um duplo clique em cima do servidor criado e verifique se as configurações

(17)

Preliminares

• Uma aplicação JSF deve respeitar a

estrutura geral de uma aplicação web Java. Ou seja, deve seguir uma

estrutura mínima de pastas e arquivos.

• A Faces Servlet deve ser configurada no arquivo

WEB-INF/web.xml, indicando a classe que a implementa e o padrão de url que será associado a essa servlet.

• Devemos adicionar um arquivo chamado faces-config.xml no

diretório WEB-INF. Nesse arquivo,podemos alterar diversas configurações do JSF

(18)

Criando a primeira aplicação

1. Siga os passos do arquivo “Criando um projeto JSF passo a passo.pdf” disponibilizado no site do professor.

2. Adicione a aplicação no servidor:

2.a) Clique com o botão direito do mouse 2.b) Escolha a opção de adicionar e remover

(19)

3. Insira na caixa “Configured” a aplicação que será carregada no servidor e clique em Finish:

4. Depois “inicie” o servidor =>

5. No browser digite o endereço da aplicação:

http://localhost:8080/wteste1/index.xhtml

Publicando a primeira aplicação

Aplicação escolhida para ser publicada

(20)

Visualizando a primeira aplicação

Visualizamos uma página simples, mas o desenvolvimento passa a ser interessante quando associamos elementos Java através dos ManagedBeans...

(21)

Managed Beans

• São Java Beans que servem como canais entre a interface gráfica (a página) e o back-end da aplicação (regras de negócio, acesso ao banco de dados, etc).

Suas tarefas:

– Fornecer dados que serão exibidos nas telas. – Receber os dados enviados nas requisições.

– Executar tarefas de acordo com as ações dos usuários • Regras para a criação de um Managed Bean:

– Criar uma classe Java com a anotação @ManagedBean do pacote javax.faces.bean.

Definir o escopo do managedbean (request é o padrão). – Implementar a interface Serializable

– Ter um construtor sem parâmetro

(22)

Exemplo com Managed Bean

import java.io.Serializable;

import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped;

@ManagedBean(name="ola")

@RequestScoped

public class OlaMundo implements Serializable {

private static final long serialVersionUID = -4707094102414688584L; private String nome;

private String sobreNome; private String nomeCompleto; public OlaMundo() {

}

public void dizerOla(){

nomeCompleto = nome+" "+sobreNome; }

//get e o sets omitidos

A página xhtml referenciará a um objeto do tipo “OlaMundo” pelo nome “ola” e o

(23)

Exemplo com Managed Bean

...

<h:body> <h:form>

<h1>Olá #{ola.nomeCompleto} </h1>

Nome: <h:inputText value="#{ola.nome}"/> <br/>

Sobrenome: <h:inputText value="#{ola.sobreNome}"/> <br/>

<h:commandButton value="Dizer olá" action="#{ola.dizerOla}" /> </h:form>

</h:body> ...

Página primeiro.xhmtl inserida dentro do Diretório webapp

(24)
(25)

Estrutura geral de uma aplicação JSF

Restore View: Na primeira requisição de um usuário, uma

nova árvore de componentes que representa a tela desse usuário é gerada. Nas demais requisições (postback) desse

mesmo usuário, a árvore de componentes que representa a

tela anteriormente enviada a ele é reconstruída;

Apply Request Values: Nesta etapa, a árvore construída na

etapa anterior é percorrida e cada um dos seus componentes é “decodificado”. No processo de decodificação, cada

componente extrai da requisição atual os dados associados a essa componente e se atualiza com essas informações;

(26)

Estrutura geral de uma aplicação JSF

Process Validations: Nesta fase, os componentes que

possuem valores submetidos pelo usuário através de

formulários são convertidos e validados. Se ocorrer algum erro de conversão ou validação, mensagens de erro são adicionadas no contexto da requisição;

UpdateModel Values: Os valores contidos em cada

componente da árvore, já convertidos e validados na fase anterior, são armazenados em propriedades de objetos definidos pela aplicação (managed beans);

(27)

Estrutura geral de uma aplicação JSF

Invoke Application: Uma vez que os dados dos componentes

já foram convertidos, validados e armazenados nos objetos do modelo, as tarefas correspondentes ao evento que disparou a requisição (normalmente um clique em um botão ou link)

serão executadas.

Render Response: Nesta etapa, a próxima tela é gerada e

enviada ao navegador do usuário. Uma representação desta tela também é armazenada a fim de ser usada na fase Restore

(28)

Exemplo 2 com Managed Bean

import java.io.Serializable;

import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped;

@ManagedBean

public class Maiusculo implements Serializable {

private static final long serialVersionUID = -4707094102414688584L; private String texto;

public Miusculo() { }

public void converte(){

this.texto = this.texto.toUpperCase(); }

//get e o set omitidos

Por padrão: a página xhtml referenciará a um objeto do tipo “Maiusculo” pelo nome

“maiusculo” e o escopo desse objeto é de requisição

(29)

Exemplo 2 com Managed Bean

...

<h:body>

<h:form>

<h:outputText value="Entre com o texto: "/> <h:inputText value="#{maiusculo.texto}" />

<h:commandButton value="Enviar"

action="#{maiusculo.converte}" />

</h:form>

</h:body> ...

Página maiusculo.xhmtl inserida dentro do Diretório webapp

(30)

Exemplo 3 com Managed Bean

import java.io.Serializable;

import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped;

@ManagedBean

public class Aleatorio implements Serializable {

private static final long serialVersionUID = -4707094102414688584L; private int num;

private int numAleatorio; public Aleatorio() {

}

public void geraNumAleatorio(){

this.numAleatorio =

(int) (Math.random()*num); }

//get e o set omitidos

Por padrão: a página xhtml referenciará a um objeto do tipo “Aleatorio” pelo nome

“aleatorio” e o escopo desse objeto é de requisição

(31)

Exemplo 3 com Managed Bean

...

<h:body>

<h:form>

<h1>#{aleatorio.numAleatorio}</h1>

Nome: <h:inputText value="#{aleatorio.num}"/> <br/> <h:commandButton value="Gerar" action="#{aleatorio.geraNumAleatorio}" /> </h:form> </h:body> ...

Página aleatorio.xhmtl inserida dentro do Diretório webapp

(32)

Escopo do Managed bean

• O framework do JSF instanciará um objeto da classe

do managed bean. Todas as instâncias possuem um tempo de vida, que é definido pelo escopo

• Os escopos de managed beans JSF podem ser

definidos através de anotações do pacote javax.faces.bean:

– Request (padrão);

– View; – Session;

(33)

Escopo do Managed bean

• @RequestScoped (padrão): tem vida curta, começando quando é referenciado em uma única requisição HTTP e

(34)

Escopo do Managed bean

• @ViewScoped: a instância permanece ativa até que o usuário navegue para uma próxima página.

(35)

Escopo do Managed bean

• @SessionScoped: mantém a instância durante

diversas requisições e até mesmo navegações entre páginas, até que a sessão do usuário seja invalidada ou o tempo limite é

atingido. Cada usuário possui sua sessão de navegação, portanto, os objetos não são

compartilhados entre os usuários.

(36)

Escopo do Managed bean

• @ApplicationScoped: mantém a instância durante todo o tempo de execução da aplicação. É um escopo que

(37)

Exemplo de escopo

@ManagedBean @RequestScoped

public class Escopo implements Serializable{ private static final long serialVersionUID = 1L; private Carro carro = new Carro();

private List<Carro> carros = new ArrayList<>(); private String msg;

public Escopo() {

msg = "Criado em: "+

new SimpleDateFormat("dd/MM/yyyy HH:mm:ss:S").

format(new Date()); }

public void adicionaCarro(){

carros.add(carro); carro = new Carro(); }

// gets e sets omitidos

(38)

Exemplo de escopo

...

<h1> #{escopo.msg} </h1> <h:form>

<h:outputText value="Entre com a placa do carro: "/> <h:inputText value="#{escopo.carro.placa}" /><br/> <h:outputText value="Entre com a descricao: "/>

<h:inputText value="#{escopo.carro.descricao}" size="30" />

<h:commandButton value="Enviar" action="#{escopo.adicionaCarro}" /> </h:form>

<ol>

<ui:repeat var="c" value="#{escopo.carros}"> <li> #{c.placa} </li>

</ui:repeat> </ol>

...

Criando a visão: escopo.xhtml

O Componente “ui” é responsável por iterar um objeto do pacote

(39)

Exemplo de escopo

1) Insira dados sobre os carros e veja o que

acontece no escopo de requisição.

2) Altere o managed bean para o escopo de

sessão e veja se os dados são perdidos.

3) Em outro browser abra a aplicação e cadastre

mais carros e analise o resultado.

4) Mude o escopo para Application e veja como

o programa se comporta nos dois browsers.

5) Não esqueça de testar o escopo de visão

também. Saia da página e volte novamente

(40)

Navegação

Em JSF, navegação é um conjunto de regras

que define a próxima página a ser exibida

quando uma ação é executada pelo usuário.

Existem dois tipos básicos em JSF:

– Implícita

(41)

Navegação - Implícita

É uma string que será utilizada pelo tratador

de navegação do JSF para definir a próxima

tela que será apresentada ao usuário:

Nesse caso a página alvo seria “Ola.xhtml”

Obs: Além do nome, os outcomes também podem determinar o caminho do arquivo de resposta. Se o outcome começar com caractere “/”, esse caminho será definido a partir do diretório raiz da aplicação web . Caso contrário, será definido a partir do diretório atual.

(42)

Navegação – Implícita Dinâmica

Quando um action tem método como expressão,

o retorno do método deve ser o outcome da

navegação:

Quando o método retornar null, o usuário

permanecerá na mesma página

public String adicionar() { this.nomes.add(nome); if (this.nomes.size() > 3) { return "Ola"; } return null; }

(43)

Redirecionamento

Por padrão, uma requisição é despacha para

uma nova página. Se for necessário que seja

feito o redirecionamento, podemos passar o

parâmetro

faces-redirect=true

para o

outcome:

public String adicionar() { this.nomes.add(nome); if (this.nomes.size() > 3) { return "Ola?faces-redirect=true"; } return null; }

(44)

Navegação - Explícita

• As regras de navegação explícitas são declaradas no

arquivo faces-config.xml. Para declarar uma regra

explícita, precisamos informar o caminho da página de origem, um outcome com um nome qualquer e o

caminho da página de destino.

Página de origem

Página de destino

(45)

Navegação - Exercício

1. Crie uma pagina que tem a opção de lançar uma moeda (botão ou link). Caso o lançamento, que é feito de forma aleatória, seja “cara” o usuário será redirecionado para a página cara.xhtml, caso contrário ele será redirecionando para a página coroa.xhtml.

(46)

Componentes

• As páginas são definidas por componentes visuais,

criados através de tags. As principais bibliotecas de tags são:

Core: existe para dar suporte às outras bibliotecas, e não

possui componentes visuais. Aprenderemos esta biblioteca no decorrer do curso, sempre que for necessário

HTML: possui componentes que geram conteúdo visual,

como formulários, campos de entrada, rótulos de saída de textos, botões, links, seleções,painéis, tabela de dados, mensagens e etc.

Facelets: é a biblioteca para criação de templates de

páginas.

(47)

Componentes

• Para usar as bibliotecas, temos que importá-las

através dos namespaces correspondentes:

As bibliotecas de tags são nomeadas com os prefixos f, h, ui e composite.Os prefixos podem ser modificados,

(48)

Componentes

• A propriedade id está presente em quase todos os componentes. Ela nos permite identificar os

componentes da página para referência posterior, através de classes Java ou outros componentes JSF, além de poder acessar os elementos da HTML através de scripts.

• A propriedade binding pode ser especificada com uma expressão de ligação que referencia uma propriedade do bean a um tipo de componente.

(49)

Componentes

• A propriedade rendered controla a renderização do componente. Se o valor ou o resultado da expressão for false, o componente não será desenhado na tela.

• Com as propriedades style e styleClass utilizar estilos CSS (Cascade Style Sheet) em componentes de modo

inline ou usando classes CSS

(50)

Componentes

O componente <h:inputText> renderiza um campo de

entrada de texto simples. Exemplos:

<h: inputText value ="#{user.nome}" readonly =“true" id=“nome" />

<h: inputText value ="#{user.cep}" maxlength ="9" id=" cep" />

(51)

Componentes

O componente <h:inputSecret> renderiza um campo de

entrada de senha. Exemplos:

<h: inputSecret value ="#{user.senha}" id=“senha" />

(52)

Componentes

• O componente <h:inputTextarea> renderiza um

campo de entrada de textos maiores, que podem ter várias colunas e linhas:

<h: inputTextarea value ="Um texto de várias linhas " cols ="10" rows ="3" id=" texto "/>

<h:inputTextarea cols="40" rows="3”

value="#{cadastroUsuarioBean.resumoCurriculo}"/>

(53)

Componentes

• Com o componente <h:inputHidden> pode-se

adicionar informações que são submetidas

automaticamente quando um formulário é enviado sem que o usuário veja os dados :

<h: inputHidden id="curso-id" value ="#{cursosBean . curso.id}" />

(54)

Componentes

• O componente <h:outputText> renderiza textos simples na página:

<h:outputText value="Bem-vindo"/>

<h:outputText value="#{seguranca.userNameLogado}“ style="font-weight: bold" />

<h: outputText value =" Curso : #{curso.sigla} - #{curso . descricao}"/>

(55)

Componentes

• O componente <h:outputFormat> renderiza textos parametrizados na página. Os textos parametrizados são compostos por espaços reservados (placeholders): <h:outputFormat value="Oi {0}! Existem {1} tarefas

pendentes.">

<f:param value="#{tarefa.nomeUsuario}" />

<f:param value="#{tarefa.qtdeTarefasPendentes}" /> </h:outputFormat>

(56)

Componentes

• O componente <h:outputLabel> renderiza o elemento

<label> da HTML. Os componentes deste tipo são vinculados com outros através do atributo for. O uso deste componente é justificado para rotular campos de seus formulários:

<h:form id="frm">

<h:outputLabel value="Nome:" for="nomeInput" /> <h:inputText id="nomeInput" values=“ ”/>

</h:form>

(57)

Componentes

• O componente <h:graphicImage> renderiza o

elemento <img> da HTML, que exibe uma imagem na página.

• Este componente permite você usar o caminho

relativo ao contexto, ou seja, você não precisa

informar o caminho do contexto da aplicação, pois é colocado automaticamente.

<h:graphicImage value="/imagens/logo.png"

width="200" height="36"/>

O arquivo logo.png deve ser colocado em src/main/webapp/imagens Imagens

A partir da raiz da aplicação

(58)

Componentes

• todos os recursos web, como imagens, CSS e

JavaScript, podem ser colocados no diretório

src/main/webapp/resources.

Um subdiretório dentro de resources é considerado

como uma biblioteca (library) de recursos do projeto.

<h:graphicImage library=“imagens" name="logo.png” width="200" height="36"/>

Imagens

Outro forma seria:

(59)

Componentes

• O componente <h:selectOneMenu> renderiza um

menu de seleção única:

<h:selectOneMenu value="#{torcedor.timeFavorito}”> <f:selectItem itemValue=“Cruzeiro" />

<f:selectItem itemValue="Flamengo" /> </h:selectOneMenu>

<h:selectOneMenu value="#{torcedor.timeFavorito}”> <f:selectItem itemValue=“CR" itemLabel =“Cruzeiro”/> <f:selectItem itemValue="FL" itemLabel =“Flamengo”/> </h:selectOneMenu>

Caixas de Seleção

Atributo do tipo String no Managed bean

Para diferencia o valor salvo do valor exibido

(60)

Componentes

• Existem uma forma de inserir um item informativo que

não pode ser selecionado pelo usuário. Isso é feito da seguinte forma:

<h:selectOneMenu value="#{torcedor.timeFavorito}”>

<f:selectItem itemLabel =“Escolha um time"

noSelectionOption =“true"/>

<f:selectItem itemValue=“Cruzeiro" /> <f:selectItem itemValue="Flamengo" /> </h:selectOneMenu>

(61)

Componentes

• O componente <h:selectOneListbox> renderiza um

elemento de tamanho especificado para seleção de um item:

<h:selectOneListbox size="4“ value="#{torcedor.timeFavorito}”> <f:selectItem itemValue="Cruzeiro" /> <f:selectItem itemValue="Flamengo" /> <f:selectItem itemValue="Santos" /> <f:selectItem itemValue="Vasco" /> </h:selectOneListbox> Caixas de Seleção

Atributo do tipo String no Managed bean Quantidade de linhas exibidas

(62)

Componentes

• O componente <h:selectManyListbox> renderiza um

elemento de tamanho especificado para seleção de um ou mais itens:

<h:selectManyListbox size="4“ value="#{torcedor.times}”> <f:selectItem itemValue="Cruzeiro" /> <f:selectItem itemValue="Flamengo" /> <f:selectItem itemValue="Santos" /> <f:selectItem itemValue="Vasco" /> </h:selectManyListbox> Caixas de Seleção

Atributo do tipo String[] no Managed bean Quantidade de linhas exibidas

(63)

Componentes

• O componente <h:selectOneRadio> renderiza um

elemento do tipo radio para seleção de um item: <h:selectOneRadio layout="pageDirection">

<f:selectItem itemValue="M" itemLabel="Masculino" /> <f:selectItem itemValue="F" itemLabel="Feminino" /> </h:selectOneRadio>

• É possível alterar o layout com a propriedade layout

que recebe os valores pageDirection e lineDirection

(padrão)

(64)

Componentes

• O componente <h:selectManyCheckbox> renderiza um lista de checkboks para seleção de um ou mais item:

<h:selectManyCheckbox

layout="pageDirection“ value="{cadastro.assuntos}"> <f:selectItem itemValue="1" itemLabel="Java" />

<f:selectItem itemValue="3" itemLabel="Python" />

<f:selectItem itemValue="5" itemLabel="Métodos ágeis" /> </h:selectManyCheckbox>

• É possível alterar o layout com a propriedade layout que recebe os valores pageDirection e lineDirection (padrão) Botões de Seleção

(65)

Componentes

• Existem situações que precisamos que uma lista de itens seja obtida dinamicamente, para isso precisamos da tag

<f:selectItems> (no plural) :

<h:selectOneListbox size="5" value="#{cadastro.cidade}"> <f:selectItems value="#{cadastro.todasCidades}" /> </h:selectOneListbox>

<h:selectManyListbox value ="#{cadastro.siglasEscolhidas}"> <f:selectItems value ="#{cadastro.cursos}"

var =“curso" itemValue ="#{curso.sigla}" itemLabel ="#{curso.nome}" /> </h:selectManyListbox> Itens de Seleção Coleção de dados Coleção de dados

(66)

Componentes

• O componente <h:selectBooleanCheckbox> renderiza o

elemento do tipo checkbox. Use este componente para definir atributos booleanos:

<h:selectBooleanCheckbox id="aceite”

value="#{cadastro.termoAceito}"/> <h:outputLabel value="Li e aceito os termos e condições"

for="aceite"/>

(67)

Componentes

• O componente <h:commandButton> renderiza um

botão que pode ser do tipo do tipo submit (padrão), image ou reset e está relacionado a um formulário: <h:commandButton id="cadastrar" value="Cadastrar"

type="submit” action="#{cadastro.cadastrar}"/> <h:commandButton value="Limpar" type="reset"/>

<h:commandButton id="voltar" value="Voltar"

image="/imagens/voltar.png" action="home"/>

(68)

Componentes

• O componente <h:commandLink> renderiza um link e

está relacionado a um formulário:

<h:commandLink id="cadastrar" value="Cadastrar"

action="#{cadastro.cadastrar}"/>

<h:commandLink id="voltar" action="home">

<h:graphicImage value="/imagens/voltar.png" /> <h:outputText value="Voltar"/>

</h:commandLink>

(69)

Componentes

• Os componentes “command” apresentados nos slides

anteriores geram um requisição ao servidor. Caso precise de um link HTML utilize <h:outputLink>:

<h:outputLink value="http://www.algaworks.com" target="_blank"> <h:graphicImage library="algaworks" name="logo.png" /> </h:outputLink>

<h:outputLink value="http://www.algaworks.com" target="_blank"> <f:param name="codigo" value="931"/>

<f:param name="grupo" value="Java"/>

<h:graphicImage library="algaworks" name="logo.png" /> </h:outputLink>

Botões e links GET

(70)

Componentes

• Os componentes <h:button> e <h:link>, por sua vez,

são usados para realizar requisições através do método GET.

• O JSF utiliza o atributo outcome de um para definir a

página de destino nesses componentes.

<h:button value ="Lista de cursos" outcome ="lista-cursos" />

<h:link value ="Home" outcome ="home" />

Esses componentes não são utilizados para submeter formulários HTML.

(71)

Componentes

• O componente <h:panelGrid> é usado para organizar componentes em forma de uma grade.

<h:panelGrid columns="2"> <f:facet name="header">

<h:outputText value="Dados para cadastro" /> </f:facet> <h:outputText value="Nome:" /> <h:inputText size="20" /> <h:outputText value="E-mail:" /> <h:inputText size="40" /> <h:outputText /> <h:commandButton value="Cadastrar" /> </h:panelGrid> Painéis Quantidade de colunas Componentes inseridos da esquerda para a direita, e de cima para baixo

(72)

Componentes

• O componente <h:panelGroup> permite que diversos

componentes sejam tratados como um único componente:

<h: panelGroup >

<h:outputLabel value =“Carga horária :" for =“carga - horaria "/> <h:graphicImage library =“imagens" name =“relogio.png" />

</h: panelGroup >

Painéis

O label e a imagem foram tratados como um único elemento e inseridos na mesma

(73)

Componentes

• O componente <h:dataTable> gera uma tabela HTML

Tabelas

<h:dataTable value="#{livrosBean.livros}" var="livro" border="1" cellspacing="0" cellpadding="2">

<f:facet name="header"> Relação de livros favoritos </f:facet> <h:column> <f:facet name="header">Título</f:facet> <h:outputText value="#{livro.titulo}" /> </h:column> <h:column> <f:facet name="header">Autor</f:facet> <h:outputText value="#{livro.autor}" /> </h:column> </h:dataTable>

A tabela deve estar associada com uma coleção

É opcional a criação de um

(74)

Componentes

Tabelas – outro exemplo

<h:dataTable value="#{cursoBean.cursos}" var=“curso"> <h:column> <f:facet name="header">Sigla</f:facet> <h:outputText value="#{curso.sigla}" /> </h:column> <h:column> <f:facet name="header">Nome</f:facet> <h:outputText value="#{curso.nome}" /> </h:column> <h:column>

<f:facet name=“header">Adicionar turma </f:facet > <h:commandLink

value=“Adicionar turma"

action="#{ cursosBean.adicionarTurma(curso)}" /> </h:column>

(75)

Componentes

• Os sistemas devem exibir mensagens de sucesso,

erros, advertências e etc. O componente <h:messages> é responsável por exibir mensagens de feedback:

<h:messages/>

<h:messages globalOnly =“true" />

<h:messages showDetail="true" showSummary="true" errorStyle="color: red" infoStyle="color: green"

warnStyle="color: orange" fatalStyle="color: gray" />

(76)

Componentes

• Os managed beans que são responsáveis por adicionar

mensagens para serem exibidas na página de resposta:

public void cadastrar() {

FacesContext context = FacesContext.getCurrentInstance();

FacesMessage mensagem = new FacesMessage("Cadastro efetuado."); context.addMessage(null, mensagem);

} //ou

public void cadastrar() {

FacesContext context = FacesContext.getCurrentInstance(); FacesMessage mensagem = new FacesMessage(

FacesMessage.SEVERITY_INFO, "Cadastro efetuado.", "Cliente " + this.nome + " cadastrado com sucesso."); context.addMessage(null, mensagem); } Mensagens Um parâmetro Várias informações podem ser fornecidas

(77)

Componentes

• Os componentes <h:outputStylesheet> e

<h:outputScript> podem ser usados para adicionar arquivos CSS e JavaScript da bilioteca de recursos do projeto:

<h:body>

<h:outputStylesheet library=“ifmg" name="estilo.css" />

<h:outputScript library=“ifmg" name="script.js” target="head"/> </h:body> Adicionando JavaScript e CSS Arquivo: estilo.css body { background-color: yellow } Arquivo: script.js alert('Olá!');

(78)

Conversores

• Os conversores são

responsáveis por converter os valores de uma requisição

HTTP tipo String para o tipo correto na linguagem Java (ex: inteiro, data)

• Os valores locais são

atualizados no modelo (nos beans) apenas se todas as conversões e validações forem bem sucedidas.

(79)

Conversores

<f:convertNumber>

Exemplo 01:

<h:inputText size="12" value="#{calculadoraBean.valorA}">

<f:convertNumber minFractionDigits="2" maxFractionDigits="2"

locale="pt_BR" /> </h:inputText>

<h:outputText value="#{calculadoraBean.resultado}">

<f:convertNumber type="currency" locale="pt_BR" /> </h:outputText>

(80)

Conversores

<f:convertNumber>

Exemplo 02:

<h: outputText value ="#{testeBean.numero}" > <f: convertNumber pattern =“#0.000" />

</h: outputText >

<h: outputText value ="#{testeBean.numero}" > <f: convertNumber type =“percent" />

</h: outputText >

<h: outputText value ="#{ testeBean.numero }" >

<f: convertNumber locale =“pt_BR " type =“currency" /> </h: outputText >

(81)

Conversores

<f:convertDateTime>

Exemplo 01:

... <h:messages showDetail="true" showSummary="false" />

<h:inputText size="12" value="#{calculadoraDataBean.dataBase}"> <f:convertDateTime pattern="dd/MM/yyyy" />

</h:inputText> +

<h:inputText size="12" value="#{calculadoraDataBean.dias}" /> dias =

<h:outputText value="#{calculadoraDataBean.resultado}"> <f:convertDateTime dateStyle="full" locale="pt_BR"/> </h:outputText>

<br/>

<h:commandButton

value="Adicionar”action="#{calculadoraDataBean.adicionar}" />....

Personalizando Conversores Padrão Soma dias

(82)

Validadores

• Após a conversão, podemos verificar se os valores

obtidos respeitam determinadas restrições impostas pelas regras da aplicação. Ou seja, podemos validar os dados.

• Essa etapa como objetivo proteger o modelo contra

valores inválidos informados pelos usuários, evitando que fique em um estado inconsistente. O processo de validação ocorre após a conversão dos dados.

(83)

Validadores

<h: inputText value ="#{ testeBean .nome }"

id="campo-nome" required =“true"/>

<h: message for ="campo-nome"/> ou

<h: inputText value ="#{testeBean.nome}“ id="campo-nome"> <f:validateRequired />

</h:inputText >

<h:message for ="campo-nome"/>

(84)

Validadores

<h:inputText value ="#{testeBean.idade}" id="campo-idade">

<f:validateLongRange minimum="10" maximum=“130" />

</h:inputText >

<h:message for ="campo-idade"/> ou

<h:inputText value ="#{ testeBean.preco }" id="campo-preco">

<f:validateDoubleRange minimum =“20.57" maximum =“90.56" /> </h:inputText >

<h:message for ="campo-preco "/>

(85)

Validadores

<h:inputText value ="#{testeBean.nome}" id="campo-nome">

<f:validateLength minimum = "6" maximum = "20"/>

</h:inputText >

<h:message for="campo-nome"/> ou

<h:inputText value="#{testeBean.codigo}" id="campo-codigo"> <f:validateRegex pattern="[a-zA-Z]{6,20}"/>

</h:inputText>

<h:message for="campo-codigo"/>

Validadores padrão - Campo do tipo string

código tem pelo menos

6 e no máximo 20 caracteres, além de ser formada apenas por letras

(86)

Validadores

1. Crie uma página que deve receber o email, a data de nascimento e o nome do usuário, além de dois valores para serem somados.

2. Crie as seguintes validações:

– Nome deve ter entre 10 e 30 caracteres – Os valores devem ser entre 0 e 1000

– A data deve estar no formato dd/MM/yyyy

(87)

Criando o seu conversor

Os conversores que embutidos do JSF são úteis,

porém existem situações que é preciso criar um

conversor customizado;

Um conversor é uma classe que transforma

strings em objetos e objetos em strings

A implementação deve seguir os passos:

– criar uma classe que implementa a interface

javax.faces.convert.Converter

– Anote a classe com @FacesConverter

implementar os métodos getAsObject() e

(88)

Criando o seu conversor

• Imagine que você têm um bean que faz referência a um

objeto Telefone: .... .... Lembre-se que o http trafega strings ao invés de objetos

(89)

Criando o seu conversor

(90)

Criando o seu conversor

(91)

Criando o seu conversor

O método para converter de objeto para string :

O conversor será chamado de forma automática

quando um objeto do tipo Telefone for associado a um componente

(92)

Criando o seu validador

Da mesma forma que os conversores, validadores

pode ser customizados;

Um validar é uma classe que verifica se os valores

obedecem certas restrições

A implementação deve seguir os passos:

– criar uma classe que implementa a interface

javax.faces. validator. Validator

– Anote a classe com @FacesValidator

(93)
(94)

Criando o seu validador

Exemplo com passagem de parâmetros para o

(95)

Criando o seu validador

Chamando o validador sem parâmetros:

(96)

Conversores e Validadores

1. Crie uma página que deve receber o CPF do usuário. 2. Crie um conversor e um validador para esse CPF,

essa classe pode ter três atributos string, um para armazenar o número, os outros dois para

armazenar separadamente cada dígito verificador.

(97)

Eventos

• Aplicações JSF são fortemente baseadas em eventos.

Esses eventos podem ser gerados pelos usuários:

– Clique em um botão ou link.

– Troca da opção escolhida em uma caixa de seleção.

ou pelo próprio JSF:

– Inicialização da aplicação.

– Erro no processamento de uma requisição.

• Um evento pode ser associado a procedimentos. No

JSF, os eventos são divididos em três categorias:

FacesEvent, PhaseEvent e SystemEvent.

A princípio, vamos nos preocupar com essa

(98)

Eventos

Estes eventos são executados na fase Invocar a

aplicação do ciclo de vida JSF

• Os eventos podem ser listeners de ação ou

simplesmente ações

FacesEvent

Não contribui para a navegação das páginas, porém possui informações sobre o evento

Ações associadas a um

método público do tipo void ou String. Esse métodos

determinam a navegação das páginas. É como tratamos os eventos até o momento

(99)

Eventos

• Há dois tipos de listeners:

1. ActionEvent

2. ValueChangeEvent

Para criar um actionlistener, precisamos criar um método em um managed bean que recebe um objeto do tipo

javax.faces.event.ActionEvent

• Para os eventos de mudança de valor os métodos recebem um objeto do tipo javax.faces.event.ValueChangeEvent.

Use listener de ação se você quer executar algum código antes da lógica real do botão, como por exemplo, gerar log.

(100)

Eventos

No managed bean crie os métodos abaixo:

public void mudaTexto(ActionEvent e) {

UICommand c = (UICommand) e.getComponent(); c.setValue("Clicado");

c.getAttributes().put("style", "color:red;"); System.out.println("executou o listener"); }

public String clicar(){

System.out.println("executou o action"); nome = nome.toUpperCase(); return null; } Exemplo - actionListener import javax.faces.component.UICommand; import javax.faces.event.ActionEvent;

(101)

Eventos

No arquivo xhtml chame os métodos criados: Exemplo - actionListener

(102)

Eventos

Exemplo - changeListener

No mesmo arquivo xhtml do exemplo anterior adicionamos o evento de

alterações

No mesmo managed bean do exemplo anterior

implementamos o método do evento changelistener.

(103)

Eventos

1. Crie uma página com três botões. Um dos botões estará habilitado e os outros dois desabilitados. Quando o usuário pressionar o botão habilitado, a aplicação deve escolher aleatoriamente qual dos três botões estará habilitado da próxima vez e desabilitar os outros dois.

(104)

Eventos

• Por padrão, a conversão e a validação dos dados ocorrem no “Process Validation” e os listeners são executados no final dessa fase. Além disso os métodos de ação ocorrem na fase “Invoke Application”.

• Porém, esse comportamento pode ser alterado através do atributo immediate. Então a conversão, a validação e os

listeners serão executados “Apply Request Values”e no final

dessa mesma fase as ações também são executadas.

(105)

Eventos

• Durante a execução de um método de evento de mudança de valor, podemos dizer ao contexto do JSF que queremos que a página seja renderizada (“Render Response”), pulando todas as outras fases do ciclo de vida. Com o comando:

FacesContext.getCurrentInstance().renderResponse();

Esse tipo de comando é útil para atualizarmos um componente de acordo com o valor de um componente que o antecede.

(106)

Eventos

1. Classe bean do estado

(107)

Eventos

1. Managed bean

Exemplo – Mudar as cidades de uma caixa de seleção de acordo com o UF escolhido

Insire os estados

no Arraylist

(108)

Eventos

1. Página xhtml

Exemplo – Mudar as cidades de uma caixa de seleção de acordo com o UF escolhido

Submete o formulário ao alterar o valor do componente e executa o método “mudaEstado”

(109)

Ajax

Ajax (Asynchronous JavaScript and XML

) é um

grupo de tecnologias web que permite a criação

de aplicações interativas.

Com Ajax, as aplicações Web podem fazer

requisições de conteúdo ao servidor sem

recarregar a tela, buscando apenas fragmentos

da página que precisam ser atualizados.

(110)

Ajax

As requisições AJAX são realizadas quando

determinados eventos ocorrem.

Devemos indicar para o JSF quais componentes e

eventos devem realizar requisições AJAX. Para

fazer isso, utilizamos a tag <f:ajax>.

<h:inputText> <f:ajax /> </h:inputText> Nesse caso o evento padrão do componente (onChange) foi associado ao Ajax

(111)

Ajax

• Pode-se explicitar o evento que deve disparar as

requisições AJAX através do atributo event da tag <f:ajax>.

Os eventos podem ser:

change, keyup, mouseover,

focus, blur, click.

<h:inputText>

<f:ajax event =“keyup"/>

</h:inputText>

Evento padrão para campos de texto

Evento padrão para botões

(112)

Ajax

Podemos associar um método a uma requisição

AJAX. Esse método será executado durante o

processamento dessa requisição no servidor na

fase Invoke Application.

Essa associação é realizada através do atributo

listener da tag <f:ajax>.

<h:commandButton value="Salva">

<f:ajax event ="click" render ="formulario" execute ="formulario"

listener ="#{produtoBean.salva}"/> </h:commandButton >

Associando um procedimento a uma requisição AJAX

Esse método pode ou não receber um argumento do tipo AjaxBehaviorEvent

(113)

Ajax

• Quando uma requisição AJAX é feita, podemos

determinar quais componentes da tela devem ser avaliados pelo JSF.

• Informamos os componentes a serem avaliados no

servidor através do atributo execute da tag <f:ajax>.

<h:form id=“formulario-login"> <h: inputText/>

<h: inputSecret/>

<h:commandButton value =“Enviar">

<f:ajax event =“click" execute =“formulario-login"/>

</h: commandButton > </h: form >

Processando uma parte específica da tela

Nesse caso, o formulário

inteiro será enviado.

(114)

Ajax

Podemos definir quais componentes devem ser

atualizados quando a resposta de uma requisição

AJAX chega no navegador.

Para isso, devemos utilizar o atributo render da tag

<f:ajax>, o valor desse atributo deve ser uma lista

contendo os identificadores dos componentes.

<h:commandButton value ="Gera Números">

<f:ajax event ="click" render ="num1 num2"/> </h:commandButton>

<h:outputText id="num1" value ="#{ geradorBean.numero}"/> <h:outputText id="num2" value ="#{ geradorBean.numero}"/> Recarregando parte da tela

A lista têm seus elementos separados por um espaço

(115)

Ajax

(116)

Ajax

Habilitar via Ajax o botão de “Enviar” somente se o login não existir (imagine que já exista o usuário com login

“joao”).

(117)

Ajax

Exemplo

Atualiza esses componentes Executa esse procedimento

no evento OnChange

(118)

Ajax

(119)

Ajax

1. Crie uma página que receba o nome do usuário

2. Toda vez que o usuário digitar uma letra mostre de forma assíncrona o número de caracteres digitados.

3. Toda vez que o usuário acabar de alterar o nome mostre de forma assíncrona o nome somente com letras maiúsculas.

4. Crie também um campo que recebe a data do cadastro. Depois que o usuário digitar essa informações, o sistema deve informar de

forma assíncrona a data acrescida de trinta dias, valide a data para ver se está no padrão dd/MM/yyyy.

5. De forma assíncrona, insira e mostre o nome e as datas em uma lista quando o usuário clicar no botão. Valide também o nome, que deve ter entre 6 e 15 caracteres.

(120)

Referências

Programação Java para a Web - Décio Heinzelmann Luckow e Alexandre Altair de Melo - ISBN: 978-85-7522-238-6

K19 treinamentos - Desenvolvimento Web com JSF2 e JPA2 acessoado em 22 de agosto de 2015, disponível em www.k19.com.br

Java EE 7 com JSF, PrimeFaces e CDI por Thiago Faria, 2ª Edição, 28/02/2015, lgaWorks Softwares, Treinamentos e Serviços Ltda

Referências

Documentos relacionados

Para explicar como se dá esse processo de transformação no desenvolvimento cognitivo humano e a diferença entre este pensamento tipicamente humano e o pensamento

Convencionam as partes que, exclusivamente para os empregados que mantêm contrato de trabalho com a mesma empresa ou, empresa do mesmo grupo econômico há mais de 10 (dez) anos e

Dentre as possibilidades de trabalho do linguista no contexto empresarial, algumas das contribuições que são possíveis de serem oferecidas de um modo aplicado podem ser:

Hoje, o portfólio conta com Saraiva Assinaturas, Saraiva Cosméticos, Saraiva Cursos, Saraiva Flores, Saraiva Ingressos, Saraiva Óculos, Saraiva Perfumes, Saraiva Pet e

A divisão das Categorias, Divisões e Classes, das viaturas inscritas no Circuito Município de Porto Moniz – Rampa Ilha Pneu/Santa 2015, são as definidas no Regulamento do

Vigotski, através desta primeira peculiaridade da crítica de leitor, estabelece a independência da obra de arte em relação ao seu autor e enfatiza a sua ligação com

Muito mais do que contra Lenine, Trotski se insurge contra as inquietantes doutrinas expostas por certos comités bolcheviques, como os do Ural por exemplo, em

De maneira geral, as respostas dos moradores em relação ao local onde vivem são negativas, existem muitas falhas estruturais urbanas nestes