BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Artigos Melhores da InfoQ em 08: Desenvolvendo Portlets usando JSF, Ajax e Seam (Parte 1 de 3)

Melhores da InfoQ em 08: Desenvolvendo Portlets usando JSF, Ajax e Seam (Parte 1 de 3)

Favoritos

Este artigo foi originalmente publicado em 06 de agosto de 2008 e faz parte da coleção dos melhores artigos de 2008 publicados na InfoQ.

Se você está apenas começando a olhar uma solução usando um portal, ou você quer aprender como é fácil integrar uma nova ou existente aplicação JSF dentro de um ambiente de portal, então esse artigo é para você.

Portais tem ganhado muito espaço ao longo dos últimos anos, como nas empresas e com o novo aperfeiçoamento da especificação portlet 2.0 (JSR 286). O novo portlet 2.0 permite-lhe muita liberdade em agregar diferentes aplicações e apresentando-os em diferentes janelas em uma página. E é claro, você tem autenticação, características de personalização sofisticadas, e melhores formas de tratamento AJAX fora da caixa.

Com a especificação portlet bridge JSR 301, nós agora temos uma forma padrão de executar aplicações JSF em portlet 1.0 e 2.0. O portlet bridge trata o paradigma de portal Ação/Renderização pata tratar o ciclo de vida JSF propriamente. Embora esse tutorial é principalmente para mostrar-lhe como é fácil configurar e desenvolver um portlet JSF, eu também revelarei o novo JBoss Portlet Container 2.0 e alguns dos novos recursos legais.

Esse é o primeiro em uma série de três artigos o qual abrangerá do JSF portlet básico e conhecimento através de portal para uso avançado de AJAX e Seam, em um ambiente de portlet.

Configuração do Projeto

Ferramentas de desenvolvimento:

Para acompanhar esse guia, baixe a última versão do Maven. (Eu estou usando 2.0.9)
Instale Maven 2.0.9+
Coloque o binário do Maven em seu path

Servidor e binários usados no exemplo:

JBoss Portal’s Portlet Container 2.0
JBoss Portlet Bridge Beta3

Atualmente, JBoss Portlet Bridge é a única implementação da especificação JSR 301, o que permite você rodar qualquer combinação de JSF, RichFaces e Seam. A configuração Maven para seu projeto é preparado para baixar o JBoss As e o JBoss Portlet Container 2.0 empacotados juntos. Se você quer baixar eles separadamente, você pode achá-los aqui. De outra maneira, permita o Maven em poucos minutos baixar os arquivos apropriados durante os próximos passos.

Note - Esse portlet pode também rodar na versão atual 2.6.5.SP1 do JBoss Portal. Eu estou usando o JBoss Portlet Container 2.0 para esse artigo, mas o Bridge trabalha com os dois. Você pode ler como configurar e rodar em qualquer versão do Jboss Portal aqui.

O seguinte Maven archetype é uma simples maneira de levantar e rodar rapidamente um projeto inicial (ou template). Uma vez que você rodar esse comando, você terá tudo que você precisa para desenvolver e seguir esse guia.

Abra um termina e rode:

mvn archetype:generate -DarchetypeGroupId=org.jboss.portletbridge.archetypes
 -DarchetypeArtifactId=1.2-basic
 -DarchetypeVersion=1.0.0.B3 -DgroupId=org.whatever.project -DartifactId=myprojectname
 -DarchetypeRepository=http://repository.jboss.org/maven2/ -Dversion=1.0.0.B3

Agora navegue para o diretório onde você criou o novo projeto. Se você usar o exemplo acima, o diretório será "myprojectname". Dê uma olhada nos diretórios, navegue através dos arquivos que foram criados. Você verá a estrutura de diretórios básica do maven com o código fonte para esse tutorial. Agora também seria um bom momento para disparar sua IDE favorita e importar esse projeto Maven.

Requerimentos para configuração do Portlet Bridge

Nesse ponto, o desenvolvimento será muito parecido com o desenvolvimento de qualquer outra aplicação JSF no mundo servlet. A única diferença será lidar com coisas como Single Sign-On, o portletContext e acesso de variáveis que são necessitadas para namespacing, e modos de janelas em nosso portlet como modos de ‘Ajuda’ e ‘Edição’. Eu não vou entrar em detalhes extremos do mundo portlet, mas irei dar a vocês a informação necessária para fazer o desenvolvimento básico. Se você precisa de mais informação sobre portlets por favor leia as especificações JSR 168 ou JSR 286.

O legal sobre JBoss Portlet Bridge é que, ele não é um portlet. Ele é um simples intermediário entre portlet e o mundo JSF. Sua aplicação JSF é um portlet. Seu diretório WEB-INF conterá 3 ou 4 arquivos xml extras juntamente com os jars do Bridge, mas todo o resto fica igual a sua aplicação versão servlet. As únicas diferenças são os arquivos de configuração seguintes:

portlet.xml


...v
javax.portlet.faces.GenericFacesPortlet


javax.portlet.faces.defaultViewId.view
/home.xhtml


javax.portlet.faces.defaultViewId.edit
/jsf/edit.xhtml


