domingo, 1 de maio de 2011

Usando JSF 2 e Primefaces com Spring ROO

Uma das funcionalidades ainda pendentes no Spring Roo é a utilização de JSF na camada de view. Hoje vou mostrar como colocar, de maneira rápida, o seu projeto Roo para trabalhar com JSF 2 e Primefaces.

Desde que conheci o Primefaces, fiquei bastante interessado em utilizá-lo em algum projeto. O JSF 2 parece ter resolvido boa parte dos problemas existentes no 1.x e sua utilização em projetos parece ser uma idéia bem interessante para novos projetos. Mas também gosto da facilidade do Spring Roo. Vamos então utilizar um projeto de exemplo do Primefaces prime-moviecollector. Ele utiliza Spring 3, Hibernate 3, JSF 2 e Primefaces. Vamos reimplementá-lo utilizando o Roo e retiraremos dele as configurações faltantes. Você vai notar que não mando colocar todas as configurações necessárias para o Spring funcionar com o JSF pois elas já estão parte feitas no prime-moviecollector e no nosso. Só vamos fazer as alterações que ainda faltam.

1) Criando o Projeto Roo com as entidades do Domínio (Movie e Format) e a view em Spring MVC:

project --topLevelPackage org.primefaces.examples.moviecollector --projectName Prime-moviecolletor-roo --java 6
persistence setup --database HYPERSONIC_IN_MEMORY --provider HIBERNATE
entity --class ~.domain.Movie
field string --fieldName title
field string --fieldName description
field number --fieldName discs --type java.lang.Integer
enum type --class ~.domain.Format
enum constant --name DVD
enum constant --name BLURAY
focus --class Movie
field enum --fieldName format --type ~.domain.Format
finder add findMoviesByTitleLike
web mvc setup
security setup
2) Removendo os arquivos gerados pelo web mvc setup. Vamos utilizar apenas a estrutura:
  • Em src/main/webapp as pastas images e styles;
  • Em src/main/webapp/WEB-INF as pastas i18n, layouts, spring, tags e view
3) Copiamos o src/main/webapp/WEB-INF/faces-config.xml do prime-moviecollector para o mesmo caminho no nosso projeto.

4) Vamos adicionar algumas dependências no pom.xml do nosso projeto:
  • Em repositories

    prime-repo
    Prime Technology Maven Repository
    http://repository.prime.com.tr/

  • Em dependencies

    org.apache.poi
    poi
    3.2-FINAL


    com.lowagie
    itext
    2.1.7


    org.primefaces
    primefaces
    3.0-SNAPSHOT


    com.sun.faces
    jsf-api
    2.0.4-b09


    com.sun.faces
    jsf-impl
    2.0.4-b09
No caso estamos usando o Primefaces 3.0 mas poderíamos usar a versão 2.2.1 que é a estável.

5) Em src/main/webapp/WEB-INF/web.xml:
  • Retiramos:

    HttpMethodFilter
    org.springframework.web.filter.HiddenHttpMethodFilter


    HttpMethodFilter
    /*


    Prime-moviecolletor-roo
    org.springframework.web.servlet.DispatcherServlet
    
        contextConfigLocation/WEB-INF/spring/webmvc-config.xml
    1


    Prime-moviecolletor-roo
    /

  • E inserimos:

  
   org.springframework.web.context.request.RequestContextListener
  
 
 
  Faces Servlet
  javax.faces.webapp.FacesServlet
  1
 

 
  Faces Servlet
  *.jsf
 
Para adicionarmos as configurações para o JSF.

6) Configurações prontas, vamos copiar os já quase prontos Managed Beans (CreateMovie, ManageMovies e ViewMovie) para o nosso projeto no pacote org.primefaces.examples.moviecollector.view. Você irá notar que eles estarão com erros. Por quê? Porque o Spring Roo utiliza os métodos de acesso dentro das entidades (estilo Active Record), logo, nesse caso, não precisamos das classes de Service. Para ajustar nossas classes, basta retirarmos as dependências das classes de Service e utilizarmos os métodos de merge, find e update de dentro da entidade Movie. Fica como treino.

7)  Por último, copiamos todas as telas xhtml e jsp (index, createMovie, manageMovies, source, template, viewMovie) e suas pastas img e style para a pasta webapp do nosso projeto. 

8)  Pronto! Basta rodar sua aplicação que ela já estará funcionando. Executar esse passos deve demorar cerca de 15-20 min. E ainda podemos adicionar novas entidades utilizando o Roo da maneira que já conhecemos, porém agora precisamos criar as telas para cada necessidade. 

Creio que ajude! Comentários são bem-vindos!

Abraços!




9 comentários:

jeferson disse...

Parabéns pela iniciativa! començando estudar Spring Roo e vou tentar utilizar Primefaces

Gilberto Albino disse...

Que horror... não tem como zipar o projeto não?

Pedro Cavaléro disse...

bem, o ultimo link do artigo eh o do projeto zipado. o roo 1.2 ta vindo com jsf e primefaces nativo, nao vai mais precisar..

Junior disse...

Olá Pedro.
Cara, muito legal seu post. Estou estudando sobre Spring, Hibernate e JSF. E esse seu post é muito bom.
Além disse, fui "apresentado" ao SpringRoo.

Cara, isso é fantástico.
Acabei de assistir o vídeo contido na págin do projeto ( http://www.springsource.org/spring-roo ). Meu é incrível o que ele faz, tipo, alta produtividade. Eu fiquei rindo sozinho aqui, todo surpreso e pensando "Não acredito que criaram isso". É muito alta a produtividade, pelo que eu estou vendo.

E eu não vi isso, do SpringRoo 1.2 estar integrado. Está? Não entendi seu comentário, tipo, não preciso configurar como você fez no post?

Cara, obrigado mesmo pelo seu post. Por compartilhar seu conhecimento.

Obrigado!

Pedro Cavaléro disse...

Olá!
Sim, no Roo 1.2 o JSF com Primefaces já vai estar integrado, aí não vai mais precisar fazer como eu fiz no post. Eu até já fiz um teste (baixando o código atual deles) e está funcionando mto bem. Eu inclusive sugiro esperar sair a versão nova se quiser colocar alguma coisa em produção.
Valeu!

Bruno disse...

Opa, como você fez com o roo 1.2?

Pedro Cavaléro disse...

A versão 1.2.0.RC1 já tem essa funcionalidade. Dá uma olhada no link: http://blog.springsource.org/2011/11/23/spring-roo-1-2-0-rc1-released/
NO Jira deles tem mais informações: https://jira.springsource.org/browse/ROO-516
Abraços!

Unknown disse...
Este comentário foi removido pelo autor.
Tiano disse...

Olá Pedro!
Muito bom seu post.
Depois de lê-lo resolvi criar minha aplicação usando Spring roo 1.2 e STS 2.8. Seria tudo perfeito se não fosse pelo fato do el não está funcionando.

Cara, será que você teria alguma ideia pra me ajudar?

Obrigado.