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 3 de 3)

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

Favoritos

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

Na parte 1 e parte 2 dessa série eu expliquei o que é portlet Bridge, como instalar e usar em um básico portlet baseado em JSF e RichFaces(Ajax), e as principais diferenças em um portal server que é atualmente suportado para rodar o JBoss Portlet Bridge. Esse artigo final é focado no desenvolvimento de portlet Seam juntamente com a recaptulação de todas funcionalidades e benefícios abrangidos no último release do JBoss Portlet Bridge. Entretanto, pode beneficiar quem é novo em portlet para voltar e ler os dois artigos anteriores.

 

Agora vamos direto no desenvolvolvimento do portlet Seam.

Seam Portlet Setup

Ferramentas de Desenvolvimento:

Para seguir com esse guia, baixe a última versão do Maven. (Estou usando 2.0.9)
Instale Maven 2.0.9+
Coloque os binarios Maven no seu path

Criação do Projeto:

Cada sabor do bridge vem com seu próprio Maven archetype. Para configurar seu projeto de portlet Seam, execute o seguinte na linha de comando:

 mvn archetype:generate 
   -DarchetypeGroupId=org.jboss.portletbridge.archetypes 
   -DarchetypeArtifactId=seam-basic -DarchetypeVersion=1.0.0.B4 
   -DgroupId=org.my.project -DartifactId=seamproject 
   -DarchetypeRepository=http://repository.jboss.org/maven2/ 
   -Dversion=1.0.0.B4 

Esse archetype particular é modular, significando que o projeto gerado é dividido dentro de sub-projetos para fácil manutenção e melhor separação do código, recursos, e configuração. O diretório 'web' contém markup, imagens e recursos de configuração no WEB-INF xml. 'ejb' contém todos seus código-fonte de Seam EJB3 e qualquer configuração de xml relacionado a persistência e ejb deployment. E finalmente, o diretório 'ear' é usado principalmente para empacotar o projeto e construir o ear.

Se você usou o comando archetype acima, você agora deve ter um diretório 'seamproject'. Siga em frente e navegue na raiz desse diretório e execute:
mvn install
Esse comando deverá baixar qualquer artefato que você não tenha em seu repositório local do Maven e irá também compilar e montar seu arquivo ear.

Rodando e fazendo deploy de seu portlet:

 Agora que você tem um ear para fazer deploy, o próximo comando permite iniciar e fazer o deploy facilmente do seu novo portlet na última versão do JBoss Portal no Jboss Application Server. Se você tem uma instalação local que já baixou ou criou, você pode encontrar instruções sobre como usar uma configuração customizada na documentação bridge.

Navegue no diretório {seamproject}/ear e rode:

 mvn cargo:start -Premote-portal-Dportal-2.7.0.B1

Esse comando vai demorar alguns minutos (dependendo de sua conexão) para baixar a última versão do JBoss Application Server + JBoss Portal localizada no SourceForge.net. Você deveria ver um log similar à imagem acima antes de proceder para o próximo passo. *Note - você pode ver também mensagens WSRP aparecendo continuamente, esse é também um sinal que você está pronto para o próximo passo.

Agora para fazer deploy de seu projeto ear Seam, em um novo terminal aberto, execute o seguinte no mesmo diretório {seamproject}/ear:

 mvn cargo:deploy-Premote-portal -Dportal-2.7.0.B1

Depois de ver que o ear foi instalado em seu log do servidor, visite http://localhost:8080/portal/portal/default/seamproject e verá a seguinte página:

Agora temos um portlet Seam pronto para ser desenvolvido.

Configuration

Existem poucas configurações para fazer para converter seu portlet JSF para uma aplicação Seam completa. A seguite configuração é um adicional na configuração mencionada anteriormente nos artigos da (parte 1 e parte 2). Para ver completo, por favor veja a sessão de configuração da documentação do bridge.

web.xml
------------------

A seguinte configuração é comum em qualquer aplicação Seam e não é diferente para o ambiente portlet:

 

      
org.jboss.seam.servlet.SeamListener

Seam Resource Servlet

org.jboss.seam.servlet.SeamResourceServlet


