domingo, 30 de agosto de 2009

Integrando JSF 1.2 com Richfaces e EJB3 utilizando JBOSS AS 5 e Eclipse - Parte I

Como encontrei pouquíssimas fontes de consulta sobre o assunto em sites brasileiros, resolvi escrever esse artigo que visa exemplificar uma das formas de se integrar com sucesso esses três frameworks em sua aplicação. Foi a solução que implementei em meu projeto e espero que seja de utilidade para outros desenvolvedores que possam estar passando pelos mesmos problemas que eu enfrentei para deixar a aplicação funcionando 100% sem bugs.


Esse é meu primeiro artigo e minha intenção é ajudar a comunidade pois obtenho muita ajuda em fórums e outros artigos, por isso quem notar alguma dificuldade me relate mas sem stress! =)

Em primeiro lugar, tenha certeza de possuir todas as libs necessárias. Caso não possua alguma das libs listadas abaixo, coloque o nome do JAR no Google que com certeza várias fontes para download estarão disponíveis. As libs do JBoss vem junto com o servidor, voce deve usá-las para evitar do Eclipse ficar exibindo erros de falta de bibliotecas em cada linha de código que voce escrever que vá usar algum componente de EJB dentro do seu projeto web.

Esse artigo toma por base que você ja saiba como trabalhar com EJB mas nao sabe como utiliza-lo nos seus projetos com JSF.

COMMONS
  • commons-beanutils.jar
  • commons-collections.jar
  • commons-logging.jar
  • commons-digester.jar
  • commons-codec-1.3.jar
  • commons-discovery-0.4.jar
  • commons-el.jar

JBOSS
  • Libs do diretorio "client" do jboss
JSF
  • jsf-api.jar
  • jsf-impl.jar
JSTL
  • standard.jar
  • jstl.jar

Richfaces
  • richfaces-api-3.3.0.GA.jar
  • richfaces-impl-3.3.0.GA.jar
  • richfaces-ui-3.3.0.GA.jar
Outras LIBs
  • jsr250-api.jar
  • jsp-api.jar
  • tomahawk-1.1.6.jar

Listei a api Tomahawk por ela ter me facilitado muito a vida em algumas coisas que a JSF sozinha não conseguiu realizar.

Essas libs devem ser copiadas para o diretorio: <raiz_do_seu_jboss>/server/default/lib e o servidor deve ser reinicializado para reconhecer as novas libs.

Voce tambem poderá marcar as libs para exportação dentro do Eclipse marcando as mesmas na configuração do build-path na guia "Order and Export". Porém as libs abaixo NÃO devem ser marcadas para exportação caso esse método seja escolhido:

Libs do diretorio client do Jboss
  • jsf-api.jar
  • jsf-impl.jar

OBS: Eu não recomendo esse método por deixar o arquivo war final muito grande.

Configuração do diretório web-inf
Desenvolvendo meu projeto, percebi que intermitentemente as tags disponíveis nos TLDs de algumas bibliotecas ficavam indisponíveis como se o container não conseguisse localizar o TLD da tag corretamente. Eu precisava sempre reiniciar o servidor e torcer para que ele localizasse os TLDs nos diretorios META-INF dos JARs das bibliotecas, coisa que nem sempre acontecia. A solução que encontrei para acabar com isso, foi copiar algumas TLDs diretamente para o diretório WEB-INF. Dessa forma, caso você passe por problema semelhante, será necessário copiar os seguintes TLDs para dentro do seu diretorio WEB-INF:
  • a4j.tld
  • ajax4jsf.tld
  • rich.tld
  • richfaces.tld
  • tomahawk.tld

Esses TLDs podem ser encontrados dentro dos diretorios META-INF das suas respectivas bibliotecas.

Configuração do web.xml
Adicionar as seguintes tags no web.xml para configurar o JSF:
<welcome-file-list>
   <welcome-file>index.jsf</welcome-file>
</welcome-file-list>

<context-param>
   <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
   <param-value>server</param-value>
</context-param>

<context-param>
   <param-name>javax.faces.CONFIG_FILES</param-name>
   <param-value>/WEB-INF/faces-config.xml</param-value>
</context-param>


<servlet>
   <servlet-name>Faces Servlet</servlet-name>
   <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
   <load-on-startup>1 </load-on-startup>
</servlet>


<servlet-mapping>
   <servlet-name>Faces Servlet</servlet-name>
   <url-pattern>*.jsf</url-pattern> // extensao que o cliente web utilizará. Pode ser qualquer coisa.
</servlet-mapping>
Observe que a tag <welcome-file-list> aponta para um arquivo index.jsf que deve ser criado em branco com esse nome na raiz da aplicação. É uma técnica utilizada para "enganar" o container de forma que você consiga acessar sua pagina inicial (index.jsp) sem precisar digitá-la no navegador e trabalhando com JSF, voce provavelmente terá problemas com isso se não proceder dessa forma.

É possível alterar a extensão pela qual suas páginas responderão no navegador do cliente. Voce poderá configurar a extensão que quiser (*.jsf, *.java, *.abacaxi, etc). Portanto voce nao esta preso a utilizar 'index.jsf' e 'index.jsp' como suas páginas, voce pode configurar como desejar no welcome-file-list e no <servlet-mapping> de Faces Servlet.

Para configurar o Richfaces, é necessário adicionar as seguintes tags:
<filter>
   <display-name>RichFaces Filter</display-name>
   <filter-name>richfaces</filter-name>
   <filter-class>org.ajax4jsf.Filter</filter-class>
</filter>

<filter-mapping>
   <filter-name>richfaces</filter-name>
   <servlet-name>Faces Servlet</servlet-name>
   <dispatcher>REQUEST</dispatcher>
   <dispatcher>FORWARD</dispatcher>
   <dispatcher>INCLUDE</dispatcher>
</filter-mapping>

<context-param>
   <param-name>org.richfaces.SKIN</param-name>
   <param-value>blueSky</param-value>
</context-param>
blueSky é o tema padrão utilizado nos componentes do richfaces. Temas diferentes podem ser configurados por essa tag.

Configuração do faces-config.xml
É aqui que a integração com o EJB começa a tomar forma. O faces-config.xml é um arquivo XML com a seguinte estrutura básica:
<faces-config>
   <managed-bean>

   (configuração do bean)

   </managed-bean>
</faces-config>

A tag <managed-bean> é a tag que voce é responsável por configurar para integração de seus EJBs no JSF. Abaixo segue um exemplo de um <managed-bean> básico configurado:
<managed-bean>
   <managed-bean-name>exemplo</managed-bean-name>
   <managed-bean-class>pacote.BeanExemplo</managed-bean-class>
   <managed-bean-scope>request</managed-bean-scope>
</managed-bean>
O parâmetro <managed-bean-name> é o nome utilizado pela sua interface JSF mapeado para o controlador do EJB configurado em <managed-bean-class>. O <managed-bean-scope> possui 3 parâmetros aplicáveis: REQUEST, APPLICATION e SESSION, sendo que o mais comumente utilizado é o REQUEST.

Bom, com isso finalizamos a etapa de configuração. Na próxima parte começaremos a criar uma pequena aplicação de exemplo para juntarmos todas as peças simulando um sistema real.

Nenhum comentário:

Postar um comentário