Pular para o conteúdo principal

JSF 2 - Composite Components, você não precisa mais ser um ninja

Estamos em uma nova era da computação, os dados não estão mais localizados em um banco dentro de sua empresa, vivemos a explosão de redes sociais, informações são geradas a todo instante, e se torna essencial que sua aplicação conheça os serviços disponíveis na web e consumam suas APIs geralmente disponíveis por serviços REST.

Legal, mas como ficam meus aplicativos Java EE neste novo cenário? Para quem vem acompanhando a evolução da plataforma, é notório que todo esforço vem sendo utilizado para aumentar a produtividade e a integração com novos serviços.
Basicamente duas especificações surgem com muita força para atender este cenário, a JSR - 314 (JSF-2) e JSR - 311 (JAX-RS), neste post exploraremos a JSR-314 (JSF2) e sua nova forma de criar Composite Components.

Uma das grandes queixas dos desenvolvedores JSF era a complexidade em criar composite components, era necessário um vasto conhecimento sobre o ciclo de vida de uma aplicação JSF.
Agora, você não precisa ser mais um “ninja” em JSF para ter seus components reutilizáveis. Sua distribuição também ficou bastante simples, basta apenas o seu componente estar localizado no web root da sua aplicação ou empacotado em um JAR.

Bem, vamos a um pouco de código.

* Para este exemplo estou utilizando NetBeans 6.8.1 com Glassfish V3


A ideia básica deste post é criar um componente de vídeo para ser utilizado em várias partes do nosso sistema.

Crie um novo projeto Arquivo -> Novo Projeto, escolha Java Web -> Aplicação Web, e pressione próximo.

Vamos chamar nosso projeto de Globalcoders - homenagem ao blog - pressione próximo novamente. Na próxima tela, escolha como servidor Glassfish V3 - ou outro de sua preferência - a versão do Java EE, selecione Java EE 6, pressione próximo.

Na próxima tela, o NetBeans irá perguntar quais os Frameworks que você deseja utilizar, selecione JavaServer Faces 2, clique em finalizar.
Agora no web root de nossa aplicação constitua um diretório de resources, aqui será a residência de nosso componente.

A especificação do JSF2, define que:

A ocorrência da String “http://java.sun.com/jsf/composite/” em uma declaração de namespace XML Facelet, tudo que estiver após a última “/” é considerado como sendo uma biblioteca de recurso.

Ou seja, crie uma pasta chamada videocomp, e dentro desta pasta criaremos um arquivo chamado video.xhtml.

Quando desejar utilizar este componente, deve colocar na declaração de namespace a seguinte String: “http://java.sun.com/jsf/composite/videocomp”.

A estrutura de nosso projeto ficará assim:

Pronto, agora que já temos a estrutura, codificaremos o nosso componente.

Utilizaremos os recursos do HTML5, a tag <video>, e chamadas assíncronas com novo componente de ajax do JSF2.

Veja o código abaixo:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">

<cc:interface>
<cc:attribute name="nomeBotao" />
<cc:attribute name="caminhoVideo" required="true" />
<cc:attribute name="alterarVideo" method-signature="void action()" />
</cc:interface>

<cc:implementation>
<h:form>
<h:panelGrid id="video">
<video controls="controls">
<source src="#{cc.attrs.caminhoVideo}" />
</video>
</h:panelGrid>

<h:commandButton value="#{cc.attrs.nomeBotao}" action="#{cc.attrs.alterarVideo}">
<f:ajax execute="@this" render="video" />
</h:commandButton>

</h:form>
</cc:implementation>
</html>
Como você pode ver, o código é bem simples. A primeira tag define quais as características do componente.

A segunda tag definimos como será a sua implementação.

Nela veja a tag <video> presente na nova especificação do HTML5, como ela podemos colocar vídeos em nossas páginas de forma muito fácil, outro novo elemento é a tag do JSF2, semelhantes as tags Ajax4jsf e Trinidad, minimizando a utilização de outros frameworks de terceiros.

Ela é responsável por disponibilizar a chamada ajax no CommandButton. A utilização desta tag é extremamente simples, basicamente temos dois atributos: o “execute”, responsável por enviar nossa requisição, e o “render”, onde informamos o que será renderizado novamente.

Pronto, temos nosso componente de vídeo simples.



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:video="http://java.sun.com/jsf/composite/videocomp">
<h:head>
<title>Globalcoders</title>
</h:head>
<h:body>

<video:video nomeBotao="Alterar Clipe"
caminhoVideo="#{videoControle.caminhoVideo}"
alterarVideo="#{videoControle.alterarVideo}"/>

</h:body>
</html>


Agora basta chamar o componente na index.xhtml ou qualquer outra página que desejar dentro de seu sistema.

Observe que na declaração do namespace, colocamos o nome do nosso diretório videocomp.

Outro ponto importante quando vamos utilizar o componente, informamos os parâmetros necessários para seu funcionamento, por exemplo, a action do botão.