Seam Resource Servlet
/seam/resource/*

Seam Filter
org.jboss.seam.servlet.SeamFilter

Seam Filter
Faces Servlet
FORWARD
REQUEST
INCLUDE

O parâmetro de contexto ExceptionHandler permite o bridge a lidar adequadamente com excessões Seam. Você pode usar sua própria implementação aqui se desejar:



     org.jboss.portletbridge.ExceptionHandler
    
org.jboss.portletbridge.SeamExceptionHandlerImpl

 

 

Bridgelet é o nome para uma extenção de portlet bridge. A comunidade portlet bridge está ativamente desenvolvendo extenções que melhoram ou trazem mais características do JBoss Portal, Seam, e Richfaces. Por exemplo, o componente seam PortalIdentity(SSO) permite baixar o jar em seu classpath e instantaneamente ter SSO entre Seam e Portal. Essa extencão pode também ser configurada como uma dependência en seu Maven pom (como visto abaixo).

Se você tem uma idéia para um Bridgelet ou gostaria de ajudar com o desenvolvimento de qualquer parde do JBoss Portlet Bridge, encorajamos-o a se tornar ativo em nosso forum e mandar tarefas Jira.

Single Sign On entre JBoss Portal e seu Seam application

O Seam Booking Demo está disponível como um portlet para desenvolvedores usar como referência para desenvolvimento e teste. Para acompanhar e experimentar o SSO Bridgelet você pode verificar o código fonte da demo em http://anonsvn.jboss.org/repos/portletbridge/tags/1.0.0.B4/examples/seam/booking/ e rodar exatamente os mesmos comandos maven para instalação mencionado nesse artigo para fazer o deploy da aplicação e executar.

A pequena versão é:
Navegue na raiz do {SeamBooking} e execute:
mvn install

Navegue no diretório {SeamBooking}/ear e execute:
mvn cargo:start -Premote-portal-Dportal-2.7.0.B1

Agora instale seu projeto Seam, em um novo terminal aberto, rode o seguinte no mesmo diretório ear {SeamBooking}/ear:
mvn cargo:deploy-Premote-portal -Dportal-2.7.0.B1

Uma vez que a demo subir e executar, visite http://localhost:8080/portal/portal/default/SeamBooking e vá em frente e crie uma nova conta clicando "Register New User" e logue com seu novo username e password criado:

Depois do login, verá a tela de busca de hotel e todas partes da aplicação. Entretanto, se olhar para o canto superior da tela, verá que seu login dentro da aplicação Seam não tem nada a ver com o login do JBoss Portal:

Essa é a razão para ter o SSO Bridgelet. SSO permitirá username dasua aplicação JBoss Portal se autenticar via módulo de identidade Seam. Então, vamos tentar:
Com o servidor ainda executando e do mesmo termina que você fez deploy, iremos voltar um diretório para a raiz do {SeamBooking}/ e executar:
mvn install -Psso

Depois vá novamente para o diretório {SeamBooking}/ear e execute:
mvn cargo:deploy-Premote-portal -Dportal-2.7.0.B1

Com esse comando colocamos o jar do SSO dentro da aplicação e reinstalamos o ear.

Agora, vamos voltar para nosso portlet em http://localhost:8080/portal/portal/default/SeamBooking e agora, logue no portal e não na aplicação Seam. Clique no portal login no topo, e use 'admin' para ambos username e password.

Se essa fosse uma aplicação do mundo real, iriamos mudar a UI um pouco para esconder o login da aplicação Seam, e editar outra regra de acesso desde que agora temos SSO.

Depois de logar no JBoss Portal você verá o seguinte em seu Seam e Portal UI:

Daqui, criar sua aplicação será muito mais fácil construir identidades e permissões entre o Portal e sua aplicação Seam. Se seu portlet Seam é baseado no Maven, tudo que é necessário é o seguinte em seu pom.xml:

 

  
org.jboss.portletbridge.extensions.seam
      PortalIdentity
      1.0.0.B4
 

Ou você pode simplesmente baixar o PoralIdentity.jar em seu WEB-INF/lib e estará pronto. Nenhuma outra configuração a mais é necessária.

JBoss Portlet Bridge Beta4 Recaptulação

Como esse é o último artigo da série, essa sessão final é sobre a nova característica no Beta 4, liberado em 11 de Setembro.

Suportando Mudanças no PortletMode

Um PortletMode representa um caminho distinto dentro da aplicação. Existem três modos: view, edit, and help. O ExternalContext.encodeActionURL reconhece o parâmetro string de busca javax.portlet.faces.PortletMode e usa esse valor do parâmetro para configurar o modo do portlet no actionURL ou resposta. Isso significa que a seguinte regra de navegação renderiza o \edit.jspx viewId no portlet em modo de edição:

  

 
/register.jspx
     
edit
/edit.jspx?javax.portlet.faces.PortletMode=edit

Navegando para o último modo viewId

 Por padrão a mudança de modo vai começar no modo sem nenhum estado existente (a priore). Um portlet comum quando entrar eu outro modo (exemplo view -> edit -> view) retorna para a última view (e estado) desse modo de origem. O bridge irá explicitamente interpretar a informação necessária quando retornar para o primeiro modo e pode restaurar o estado apropriado. Esse atributo de sessão mantido pelo bridge está destinado a ser usado por desenvolvedores para navegar de volta para o modo da última localização e estado de um modo de visualização. Como um desenvolvedor precisa descrever uma navegação dinâmica: "da view X retorna para a última view do modo y". Isso é mais facilmente expressado via uma expressão EL como:

  

   
/edit.jspx*
     
view
#{sessionScope['javax.portlet.faces.viewIdHistory.view']}

Nota para Desenvolvedores Portlet

Dependendo da implementação do bridge, quando usado valores do escopo de sessão ou qualquer viewIds que deve conter um parâmetro string de busca, deve ser necessário usar a sintaxe wildcard quando identificar a regra correta. Por exemplo, a expressão retorna um viewId do form /viewId?javax.portlet.faces.PortletMode=view&.... Sem wildcard, quando a navegação subsequente ocorre dessa nova view, a regra de navegação não seria interpretado porque não é a mesma combinação.

Igualmente, o edit.jspx tem uma regra de navegação que direciona usar uma busca string ( /edit.jspx?javax.portlet.faces.PortletMode=edit ). Desenvolvedores são encorajados a usar semelhantes wildcard para assegurar que execute corretamente a mais ampla implementação do bridge.

Manipulando Erros Ajax em um Portlet

Por padrão, manipulação de erros é enviado a um servlet para requisições Ajax. Para Manipular errorb dentro de um portlet, use o seguinte javascript:

 

 

Conclusion

Como mencionado anterirmente, a comunidade do portlet bridge já iniciou contribuições e outras ajudas para o projeto em estagios beta. Apesar do core do projeto ser a especificação JSR-301, existe potencial ilimitado para a integração Seam, Richfaces, e Portal com Bridgelets e outros suportes. Existem vários desenvolvedores contribuindo para o projeto e nós extendemos um agradecimento especial a todas as pessoas que já contribuirão com patches, melhorias, e ajudando a responder perguntas no forum.

No final, esse é um projeto baseado na comunidade, e muitos desenvolvedores que oferecem ajuda e feedback, recebem um novo releases com melhores códigos e outras melhorias. O release GA é esperado para 2009.

Feedback no forum é extremamente útil e bem vindo. Para mais informação sobre o projeto JBoss Portlet Bridge visite a página e a documentação.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

  • Problemas na tradução?

    by Oswaldo Dantas,

    Seu comentário está aguardando aprovação dos moderadores. Obrigado por participar da discussão!

    Percebi que algumas caixas onde deveriam aparecer trechos de código estão vazias ou apresentando o conteúdo incompleto se comparado à versão original (www.infoq.com/articles/jsf-ajax-seam-portlets-pt-3)
    Talvez porque no lugar de &lt;listener&gt; está sendo usado <listener> (eu usei os "character entity references" nessa resposta ou ela apresentaria o mesmo problema)
    Além disso os títulos Configuration e Conclusion deveriam ter sido traduzidos, certo?

  • Re: Problemas na tradução?

    by Oswaldo Dantas,

    Seu comentário está aguardando aprovação dos moderadores. Obrigado por participar da discussão!

    P.S.: Parabéns pela iniciativa de tradução

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

HTML é permitido: a,b,br,blockquote,i,li,pre,u,ul,p

BT