Escolar Documentos
Profissional Documentos
Cultura Documentos
4 e Primefaces 12
Fonte: https://professordanilo.com.br/comecando-com-jsf-2-3-e-primefaces-8/
Dica: Caso a versão do seu Netbeans seja o 8.2, você deverá descer até a categoria Maven antes de
selecionar a Aplicação Web.
Na tela do Netbeans é possível perceber que o nome do projeto é utilizado automaticamente como nome do
artefato esta mesma tela podemos deixar configurado o GroupId, Version e Package. O Package é utilizado
para definir a estrutura de pacotes Java.
Ao avançar pelo botão Próximo (Next) será necessário escolher o servidor web. Usaremos o Tomcat, no
entanto algumas versão do Tomcat se apresentaram instáveis em nossos testes relacionado a execução do
Tomcat pelo Netbeans. A partir da versão 8.5 o Netbeans não consegue executar corretamente o Tomcat não
executando a aplicação criada, por isto optamos por utilizar a versão 8.0.53 do Tomcat podendo ser baixada
aqui. Para mais informações acesse a página oficial do Tomcat.
Seleção do Servidor
Selecionado o servidor e clicado em Terminar (Finish) o Maven entrará em ação para baixar dependências
do Java e Java Web (Caso não tenha criado nenhum projeto com Maven ainda) e ao final deverá mostrar que
o projeto foi construído com sucesso (Build Success) e também aparecerá na aba projetos.
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
Troque por:
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
Além do Java Web, também será necessário configurar a dependência do JSF implementado pela Mojarra.
Servidor como o Glassfish já possuí a dependência embutida sendo necessário configurar uma dependência
diferente, no entanto como vamos utilizar o Tomcat será necessário configurar conforme as linhas abaixo.
Dica: Você pode colocar a lib no Tomcat, assim não precisará compilá-la junto ao projeto, no entanto para
nosso exemplo tudo será compilado junto ao projeto.
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.4.0</version>
</dependency>
O JSF 2.3 utiliza as especificações de injeção de dependência do CDI, a partir desta versão o uso do CDI se
tornou obrigatório, com isto precisamos de um container capaz de gerenciar as dependências do JSF. Para
utilizar um servidor mais simples e barata como Tomcat é necessitará de configurar o Weld CDI que é uma
implementação das especificações do do Java CDI.
Para usar o Weld com JSF será necessário importar 3 libs do próprio Weld.
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.4.8.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core-jsf</artifactId>
<version>2.4.8.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.4.8.Final</version>
</dependency>
Uma vez que estas dependências estiverem configuradas nosso arquivo pom.xml ficará assim:
<groupId>br.com.professordanilo</groupId>
<artifactId>comecando-com-jsf</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<name>comecando-com-jsf</name>
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core</artifactId>
<version>2.4.8.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld</groupId>
<artifactId>weld-core-jsf</artifactId>
<version>2.4.8.Final</version>
</dependency>
<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet</artifactId>
<version>2.4.8.Final</version>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.4.0</version>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>8.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<compilerArguments>
<endorseddirs>${endorsed.dir}</endorseddirs>
</compilerArguments>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<phase>validate</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<outputDirectory>${endorsed.dir}</outputDirectory>
<silent>true</silent>
<artifactItems>
<artifactItem>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>7.0</version>
<type>jar</type>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
A TAG <properties> e a TAG <build> foram geradas pelo próprio Netbeans. A TAG <properties> uma
forma de definir variáveis e reaproveitá-las no documento. A TAG <build> é responsável por configurar
como o Maven deverá compilar o projeto. Através do Plugin maven-compiler-plugin é configurado a
forma como será compilado os arquivos Java. O plugin maven-war-plugin informará o empacotamento que
deverá ser feito, no início do documento também é possível ver o <packaging>war</packaging> informando
o tipo da saída do arquivo final.
Atualização: Nas versões mais novas o Maven está gerando erro ao compilar com o “maven-war-plugin” na
versão “2.3”, troque a versão para 3.3.2. Troque também o source e target para “1.8”. Com isto o projeto
deverá rodar perfeitamente.
Conforme a tela abaixo, o nome do arquivo deverá ser informado e o tipo do arquivo poderá ser modificado,
a recomendação é trabalhar com o formato Facelets, desta forma um arquivo index.xhtml será criado na
pasta webapp (Páginas da Web), você pode conferir o caminho completo onde será criado o arquivo.
Criando
Página JSF.
Ao criar o arquivo index.xhtml a primeira tarefa está concluída e o conteúdo da página provavelmente
estará assim:
É possível perceber TAGs que não fazem parte do HTML convencional como o <h:head> e <h:body>,
estas TAGs são processadas pelo JSF e ao final o que o navegador irá renderizar será de
fato <head> e <body>.
A segunda tarefa a ser feita é configurar o arquivo web.xml na pasta WEB-INF, este arquivo não existia, ao
criar um arquivo do JSF o Netbeans verifica que não existe um arquivo de configuração web e o cria
automaticamente. O arquivo web.xml terá o seguinte código:
Dúvidas sobre outras configurações deste arquivo poderão ser esclarecidas nos comentários abaixo.
Para finalizarmos a última tarefa de configuração, precisaremos criar um arquivo de configuração do CDI,
este arquivo diz respeito a quais classes o CDI deverá vasculhar no projeto para construir a injeção de
dependência. No Netbeans este arquivo também pode ser facilmente criado no Menu Arquivo > Novo
Arquivo na categoria Context and Dependency Injection e selecionando o tipo de arquivo beans.xml (CDI
configuration file). Neste ponto recomendamos criar o arquivo sem modificar nada pois o padrão do CDI
conseguirá localizar corretamente o arquivo, caso contrário deverá ser modificado o a localização padrão.
Este arquivo será criado na pasta WEB-INF junto ao arquivo web.xml e deverá ser feita uma pequena
alteração para que tudo funcione como desejado. O seguinte código deverá constar no arquivo:
Ao final das propriedades da TAG beans tem este código bean-discovery-mode=”annotated”, ele diz ao
CDI quais classes deverão ser verificadas e gerenciadas. Em nosso caso trocaremos o
valor annotated para all, assim ele vasculhará todo nosso projeto e verificará todas as classes. Em projetos
maiores outras estratégias deverão ser tomadas pois com muitos arquivos o projeto poderá também consumir
muita memória, mas para nosso exemplo será mas fácil usar esta abordagem. Ao final o arquivo ficará da
seguinte maneira:
Finalização e teste
Para que possamos testar o real funcionamento do JSF, uma classe Java deverá ser criada, para isto criamos
uma classe com nome TesteBean no pacote bean (um pacote padrão para este tipo de classe).
A classe criada deverá ter uma anotação @Named, esta anotação informa ao CDI e ao JSF que é uma classe
gerenciada, desta forma uma página JSF consegue chamar um código Java.
A anotação @SessionScoped diz como o servidor deverá controlar a classe, no caso desta anotação o
servidor mantém a classe na memória durante toda a sessão. A sessão é configurada no arquivo web.xml, se
voltar ao arquivo verá que o tempo pré-configurado é de 30 e este tempo é relativo a minutos, esta sessão só
expira (encerra) quando o navegador que acessou e gerou a sessão ficar mais que 30 minutos sem acessar
novamente o servidor. Caso haja um acesso no minuto 29 a contagem então é reiniciada e mais 30 minutos
deverão ser aguardados para que os arquivos na memória relativos a sessão sejam eliminados.
Por último para que o CDI possa criar e gerenciar nossa classe TesteBean ela deverá implementar
Serializable. O Serializable do pacote java.io diz respeito a capacidade de pegar esta classe da memória e
gravar seu estado em disco, isto é, colocar da memória RAM no HD a instância da classe TesteBean sem
alterar nada e voltá-la para a memória quando necessário (uma forma de cache). Praticamente todas as
classes relacionadas com CDI devem implementar Serializable.
package br.com.professordanilo.comecandocomjsf.bean;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import java.io.Serializable;
@Named
@SessionScoped
public class TesteBean implements Serializable {
Para verificarmos o funcionamento da classe TesteBean criamos um atributo de classe com o nome de hello
e um método getHello para expor a variável para fora da classe, desta forma agora podemos colocar esta
variável na página index.xhtml.
Para que um valor seja exibido no nosso xhtml ou seja enviado do xhtml para a classe Java é necessário usar
um recurso conhecido por Expression Language (EL). Uma EL é composta por # e chaves {}. Dentro da
EL passamos o nome da classe e em seguida o atributo ao qual queremos usar. Através de uma EL podemos
acessar atributos e métodos. No nosso exemplo iremos exibir o atributo hello, no entanto o atributo é private
no Java por isto foi necessário criar um método getHello do tipo public. Uma EL consegue interpretar os
atributos mesmo sendo private, para pegarmos o valor do hello escrevemos a EL assim:
#{testeBean.hello}
Não foi preciso usar getHello, a EL tenta pegar o nome hello e procura na classe testeBean por get + hello
colocando a primeira letra do nome em maiúscula. Desta forma atributos podem ser facilmente encapsulados
sem a necessidade de chamar os respectivos métodos. Caso não exista um método get para o atributo
solicitado, o EL verifica se existe o atributo public, então podemos (se assim desejar) criar um atributo
public sem a necessidade de métodos get (NÃO RECOMENDADO).
Vale notar que o nome da classe TesteBean começa com letra maiúscula, no entanto quando estamos usando
a EL o nome da classe é diferente da instância da classe. Este nome pode ser personalizado na anotação
@Named(value = “teste”), desta forma ao invés de usar testeBean poderia simplesmente usar teste. De
qualquer forma não é comum ficarmos mudando o nome da classe já que por padrão (quando não
informado) o nome da instância é o nome da classe com a primeira letra minúscula.
Nossa página index.xhtml ficará assim:
Para executar o projeto no Netbeans no menu Executar (Run) > Limpar e Construir (Clean and Build). Esta
ação faz com o que o Maven exclua os arquivos compilados (Limpar) e compile novamente (Construir).
Este mesmo atalho se encontra na barra de botões.
Limpar e construir no Netbeans.
Se tudo que você fez até aqui está correto a seguinte página deverá aparecer no seu navegador:
Para encerrar…
Não podíamos encerrar sem falar no Primefaces. O Primefaces é uma biblioteca de User Interface
desenvolvida pela PrimeTek focada em trazer componentes opensource para o JSF. Apesar de ter começado
com JSF hoje a equipe do primefaces desenvolvem componentes para JSF, Angular, React e Vue. O
Primefaces é rico em componentes, desde a componentes simples de entrada de textos até componentes
completos como tabelas e gráficos. A documentação do Primefaces conta com um showcase que exibe uma
Demo dos componentes em funcionamento além de apresentar também de forma simples o código
necessário para começar com o componente. Em alguns casos o showcase é tão completo que a
documentação acaba ficando um pouco de lado.
Para usarmos o Primefaces precisamos apenas importar sua dependência. Na página de downloads existe
uma versão paga chamada de Pró e Elite, estas versões chegam mais rápido aos desenvolvedores e empresas,
mas a versão para a comunidade é livre.
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>12.0.0</version>
</dependency>
A dependência do Primefaces está disponível na central do Maven e uma vez adicionada no arquivo
pom.xml basta Limpar e Construir o projeto para que seja baixada e esteja disponível para uso.
Modificando mais uma vez a página index.xhtml, agora precisamos importar as tags do Primefaces, para isto
basta inserir na tag html o namespace: xmlns:p=”http://primefaces.org/ui”. A letra p logo após
o xmlns define um prefixo para os componentes, assim se quiser usar um inputText para escrever
<p:inputText>. No exemplo abaixo colocamos um componente panel com um header “Hello Primefaces” e
dentro dele um componente de inputText com nosso #{testeBean.hello} no atributo value. Ficando assim
nosso xhtml:
Conclusão
JSF ainda é uma ferramente completa para desenvolvimento, com sua integração forte com o Java e vários
frameworks torna se uma peça poderosa de produtividade para desenvolvimento web. Com frameworks
como Primefaces o desenvolvimento pode ser acelerado principalmente usando todo ferramental que a
empresa PrimeTek fornece e preocupa em manter atualizado.
Assim como Java não é a única linguagem, JSF não é o único framework para desenvolvimento web, cada
projeto tem sua particularidade e esta sim deve ser considerada a risca para que o objetivo final seja entregar
um software funcional e com qualidade.