O download do código fonte pode ser feito aqui

Até a próxima.

Raphael Adrien
http://twitter.com/raphaeladrien

Comentários

Bastante interessante, Raphael, até pra quem é mais leigo em JSF2.

Eu que não entendo tanto acho que consegui entender a idéia.

Mas nos browsers de hoje já da para conferir o resultado tranquilo?
Raphael disse…
Sim, basta seu browser dar suporte a tag video.
Vc pode verificar o suporte do seu browser neste site http://html5test.com/
Olá olá a todos!

JSF sempre me chamou a atenção.
Falta só estudar mais, mas logo chego lá ( será meu próximo ponto a ser estudado no mundo java hehe ).

Então, não tenho nada revolucionário a comentar, pela pouca experiência com JSF, masss como nosso amigo Marcelo Ricardo, pela forma que o Rapha mostrou, até pareceu ser uma coisa fácil hehehe.

Quais livros de JSF são indicados para estudo? ( pode ser em ingles... amazon ta ai pra dar um help =] )

Parabéns a todos pelo Blog, continuem postando sempre!!

Abração!
Raphael disse…
Lucas, existe bastante material de qualidade disponível na internet.
Dá uma olhada na lista de JSF Group (http://migre.me/41Lhu), e alguns blogs como do @rponte (http//rponte.com.br/).
Ainda temos tb os minicursos da iniciativa #open4education, especialmente este http://migre.me/41Luo que acontece com certa freqüência via webcast.
Mas já que você pediu um livro, veja este JavaServer Faces 2.0 - The Complete Reference (http://migre.me/41KJm) - @edburns e Chris Schalk
Vitor disse…
Este comentário foi removido pelo autor.
Vitor disse…
salve galera...
show de bola o post...

tenho um problema com o composite components que ainda não consegui resolver,
Raphael, pode me passar o email pra entrar em contato contigo??

tentei colocar o código aí no comentario mas não rolou por causa das tags...
Raphael disse…
Vitor, acabei de enviar um e-mail para vc. Manda lá sua dúvida.

[]`s
Glesio disse…
Rafael, estou tendo problemas com composite ao tentar ler um objeto managedbean e listener dentro do composite component.
Rodrigo Bento disse…
A idéia do JSF 2.0 + Facelets e composite components especificamente é muito bonita. Infelizmente há um número gritante de bugs que torna a utilização desse recurso praticamente impraticável. Por isso se você pegou a idéia mas não consegue fazer alguma coisa simples funcionar, tente dar uma olhada na lista de bugs. Já 'perdi' muito tempo com isso.
Welyab Paula disse…
olá.
se eu acessar a url /resources/videocomp/video.xhtml e colocar para o navegador mostrar o codigo fonte da página, ele vai mostrar o código puro da página. tem como evitar isto ???
Pontin disse…
Olá Raphael...

Como você disse "Agora no web root de nossa aplicação constitua um diretório de resources, aqui será a residência de nosso componente.".

Só funciona dessa maneira o componente.
Mas gostaria de saber se tem como criar o componente em uma pasta fora do resources, e indicar ela como uma taglib?

Conhece alguma forma? Desde já agraeço.
Bruno disse…
Sim Pontin, use a tag ui:fragment do facelets, assim nao sera necessario estar dentro da pasta resources. porém é necesario criar o arquivo facelet-taglib.xml para referenciar sua nova tag.
Eduardo disse…
Raphael, muito obrigado pelo post, mas existe a possibilidade de nos repassar o código-fonte desse projeto, eu não estou conseguindo colocar pra rodar esse componente.
Obrigado.
Ben Nelson disse…
JSF FOR LIFE

Postagens mais visitadas deste blog

10 reasons why we love JSF

1. One-slide technology: it's so simple that I can explain basic JSF with one slide. 2. Easy to extend: components, listeners, render kit, Events, Controller, etc. 3. Real-world adoption: JBoss, Exadel, Oracle, IBM, ... 4. Architecture model: you can choose between more than 100 different architecture. 5. Open-mind community: using JSF you are going to meet very interesting people. 6. We are using JSF the last 5 years and we found very good market for JSF in Brazil 7. Progress: look to JSf 1.1 to JSF 1.2, JSF 1.2 to JSF 2.0. People are working really hard! 8. Many professionals now available 9. It's a standard. It's JCP. Before complain, report and help! 10. Ed Burns, spec leader, is an old Globalcode community friend! EXTRA: My wife is specialist in JSF. She's my F1 for JSF :) Nice job JSF community! -Vinicius Senger

O que é Lógica de programação?

Este é o segundo de uma série de posts voltados aos leitores do blog que estão dando início à carreira de desenvolvimento de software. O assunto de hoje é a lógica de programação. Para ler antes: Entendendo como funciona a programação de computadores: linguagens de programação, lógica, banco de dados A lógica de programação é um pré-requisito para quem quer se tornar um desenvolvedor de software, independente da linguagem de programação que se pretende utilizar. Mas o que é de fato a Lógica de Programação e como saber se eu tenho esse pré-requisito? A lógica de programação nada mais é do que a organização coerente das instruções do programa para que seu objetivo seja alcançado. Para criar essa organização, instruções simples do programa, como mudar o valor de uma variável ou desenhar uma imagem na tela do computador, são interconectadas a estruturas lógicas que guiam o fluxo da execução do programa. Isso é muito próximo ao que usamos em nosso cotidiano para realizar atividad...

NIO.2 do Java 7: uma nova API do Java para file system

Uma das novidades mais importantes e aguardadas do Java 7 foi a NIO.2, a nova API para a manipulação I/O com Java. A NIO.2, também conhecida como JSR 203 , disponibiliza um conjunto de novos componentes, projetados para melhorar caracterísiticas de I/O com Java como por exemplo: uma nova API para o acesso e manipulação de conteúdo do file system (sistema de arquivos); outra API para operações assíncronas com I/O; e a atualização da API para comunicação via sockets ( channel sockets ).   O Java, antes da versão 7, tratava a manipulação do sistema de arquivos de forma primitiva. O programador tinha de trabalhar com a classe File para representar arquivos e/ou diretórios, com um número escasso de funcionalidades. Uma operação simples como copiar um arquivo demandava um código relativamente grande. Outras funcionalidades triviais, como por exemplo o uso de links simbólicos, não eram suportadas. Esses são alguns dos motivos para justificar o uso de bibliotecas terceiras...

TDC BUSINESS, chega a São Paulo com novas trilhas de Inteligência Artificial e Inovação

Maior conferência de profissionais de tecnologia do Brasil abordará temas em alta no momento como, por exemplo, Inteligência Artificial, Segurança, Ciência de Dados e Inovação O TDC BUSINESS, a 17° edição do The Developer's Conference na cidade de São Paulo, que acontece entre os dias 19 e 21 de Setembro, reunirá profissionais e especialistas da área para troca de experiência, compartilhamento de conteúdos e networking. Com o tema central: “Tecnologia para negócios transformadores”, o evento será totalmente híbrido, ocorrendo presencialmente no espaço Pro Magno, e com transmissão simultânea e atividades de network pela internet. A expectativa é reunir mais de 14.000 pessoas, somando a participação presencial e online.   Segundo Yara Mascarenhas, Fundadora e Host do Evento, “nosso objetivo com o TDC é inspirar a colaboração entre os profissionais e empresas para construir uma nova realidade para o mercado de TI.  Vamos juntar tecnologia e negócios com as trilhas técnicas...

TDC ONLINE: SUA PLATAFORMA DE PALESTRAS GRAVADAS DO TDC DISPONÍVEL

Além do conteúdo ao vivo transmitido online nas edições do TDC, agora você pode ter acesso à centenas de palestras gravadas, através da nossa nova plataforma de vídeos - o TDC Online, que reúne todas as Trilhas premium, Stadium e Salas dos Patrocinadores das edições anteriores de 2022, TDC Innovation e TDC Connections.  Para acessar, basta clicar na edição em que você participou ( TDC Innovation ou TDC Connections ); Fazer o mesmo login (com e-mail e senha) cadastrados na hora de adquirir ou resgatar o seu ingresso no TDC; E clicar na Trilha de sua opção, e de acordo com a modalidade do seu ingresso. Logo em seguida, você será direcionado para a seguinte página com a lista de todas as palestras por Trilha: Pronto! Agora você tem acesso à centenas de palestras gravadas da sua área de interesse, para assistir como e quando quiser! Caso tenha esquecido a senha, clique na opção "Esqueci a senha" , insira o e-mail que você realizou para o cadastro no evento, e aparecerá a op...

Java no mundo das Telecomunicações

Este é meu primeiro post aqui no blog e gostaria de dizer que estou muito feliz em também poder contribuir com esta grande (e crescente) família Globalcode. Vou começar escrevendo aqui sobre um tópico pouco explorado no universo Java: o seu uso no mundo das telecomunicações. Vários de vocês podem ter trabalhado em projetos para empresas de telecom utilizando a tecnologia Java. Eu mesmo já participei de alguns, implantando sistemas de tarifação, faturamento, CRM e cobrança. Mas o objetivo deste post é um pouco diferente: estou falando do uso de Java na própria rede de telecom. Como vocês podem imaginar, esta rede que permite que ligações telefônicas sejam feitas de seu celular ou aparelho fixo é um tanto quanto complexa, lidando com aspectos como roteamento, bilhetagem, roaming , etc. E o Java está presente neste cenário também. Para provar que não estou mentindo, abram o site do JCP e cliquem no link "JSRs by Technology". Observem que uma das categorias lista é a JAIN ( Jav...