O JSF define dois componentes que nos ajudam a organizar visualmente os elementos de uma página JSF.
115 COMPONENTESVISUAIS Organiza os elementos em uma grade.
• <h:panelGroup>
Permite que diversos componentes sejam tratados como um único componente.
O<h:panelGrid>é usado para organizar componentes em forma de uma grade. O uso de um
<h:panelGrid>é bastante simples. Basicamente, devemos configurar a quantidade de colunas que desejamos. Para isso, utilizamos o atributocolumns.
1 <h:p a n e l G r i d c o l u m n s=" 2 ">
2 <h:o u t p u t L a b e l v alu e=" Nome do cur so : " for=" nome "/ > 3 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . nome } " id=" nome "/ > 4
5 <h:o u t p u t L a b e l v alu e=" D e s c r i ç ã o : " for=" d e s c r i c a o "/ >
6 <h:i n p u t T e x t a r e a v alu e=" #{ c u r s o s B e a n . cur so . d e s c r i c a o } " id=" d e s c r i c a o "/ > 7
8 <h:o u t p u t L a b e l v alu e=" Car ga h o r á r i a : " for=" carga - h o r a r i a "/ >
9 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . c a r g a H o r a r i a } " id=" carga - h o r a r i a "/ > 10
11 <h:c o m m a n d B u t t o n a c t i o n=" #{ c u r s o s B e a n . c a d a s t r a C u r s o } " val ue=" C a d a s t r a r "/ > 12 </h:p a n e l G r i d>
Código XHTML 6.45: Organização de um formulário com o<h:panelGrid>
Os componentes são inseridos na grade de acordo com a ordem em que estão apresentados no código. O primeiro elemento é inserido na primeira coluna da primeira linha. O segundo elemento é inserido na segunda coluna da primeira linha. Uma vez que uma linha foi completamente preen- chida, o próximo componente é inserido na primeira coluna da próxima linha, e o processo se repete até o último componente.
Suponha que seja necessário inserir mais de um componente em uma mesma célula de um <h:panelGrid>. No exemplo acima, podemos adicionar um ícone de um relógio ao lado do rótulo “Carga horária:”. No entanto, queremos que a imagem e o rótulo sejam colocados na mesma célula. Para isso, podemos agrupá-los usando um<h:panelGroup>.
1 <h:p a n e l G r o u p>
2 <h:o u t p u t L a b e l v alu e=" Car ga h o r á r i a : " for=" carga - h o r a r i a "/ > 3 <h:g r a p h i c I m a g e l i b r a r y=" i m a g e n s " name=" r e l o g i o . png " / > 4 </h:p a n e l G r o u p>
Código XHTML 6.46: Agrupando componentes com o<h:panelGroup>
Exemplos
1. XHTML:
1 <h:p a n e l G r i d c o l u m n s=" 2 ">
2 <h:o u t p u t L a b e l v alu e=" Nome do cur so : " for=" nome "/ > 3 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . nome } " id=" nome "/ > 4
5 <h:o u t p u t L a b e l v alu e=" D e s c r i ç ã o : " for=" d e s c r i c a o "/ >
6 <h:i n p u t T e x t a r e a v alu e=" #{ c u r s o s B e a n . cur so . d e s c r i c a o } " id=" d e s c r i c a o "/ > 7
8 <h:p a n e l G r o u p>
9 <h:o u t p u t L a b e l v alu e=" Car ga h o r á r i a : " for=" carga - h o r a r i a "/ > 10 <h:g r a p h i c I m a g e l i b r a r y=" i m a g e n s " name=" r e l o g i o . png " / > 11 </h:p a n e l G r o u p>
12 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . c a r g a H o r a r i a } " id=" carga - h o r a r i a "/ > 13
14 <h:c o m m a n d B u t t o n a c t i o n=" #{ c u r s o s B e a n . c a d a s t r a C u r s o } " val ue=" C a d a s t r a r "/ > 15 </h:p a n e l G r i d> HTML gerado: 1 <t abl e> 2 <t bod y> 3 <tr>
4 <td> <l abe l for=" nome "> Nome do cur so : </lab el> </td> 5 <td> <i npu t id=" nome " type=" text " name=" nome " / > </td> 6 </tr>
7 <tr>
8 <td> <l abe l for=" d e s c r i c a o "> D e s c r i ç ã o : </lab el> </td>
9 <td> <t e x t a r e a id=" d e s c r i c a o " name=" d e s c r i c a o "> </t e x t a r e a> </td> 10 </tr>
11 <tr> 12 <td>
13 <l abe l for=" carga - h o r a r i a "> Car ga h o r á r i a : </lab el>
14 <img src=" / K19 - C o m p o n e n t e s - V i s u a i s / jav ax . fac es . r e s o u r c e / r e l o g i o . png . xht ml ? ln = i m a g e n s←-
" / > 15 </td>
16 <td> <i npu t id=" carga - h o r a r i a " type=" text " name=" carga - h o r a r i a " / > </td> 17 </tr>
18 <tr>
19 <td> <i npu t type=" s u b m i t " name=" j _ i d t 9 8 " val ue=" C a d a s t r a r " / > </td> 20 </tr> 21 </t bod y> 22 </t abl e> Resultado: Cadastrar Carga horária: Nome do curso: Descrição:
Tabelas
O JSF fornece o componente<h:dataTable>para a criação de tabelas. Podemos associar uma lista de elementos a um<h:dataTable>através do atributovalue. Automaticamente, esse compo- nente gera uma linha para cada item da lista. Os itens da lista podem ser acessados através de uma variável definida pelo atributovar.
As colunas da tabela são definidas pelo componente<h:column>. Podemos acrescentar cabeça- lhos e rodapés à tabela e a cada coluna usando o componente<f:facet>.
Veja um exemplo a seguir.
1 <h:d a t a T a b l e v alu e=" #{ c u r s o s B e a n . c u r s o s } " var=" cur so "> 2
3 <f:f ace t name=" h e a d e r "> Lis ta de c u r s o s </f:fac et> 4
117 COMPONENTESVISUAIS 5 <h:c o l u m n>
6 <f:f ace t name=" h e a d e r "> Sig la </f:fac et> 7 #{ c urs o . s igl a }
8 </h:c o l u m n> 9
10 <h:c o l u m n>
11 <f:f ace t name=" h e a d e r "> Nome </f:fac et> 12 #{ c urs o . nome }
13 </h:c o l u m n> 14
15 <h:c o l u m n>
16 <f:f ace t name=" h e a d e r "> D e s c r i ç ã o </f:fac et> 17 #{ c urs o . d e s c r i c a o }
18 </h:c o l u m n> 19
20 <h:c o l u m n>
21 <f:f ace t name=" h e a d e r "> A d i c i o n a r tur ma </f:fac et> 22 <h:c o m m a n d L i n k
23 v alu e=" A d i c i o n a r t ur ma "
24 a c t i o n=" #{ c u r s o s B e a n . a d i c i o n a r T u r m a ( cur so ) } " / > 25 </h:c o l u m n>
26 </h:d a t a T a b l e>
Código XHTML 6.48: Exemplo de criação de tabela com o componente<h:dataTable>
Observe, no exemplo acima, que a tabela está associada à propriedade cursos do managed
beancursosBean. A variávelcursoé utilizada para acessar cada um dos elementos da propriedade
cursos.
O cabeçalho “Lista de cursos” da tabela está definido com o componente<f:facet>assim como o cabeçalho de cada coluna (“Sigla”, “Nome”, “Descrição” e “Adicionar turma”).
O HTML gerado pelo JSF a partir do código acima seria mais ou menos assim: 1 <t abl e> 2 <t hea d> 3 <tr> 4 <th c o l s p a n=" 4 " s co pe=" c o l g r o u p "> Lis ta de c u r s o s </th> 5 </tr> 6 <tr> 7 <th s cop e=" col "> S ig la </th> 8 <th s cop e=" col "> Nome </th> 9 <th s cop e=" col "> D e s c r i ç ã o </th> 10 <th s cop e=" col "> A d i c i o n a r tur ma </th> 11 </tr> 12 </t hea d> 13 <t bod y> 14 <tr> 15 <td> K11 </td> 16 <td> O r i e n t a ç ã o a O b j e t o s em Java </td> 17 <td>
18 Com este c urs o você vai obt er uma base s ó l i d a de 19 c o n h e c i m e n t o s de Java e de O r i e n t a ç ã o a O b j e t o s 20 </td> 21 <td> 22 <i npu t 23 type=" s u b m i t " name=" j _ i d t 1 0 0 : j _ i d t 1 0 1 :0: j _ i d t 1 1 4 " 24 v alu e=" A d i c i o n a r tur ma " / > 25 </td> 26 </tr> 27 <tr> 28 <td> K12 </td>
29 <td> D e s e n v o l v i m e n t o Web com JSF2 e JPA2 </td> 30 <td>
31 D e p o i s d est e curso , você e s t a r á apto a d e s e n v o l v e r 32 a p l i c a ç õ e s Web com os p a d r õ e s da p l a t a f o r m a Java
33 </td> 34 <td> 35 <i npu t 36 type=" s u b m i t " name=" j _ i d t 1 0 0 : j _ i d t 1 0 1 :1: j _ i d t 1 1 4 " 37 v alu e=" A d i c i o n a r tur ma " / > 38 </td> 39 </tr> 40 <tr> 41 <td> K21 </td> 42 <td> P e r s i s t ê n c i a com JPA2 e H i b e r n a t e </td> 43 <td>
44 N est e c urs o de Java Avançado , a b o r d a m o s de m a n e i r a p r o f u n d a 45 os r e c u r s o s de p e r s i s t ê n c i a do JPA2 e do H i b e r n a t e 46 </td> 47 <td> 48 <i npu t 49 type=" s u b m i t " name=" j _ i d t 1 0 0 : j _ i d t 1 0 1 :2: j _ i d t 1 1 4 " 50 v alu e=" A d i c i o n a r tur ma " / > 51 </td> 52 </tr> 53 </t bod y> 54 </t abl e>
Código HTML 6.24: Código HTML gerado pelo JSF
A figura abaixo mostra como essa tabela é apresentada no navegador.
Lista de cursos
Sigla Nome Descrição AdicionarTurma
K11
K12
K21
Com este curso você vai obter uma base sólida de conhecimentos de Java e de Orientação a Objetos.
Depois deste curso, você estará apto a desenvolver aplicações Web com os padrões da plataforma Java
Neste curso de Java Avançado, abordamos de maneira profunda os recursos de persistência do JPA2 e do Hibernate
Orientação a Objetos em Java
Desenvolvimento Web com JSF2 e JPA2
Persistência com JPA2 e Hibernate
Adiciona turma
Adiciona turma
Adiciona turma
Figura 6.1: Representação do HTML no navegador
Exercícios de Fixação
13 No projeto K19-Componentes-Visuais, crie uma página que contenha um formulário para adi- cionar cursos e que exiba os cursos já adicionados. Primeiramente, crie uma classe chamada Curso em um pacote chamado br.com.k19.modelo para representar um curso. Essa classe deve ter dois atributos do tipo String: um para armazenar o nome e outro para armazenar a sigla do curso.
119 COMPONENTESVISUAIS 2 3 p u b l i c c las s C urs o { 4 p r i v a t e S t r i n g nome ; 5 p r i v a t e S t r i n g s igl a ; 6 7 // G E T T E R S E S E T T E R S 8 }
Código Java 6.9: Curso.java
14 Crie uma classe chamada CursosBean para armazenar uma lista de cursos. Para que os cursos adicionados sejam mantidos nessa variável entre uma requisição e outra, marque a classe com a anotação @SessionScoped. No Capítulo9discutiremos sobre escopos de managed beans.
1 p a c k a g e br . com . k19 . c o n t r o l e ; 2
3 i m p o r t br . com . k19 . m o d e l o . Cur so ; 4 i m p o r t java . util . A r r a y L i s t ; 5 i m p o r t java . util . List ;
6 i m p o r t j ava x . f ace s . bean . M a n a g e d B e a n ; 7 i m p o r t j ava x . f ace s . bean . S e s s i o n S c o p e d ; 8
9 @ M a n a g e d B e a n 10 @ S e s s i o n S c o p e d
11 p u b l i c c las s C u r s o s B e a n {
12 p r i v a t e List < Curso > c u r s o s = new ArrayList < Curso >() ; 13
14 // G E T T E R E S E T T E R
15 }
Código Java 6.10: CursosBean.java
15 Na classe CursosBean, adicione um atributo do tipo Curso para armazenar os dados de um curso. Além disso, crie um método para adicionar o curso na lista de cursos.
1 p a c k a g e br . com . k19 . c o n t r o l e ; 2
3 i m p o r t br . com . k19 . m o d e l o . Cur so ; 4 i m p o r t java . util . A r r a y L i s t ; 5 i m p o r t java . util . List ;
6 i m p o r t j ava x . f ace s . bean . M a n a g e d B e a n ; 7 i m p o r t j ava x . f ace s . bean . S e s s i o n S c o p e d ; 8
9 @ M a n a g e d B e a n 10 @ S e s s i o n S c o p e d
11 p u b l i c c las s C u r s o s B e a n {
12 p r i v a t e List < Curso > c u r s o s = new ArrayList < Curso >() ; 13 p r i v a t e Cu rso cu rso = new Cu rso () ;
14
15 p u b l i c void a d i c i o n a C u r s o () { 16 this. c u r s o s . add (this. c urs o ) ; 17 this. c urs o = new C urs o () ;
18 }
19
20 // G E T T E R S E S E T T E R S
21 }
16 Crie um arquivo XHTML chamado cursos.xhtml e implemente um formulário para adicionar cursos à lista de cursos do managed bean CursosBean. Use a tag <h:panelGrid> para organizar o formulário.
No Eclipse. . .
O arquivo cursos.xhtml deve ser salvo em WebContent.
No Netbeans. . .
O arquivo cursos.xhtml deve ser salvo em Web Pages.
1 <!D O C T Y P E html P U B L I C " -// W3C // DTD XHT ML 1.0 T r a n s i t i o n a l // EN "
2 " http :// www . w3 . org / TR / x h t m l 1 / DTD / xhtml1 - t r a n s i t i o n a l . dtd "> 3
4 <html x mln s=" http :// www . w3 . org / 1 9 9 9 / xht ml "
5 x mln s:h=" http :// java . sun . com / jsf / html "> 6 7 <h:head> 8 <t itl e> K19 T r e i n a m e n t o s </tit le> 9 </h:head> 10 <h:body> 11 <h:form> 12 <h:p a n e l G r i d c o l u m n s=" 2 ">
13 <h:o u t p u t L a b e l v alu e=" Nome : " for=" campo - nome " / >
14 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . nome } " id=" campo - nome " / > 15
16 <h:o u t p u t L a b e l v alu e=" Sig la : " for=" campo - sig la " / >
17 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . sig la } " id=" campo - sig la " / > 18 19 <h:c o m m a n d B u t t o n val ue=" A d i c i o n a r " a c t i o n=" #{ c u r s o s B e a n . a d i c i o n a C u r s o } " / > 20 </h:p a n e l G r i d> 21 </h:form> 22 </h:body> 23 </html> Código XHTML 6.49: cursos.xhtml
17 No arquivo cursos.xhtml, insira um trecho de código para exibir os cursos já adicionados. Use a tag <h:dataTable> para apresentar os cursos. Você pode usar o atributo rendered desse componente para exibir a tabela apenas quando a lista de cursos não está vazia.
1 <!D O C T Y P E html P U B L I C " -// W3C // DTD XHT ML 1.0 T r a n s i t i o n a l // EN "
2 " http :// www . w3 . org / TR / x h t m l 1 / DTD / xhtml1 - t r a n s i t i o n a l . dtd "> 3
4 <html x mln s=" http :// www . w3 . org / 1 9 9 9 / xht ml "
5 x mln s:h=" http :// java . sun . com / jsf / html "
6 xm lns : f =" http :// java . sun . com / jsf / core "> 7 8 <h:head> 9 <t itl e> K19 T r e i n a m e n t o s </tit le> 10 </h:head> 11 <h:body> 12 <h:form> 13 <h:p a n e l G r i d c o l u m n s=" 2 ">
14 <h:o u t p u t L a b e l v alu e=" Sig la : " for=" campo - sig la " / >
15 <h:i n p u t T e x t v alu e=" #{ c u r s o s B e a n . cur so . sig la } " id=" campo - sig la " / > 16
17 <h:o u t p u t L a b e l v alu e=" Nome : " for=" campo - nome " / >
121 COMPONENTESVISUAIS 19 20 <h:c o m m a n d B u t t o n val ue=" A d i c i o n a r " a c t i o n=" #{ c u r s o s B e a n . a d i c i o n a C u r s o } " / > 21 </h:p a n e l G r i d> 22 </h:form> 23
24 <h:d a t a T a b l e val ue=" #{ c u r s o s B e a n . c u r s o s } " var=" cu rso "
25 r e n d e r e d =" #{ not emp ty c u r s o s B e a n . c u r s o s } "> 26
27 <f:fac et name=" h e a d e r "> Li sta de C u r s o s < /f:fa cet> 28
29 <h:c o l u m n>
30 <f:fac et name=" h e a d e r "> Si gla < /f:fa cet> 31 #{ cur so . sig la }
32 </h:c o l u m n> 33
34 <h:c o l u m n>
35 <f:fac et name=" h e a d e r "> Nome < /f:fa cet> 36 #{ cur so . nome } 37 </h:c o l u m n> 38 </h:d a t a T a b l e> 39 </h:body> 40 </html> Código XHTML 6.50: cursos.xhtml
Acesse a aplicação no endereço:
http://localhost:8080/K19-Componentes-Visuais/cursos.xhtml
Exercícios Complementares
2 Usando o componente <h:dataTable>, liste os produtos de uma loja virtual. A tabela deve mostrar o nome e o preço de cada produto. No projeto K19-Componentes-Visuais, crie uma classe chamada Produto em um pacote chamado chamado br.com.k19.modelo. Essa classe deve ter um atributo do tipo String para armazenar o nome do produto e um atributo do tipo Double para guardar o preço do produto. Crie uma classe chamada ProdutosBean em um pacote chamado
br.com.k19.controle para guardar uma lista de produtos. Implemente a listagem de produtos em
um arquivo XHTML chamadolista-de-produtos.xhtml.
3 Na classe Produto, acrescente uma propriedade do tipo Boolean para indicar se o preço do produto deve ser exibido. Modifique a tabela de listagem dos produtos para considerar essa nova restrição. Se o preço de um produto não puder ser exibido, então o texto “Adicione o produto ao carrinho para ver o preço” deve aparecer no lugar do preço do produto.
Mensagens
Durante o processamento de uma requisição, podemos adicionar mensagens que podem ser exi- bidas na página de resposta. Uma mensagem pode ser adicionada, por exemplo, da seguinte forma:
1 F a c e s M e s s a g e m e n s a g e m = new F a c e s M e s s a g e (" Tur ma a d i c i o n a d a ") ; 2 F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e () . a d d M e s s a g e (null, m e n s a g e m ) ;
O primeiro parâmetro do métodoaddMessage()define qual componente será associado à men- sagem adicionada. Quando o valornullé passado nesse parâmetro, a mensagem é considerada global, ou seja, ela não será associada a nenhum componente específico.
Na tela, podemos exibir todas as mensagens geradas no processamento da requisição através do componente<h:messages>. Se desejarmos exibir apenas as mensagens globais, devemos utilizar o atributoglobalOnlyda seguinte forma:
1 <h:m e s s a g e s g l o b a l O n l y=" true " / >
Código XHTML 6.53: Exibindo as mensagens globais
As mensagens são comumente utilizadas para indicar erros de conversão e validação. Veremos mais detalhes sobre isso no Capítulo10.