Este artigo foi originalmente publicado em 19 de agosto de 2008 e faz parte da coleção dos melhores artigos de 2008 publicados na InfoQ.
Na Parte 1, nós vimos o básico de rodar um portlet JSF. Nós analisamos a configuração do projeto, 3 configurações básicas em xml que nós necessitamos, um comum desenvolvimento how-to que muitos desenvolvedores de Portlets JSF irão eventualmente encontrar. Agora eu vou mostrar-lhes como melhorar seu portlet com Ajax via o RichFaces component library.
Configuração do Projeto
Ferramentas de Desenvolvimento:
Para seguir com esse guia. baixe a última versão do Maven. (Eu estou usando 2.0.9)
Instale Maven 2.0.9+
Coloque o Maven binaries em seu path
Servidor e binários usados no exemplo:
JBoss Portal 2.7 Beta1
JBoss Portlet Bridge Beta3
No artigo anterior, eu expliquei nosso uso do arquetipos Maven e como o projeto que você está prestes a configurar é automaticamente instalado no JBoss Aplication Server rodando JBoss Portal via Maven. A primeira pequena parte desse artigo está propositalmente idêntica ao artigo anterior para uma maior facilidade de utilização. A única mudança é o atual nome do projeto -- todos os comandos Maven permanecem o mesmo. Uma vez que seu projeto RichFaces é configurado, você terá uma sólida referência e um laboratório experimental para testar alguns códigos de exemplo a seguir.
Agora é hora de gerar o projeto RichFaces, examinar o código fonte, e brevemente passar pela configuração. Finalmente, vamos executar o demo e analisar algumas tarefas de desenvolvimento do mundo real.
Abra o terminal e execute:
mvn archetype:generate -DarchetypeGroupId=org.jboss.portletbridge.archetypes -DarchetypeArtifactId=richfaces-basic -DarchetypeVersion=1.0.0.B3 -DgroupId=org.my.project -DartifactId=richfacesproject -DarchetypeRepository=http://repository.jboss.org/maven2/ -Dversion=1.0.0.B3
Navegue no diretório onde você criou seu novo projeto. Se você usar o exemplo acima, o diretório será “richfacesproject”. Dê uma olhada na estrutura, navegue nos arquivos que foram criados. Você verá a básica estrutura de diretórios do Maven com o código fonte para esse tutorial. Agora será uma boa hora para iniciar sua favorita IDE e importar esse projeto Maven.
Configuração
Existe uma mudança mínima no XML que deve ser feita de imediato para usar qualquer componente do RichFaces. Estas definições são uma extensão para a configuração original mencionada na Parte 1 então eu só irei rever o JSF-relacionados com a configuração para o JBoss Portlet Bridge.
As seguintes configurações irão variar baseado nas suas necessidades individuais. Para manter o artigo focado no desenvolvimento de portlet com AJAX, eu irei explicar somente como essas opções são relacionadas ao seu projeto. Para mais informações veja esta sessão da documentação do RichFaces.
web.xml
--------------
Os scripts e estilo CSS que são necessitados para mostrar os componentes RichFaces podem ser controlados aqui. Para JBoss Portal, nós podemos desligar a leitura dos estilos e scripts pois eles são lidos uma vez no início da página do portal:
org.richfaces.LoadStyleStrategy
NONE
org.richfaces.LoadScriptStrategy
NONE
org.ajax4jsf.RESOURCE_URI_PREFIX
rfRes
Ajax4jsf Filter
ajax4jsf
org.ajax4jsf.Filter
ajax4jsf
FacesServlet
FORWARD
REQUEST
INCLUDE
jboss-portlet.xml
--------------
Esse é onde você especifica o que é lido no início da página do portal. Como você pode ver, "rfRes" é o que especificamos como RESOURCE_URI_PREFIX no web.xml. O próximo passo é inserir nosso servlet_path/RESOURCE_URI_PREFIX para acessar os recursos RichFaces que são servidos no classpath.
Existem 3 arquivos que não necessários propriamente para mostrar e habilitar os componentes RichFaces:
ajaxPortlet
Executando a aplicação demo
Agora nós vamos subir o servidor e instalar seu portlet RichFaces com 2 simples comandos, Uma coisa que vou explicar antes de começar é a diferença na instalação do JBoss Portal entre esse artigo e o anterior. No último artigo nós instalamos em um JBoss App Server rodando a leve demo Portlet Container 2.0. Desde que o artigo foi publicado, nós temos liberado o JBoss Portal 2.7 como um beta. Essa combinação da velha implementação da JSR-168 do JBoss Portal com a nova implementação Portlet 2.0, deu a nós a habilidade de rodar portlets 1.0 e 2.0 no projeto padrão do JBoss Portal. Por isso mantido o rastro da versão parece ser confuso, não é. Apenas mantenha em mente que JBoss Portal 2.7 é a última combinação de tudo que nós temos para oferecer e versões 2.6.x são suportadas por releases estáveis para somente suportar a JSR-168 (portlet 1.0).
Para mais informações na instalação desse portlet demo para uma versão anterior do JBoss Portal (beta ou estável) leia aqui.
Passo 1: Baixar e iniciar o servidor.
Baixe o pacote JBoss App Server com o JBoss Portal 2.7 Beta1 de http://downloads.sourceforge.net/jboss/jboss-portal-2.7.0.B1-bundled.zip
Depois, tenha certeza que você substituiu "path_to_bundle_zip" acima com o caminho absoluto do JBoss Portal 2.7 e execute:
mvn install cargo:start -Plocal-portal -DJBOSS_ZIP_HOME=/path_to_bundle_zip/jboss- portal-2.7.0.B1-bundled.zip -DJBOSS_HOME_DIR=jboss-portal-2.7.0.B1- bundled/jboss-portal-2.7.0.B1
Esse comando talvez pareça muito complexo, mas isso dá a você a oportunidade de empacotar qualquer versão compatível do JBoss App Server e JBoss Portal.
Depois que você ver a saída abaixo, você pode proceder para o próximo passo:
Passo 2: Instalar a aplicação demo
Agora abra um segundo terminal e navegue para sua raiz "richfacesproject
" e execute:
mvn cargo:deploy -Plocal-portal -DJBOSS_ZIP_HOME=/path_to_bundle_zip/jboss- portal-2.7.0.B1-bundled.zip -DJBOSS_HOME_DIR=jboss-portal-2.7.0.B1-bundled/jboss- portal-2.7.0.B1
Não esqueça de substituir o "path_to_bundle_zip" com o caminho correto.
Agora você pode acessar sua demo portlet RichFaces em http://localhost:8080/portal/portal/default/RichFacesEchoPortlet.
Desenvolvimento de Portlet RichFaces
Quando feita uma requisição AJAX de um portlet, é importante saber a diferença entre o portlet e sessão de servlet. Por exemplo, quando um usuário faz uma requisição AJAX dentro de um portlet, isso acontece usando uma sessão crua e a chamada não tem acesso a objetos que estão na sessão do portal. Para esse problema nós implementamos um método que irá permitir-nos acessar a os atributos da sessão do Portlet. Eles tem escopo que é definido usando a janela id value -- por exemplo, se o portlet coloca o valor ‘YourObject’ na sessão do Portlet, isso irá ser armazenado como ‘javax.portlet.p.XYZ?YourObject’ onde XYZ é a janela id.
Para acessar o windowID ou scopeID da UI você talvez use o seguinte:
#{facesContext.externalContext.sessionMap['org.jboss.portletbridge.WINDOW_ID_RETRIVER'].windowID} #{facesContext.externalContext.sessionMap['org.jboss.portletbridge.WINDOW_ID_RETRIVER'].scopeId}
Como você pode ver, facesContext.externalContext.sessionMap
marca o objeto de sessão portlet-scoped. Por que você necessita usar esses valores? Para nomear alguns casos:
- Quando você necessita de autenticação de dados da sessão do portal durante uma requisição AJAX
- Geração de recursos dinâmicos (imagens, scripts, etc...)
Outros Exemplos
Todos os componentes do RichFaces estão disponíveis em um trabalho demo e o código fonte é disponibilizado para baixar aqui. Esse projeto é extremamente útil se você está inseguro da configuração de seus componentes ou se você pensa que isso não funcione no ambiente de portal. O único componente que não está disponível é o componente de upload de arquivo. Ele está agendado para estar disponível no próximo release do portlet bridge provavelmente no início de Setembro.
Como sempre, feedback nos fóruns são extremamente úteis e bem vindos. Para mais informação sobre o JBoss Portlet Bridge visite a página do projeto, documentação, ou wiki.