javax.portlet.faces.defaultViewId.help
/jsf/help.xhtml

...

web.xml


org.ajax4jsf.VIEW_HANDLERS

org.jboss.portletbridge.application.FaceletPortletViewHandler


javax.portlet.faces.renderPolicy

ALWAYS_DELEGATE

faces-config.xml

 

org.jboss.portletbridge.application.PortletViewHandler

org.jboss.portletbridge.application.PortletStateManager

As configurações acima já estão aplicadas no Maven archetype o qual você configurou. Então agora é hora de compilar o projeto e implantá-lo no JBoss Portal.

Rodando uma aplicação Demo

Compile seu novo projeto e instale em dois passos:

 

Passo 1: mvn install cargo:start -Premote-portal -Dpc20

Esse comando irá levar alguns minutos para baixar o servidor+portal então espere até você ver o seguinte antes de fazer o próximo passo:

*Note - você verá um PortletException antes do servidor ser iniciado. Isso é normal e é parte do Portlet Container 2.0 FailDuringInitPortlet do demo.

Depois abra uma segunda janela do terminal, navegue na raiz do projeto JSF portlet e rode:

Passo 2: mvn cargo:deploy -Premote-portal -Dpc20

Os parâmetros da linha de comando instrui onde o JBoss+Portlet bundle é localizado e qual versão do portal você está rodando. Você pode também rodar esse exemplo na última versão da JSR 168 JBoss Portal 2.6.5SP1. Para mais informações e comandos Maven veja a sessão da documentação JBoss Portlet Bridge encontrada aqui. Para ver o JSF portlet instalado visite: http://localhost:8080/simple-portal/demo/jsr-301.jsp

Desenvolvimento JSF Portlet

Agora, vamos ver algumas coisas que junta portlet e JSF.

Visualizando sua aplicação portlet como uma aplicação web normal

O Portlet Bridge é transparente ao visualizar sua aplicação como uma aplicação web baseada em servlet. Como um deselvolvedor de portlet, é bom checar de vez em quando que o que você está desenvolvendo não está quebrando até porque você está executando-o em um ambiente de portal. Para visualizar essa demo, ou qualquer aplicação instalada com o bridge, você pode visitar http://localhost:8080/JSFRIPortlet/home.jsf

Namespacing

O Bridge captura a combinação de namespacing do JSF em um ambiente de Portal. Nas situações onde você necessita usar o id de um elemento em seu JSF/xhtml, você normalmente veria algo como 'form1:myBtn' na renderização. Mas agora com o bridge namespacing você verá algo similar a:
jbpns_2fdefault_2fNews_2fStories_2fStoryTemplateWindow12snpbj:_viewRoot:form1:myBtn

Para superar isso, você pode usar a seguinte expressão em sua página Facelets para colocar o namespace em seu código javascript:
document.getElementById('#{facesContext.externalContext.response.namespace}the_rest_of_JSF_ID');

Por favor note que com esse uso de portletResponse, uma vez que você tentar visualizar essa página como uma aplicação servlet, será lançado uma exceção. Para evitar isso, você precisa checar o tipo de response em seu backing bean e atribuir uma nova variável namespace "safe" para a UI.

preserveActionParams

Quando preserveActionParams é setado como TRUE em seu web.xml, o bridge deve manter qualquer parâmetro de requisição atribuído durante a ação de requisição do portlet. Os parâmetros de requisição são configurados em "bridge request scope". Quando esse atributo não está presente ou é FALSE os parâmetros de requisição da ação são somente mantidos durante o escopo de requisição do portlet.


javax.portlet.faces.preserveActionParams
true

Usando algo como #{request.yourParam} em sua página Facelets irá utilizar essa configuração.

Excluindo Atributos do Escopo de Requisição Bridge

Quando sua aplicação usa atributos de request em uma requisição básica e você não quer que um atributo em particular seja gerenciado na requisição de escopo estendida, você deve usar a seguinte configuração em sua faces-config.xml. Abaixo você verá que qualquer atributo do namespace como foo.bar ou qualquer atributo começado com foo.baz(wildcard) será excluído do escopo de requisição bridge e somente será usado por requisição de aplicação:

  


foo.bar
foo.baz.*


Ou você pode usar a anotação javax.portlet.faces.annotation.ExcludeFromManagedRequestScope para realizar a mesma coisa anotando a classe que você não quer que inclua no escopo.

Conclusão

Como você pode ver, a especificação da JSR 301 não faz somente a configuração de uma aplicação JSF existente como um portlet mais simples, mas também dá a você (desenvolvedor) uma maneira de manter e capturar as diferenças entre JSF e portlets. Como dito, a espec tem ainda uma pesada revisão. Com a escrita desse artigo, Early Draft Review 3 é a última versão publica mas já houve muitos avanços no topo dessa revisão dentro da JSR 301 Expert Group. Um dos maiores avanços do bridge é o modo-portlet de navegação e o estado que será implementado na próxima versão (Beta 4) do JBoss Portlet Bridge.

Para descobrir mais sobre o projeto, versões compatíveis que são suportadas pelo bridge, ou participar no forum da comunidade por favor visite nossa página do projeto e blog.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT