Construindo portlets para IBM WebSphere Portal – Parte 2
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

Construindo portlets para IBM WebSphere Portal – Parte 2

on

  • 682 views

Segunda parte do workshop de introdução ao desenvolvimento de portlets para IBM WebSphere Portal

Segunda parte do workshop de introdução ao desenvolvimento de portlets para IBM WebSphere Portal

Statistics

Views

Total Views
682
Views on SlideShare
682
Embed Views
0

Actions

Likes
2
Downloads
22
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Construindo portlets para IBM WebSphere Portal – Parte 2 Presentation Transcript

  • 1. Construindo Portlets para IBM WebSphere Portal – Parte 2 + Melhores Práticas Rodrigo Reis IT Specialist & Application Architect IBM Collaboration Solutions © 2013 IBM Corporation
  • 2. Agenda Introdução Parte 1: Revisando conceitos de Portal e Portlets Parte 2: IBM WebSphere Portal API (Model SPI, REST, WebDAV) Parte 3: Criando Portlets com JSF Parte 4: Melhores Práticas 2 © 2013 IBM Corporation
  • 3. Introdução ● ● ● 3 Este workshop não é de introdução a Java ou IBM WebSphere Portal Necessário conhecimento básico de Programação Java para Web (JSP, HTML, XML, JavaScript, Frameworks) e Portlets O objetivo do workshop é apresentar tópicos avançados no desenvolvimento de portlets e explorar as melhores práticas © 2013 IBM Corporation
  • 4. Parte 1: Revisando conceitos de Portal e Portlets 1878A 4 © 2013 IBM Corporation
  • 5. Portal e Portlets ● ● Um Portlet Java é: um componente Web, gerenciado por um portlet container, que processa requests e gera conteúdo dinâmico Portlet container possui grande número de implementações comerciais (IBM, Oracle, OpenText (Vignette), SAP, JBoss, ...) e open source (Apache Jetspeed-2, Liferay, uPortal, ...) Portlet A A C B D 5 Portal Server Portlet Container Portlet D Portlet B Portlet C © 2013 IBM Corporation
  • 6. Portal e Portlets ● O Java Portlet Specification (JSR168, JSR286) padroniza os portlets, permitindo a interoperabilidade de portlets entre diferentes portais. - Java Portlet Specification 3.0 (JSR 362) atualmente em desenvolvimento ● 6 Web Services for Remote Portlets (WSRP) é um protocolo de rede padrão desenvolvido para comunicação remota de portlets © 2013 IBM Corporation
  • 7. Portlet Modes & States ● Um portlet pode conter 3 modos de operação: ● ● Edit – Usuário personaliza o portlet ● ● View – Modo de exibição padrão Help – Exibe janela de ajuda Diferente de aplicações web tradicionais, portlets utilizam apenas uma fração da página. Os seguintes estados de janela estão disponiveis: ● ● Maximize – exibe apenas o portlet na janela ● 7 Minimize – exibe apenas o titulo da janela Restore – exibe o portlet no modo padrão © 2013 IBM Corporation
  • 8. public class HelloWorld extends GenericPortlet { Criando um Portlet public void init (PortletConfig portletConfig) throws UnavailableException, PortletException { super.init(portletConfig); } Desenvolvendo ● public void doView(RenderRequest request, RenderResponse response) throws PortletException, IOException Parte 1: Código do Portlet { response.setContentType("text/html"); response.getWriter().println("Hello Portal World!</p>"); } } <?xml version="1.0" encoding="UTF-8"?> + <portlet-app ...> <portlet> <portlet-name>HelloWorld portlet name</portlet-name> <display-name>Hello World portlet (JSR)</display-name> ● <display-name xml:lang="en">Hello World portlet (JSR)</display-name> Part 2: Portlet descriptor <portlet-class>HelloWorld</portlet-class> <supports> <mime-type>text/html</mime-type> <portlet-mode>view</portlet-mode> </supports> <supported-locale>en</supported-locale> </portlet> </portlet-app> Empacotando & Publicando 8 WAR © 2013 IBM Corporation
  • 9. Checkpoint NÃO é um dos propósitos da especificação JSR168: A – Definir um pacote de portlets para permitir uma implantação fácil B – Permitir a portabilidade entre os portlets do portal C – Definir o modelo de segurança do portlet container D – Definir a API entre o portlet container e portlets E – Definir o ambiente de execução, ou portlet container, para portlets 9 © 2013 IBM Corporation
  • 10. Parte 2: IBM WebSphere Portal API (Model SPI, REST, WebDAV) 1878A 10 © 2013 IBM Corporation
  • 11. Visão Geral Web Experience Suite Browser / Systems Out of the box features Theme / Portlets Custom Portlets Client Engine Markup (HTML) Custom Development REST SPI (Client Side) Model SPI WebDAV SPI Third Party IBM products Data (ATOM,binary…) Custom Development (Server Side – Theme, Extensions) 11 © 2013 IBM Corporation
  • 12. Model System Programming Interface (SPI) O Model SPI encapsula a camada de operação do banco de dados e fornece uma interface de programação para clientes, fornecedores e desenvolvedores do portal Models disponiveis no Portal 8 Content Model Navigation Model Rating Model Resource Model Tag Model Theme Model Layout Model Model SPI Portlet Model Language Model Skin Model Wire Model Markup Model Virtual Portal Model Client Model Navigation Selection Model 12 © 2013 IBM Corporation
  • 13. Relacionamento entre modelos chaves Theme Model Content Model Layout Model Portlet Model Navigation Model Skin Model Wire Model WebApp Portlet PortletDef PortletEnt PortletWin 13 © 2013 IBM Corporation
  • 14. Usando o Model SPI – Operação de Leitura Passo 1: JNDI busca uma instância que implementa a interface Model Home Passo 2: Retorna provedor Model Provider da interface Model Home Passo 3: Retorna argumentos de contexto, dependendo do modelo do provedor de modelo Passo 4: Recuperar um nó do modelo a partir da localização (Locator) ou iterar sobre todos os nós do modelo Melhores Práticas: Guardar a instância de Home para reutilização, elimina a necessidade de invocar repetidamente o lookup JNDI, potencialmente caro. 14 Model Home Model Provider Model Locator Modelnode Modelnode Modelnode © 2013 IBM Corporation
  • 15. Usando o Model SPI – Operação de Leitura Exemplo de como obter o Theme Model: ThemeListHome final Context ctx = new InitialContext(); 1 ThemeListHome home = (ThemeListHome)ctx.lookup(ThemeListHome.JNDI_NAME); 2 ThemeListProvider provider = home.getThemeListProvider(); 3 ThemeList<Theme> model = provider.getThemeList(aRequest); ThemeListProvider ThemeList Iterator<Theme> it = model.iterator(); 4 Locator<Theme> locator = model.getLocator(); Theme theme = locator.findByID(anObjectID); Locator Theme Theme Theme 15 © 2013 IBM Corporation
  • 16. Usando o Model SPI – Operação de Escrita Passo 1: JNDI busca uma instância que implementa a interface ControllerHome ControllerHome Passo 2: Retorna instância do provedor ControllerProvider da interface ControllerHome ControllerProvider Passo 3: Cria um modelo com o provedor ControllerProvider Model Passo 4: Recuperar um nó do modelo a partir do Controller usando localização (Locator) ou iterando sobre todos os nós do modelo Passo 5: Gerenciamento de operações no Controller e nós modificáveis, e a operação de commit (apenas um commit!) Atenção: Liberar o Controller apenas uma vez. 16 Controller Locator Mod.Modelnode Mod.Modelnode Mod.Modelnode © 2013 IBM Corporation
  • 17. Usando o Model SPI – Operação de Escrita Exemplo usando o ThemeList controller: ThemeListControllerHome final Context ctx = new InitialContext(); 1 ThemeListControllerHome home = (ThemeListControllerHome) ctx.lookup(ThemeListControllerHome.JNDI_NAME); 2 ThemeListControllerProvider provider = home.getThemeListControllerProvider(); 3 ThemeListControllerProvider ThemeList ThemeListController<Theme> controller = provider.createThemeListController(aThemeList); CreationContextBuilderFactory creationFct = CreationContextBuilderFactory.getInstance(); CreationContext cContext = creationFct. newDecorationCreationContext("resourceRoot","contextRoot"); ModifiableTheme modTheme = controller. create(Theme.class,cContext); controller.insert(modTheme); 5 controller.commit(); controller.dispose(); 17 ThemeListController Locator Mod.Theme Mod.Theme Mod.Theme © 2013 IBM Corporation
  • 18. Model SPI – Exemplo usando Navigation Interface com usuário Navigation Model Root Home Modelo Administration Applications Search Center Tag Center Getting Started Features CTF Test Page CTF Legacy Test Page final Context ctx = new InitialContext(); NavigationModelHome navHome = (NavigationModelHome)ctx.lookup(NavigationModelHome.JNDI_NAME); NavigationModelProvider navProvider = navHome.getNavigationModelProvider(); NavigationModel<NavigationNode> navModel = navProvider.getNavigationModel(request, response); NavigationNode aNode = navModel.getRoot(); . . . while(navModel.hasChildren(aNode)){ for (Iterator<NavigationNode> it = navModel.getChildren(aNode); it.hasNext();){ NavigationNode child = it.next(); final String title = child.getTitle(aLocale); . . . } } Implementação 18 © 2013 IBM Corporation
  • 19. Checkpoint O modelo a seguir NÃO pertence a Model SPI: A – Resource Center Model B – Portlet Model C – Navigation Selection Model D – Markup Model E – Wire Model 19 © 2013 IBM Corporation
  • 20. Laboratório 4: Trabalhando com Model SPI ● Implementar um portlet usando Model SPI 20 © 2013 IBM Corporation
  • 21. REST Programming Model REST é a base da Web ● Recursos são identificados de forma exclusiva via URI ● HTTP GET representa operações idempotentes ● HTTP POST / PUT / DELETE representam modificações Por que eu deveria seguir o padrão REST? ● ● ● 21 Performance: infra-estrutura de cache HTTP assume REST Funcionalidade: comportamento consistente do botão de voltar Bookmarkability e crawlability © 2013 IBM Corporation
  • 22. REST Programming Model Cliente ● JSR168/286 é costurado em torno de REST – – Action/event phase mapea o HTTP POST – ● Render phase mapea o HTTP GET Render parameters mapeam HTTP URLs Serviços REST Portal Services são fornecidos como REST feeds – Model feeds – User feeds – 22 AJAX WebSphere Portal faz com que seja fácil de seguir o padrão REST ... Serviços do Portal © 2013 IBM Corporation
  • 23. Serviços REST disponíveis no Portal 8 WCM content model (R/W) (R/W) (R/W) (R/W) Content Model wcm cm rm (R/W) (R/W) Layout Model lm Portlet Model (R/W) (R/W) tl REST SPI ll pm Wire Model (R/W) Tagging Model (R/W) tm Navigation Model nm (R/W) (R/W) Rating Model (R/W) (R/W) sl wm cl (R/W) Theme Model (R/W) (R) Language Model (R) (R/W) Skin Model (R/W) Client Model (R) (R) contentmapping (R/W) ContentMapping (R/W) 23 © 2013 IBM Corporation
  • 24. Exemplo: ATOM feed – Portal Navigation Model /wps/mycontenthandler/!ut/p/nm/oid:wps.portal.root? mode=download&digest=Ijd6SHFqhrFcnWe3Pts88A!! Suporte a cache Compressão (se solicitada) 24 (Status-Line) HTTP/1.1 200 OK Server WebSphere Application Server/6.1 Date Thu, 03 Oct 2011 11:54:16 GMT Expires Fri, 04 Oct 2011 11:54:16 GMT Cache-Control private, max-age=86400 Last-Modified Thu, 01 Jan 2011 00:00:00 GMT Content-Location http://wps60.boeblinge...88A!! Content-Type application/atom+xml Content-Encoding gzip Content-Language de-DE Content-Length 523 Accept-Ranges bytes X-Request-Digest Ijd6SHFqhrFcnWe3Pts88A!! © 2013 IBM Corporation
  • 25. Exemplo: ATOM feed – Portal Navigation Model 25 © 2013 IBM Corporation
  • 26. Checkpoint Qual dos modelos a seguir é acessível por REST apenas para leitura? A – Content Model B – Wire Model C – Client Model D – Theme Model E – Layout Model 26 © 2013 IBM Corporation
  • 27. Resource Addressability Framework – URL, URI e Recursos ● Antigamente no WebSphere Portal as URLs especificavam a localização exata dos recursos ● Uniform Resource Locator ● ● ● Um mesmo conteúdo (documentos), por exemplo, pode estar localizado em diferentes páginas e portanto endereçável por URLs diferentes Em alguns casos, no entanto, é desejável poder tratar conteúdos independente da sua localização URL 27 URL URI Uniform Resource Identifier ● Recursos Parte de um contéudo que é identificado … por uma URI e localizado por uma URL Conteúdo != URL Conteúdo © 2013 IBM Corporation
  • 28. Resource Addressability Framework - Piece-of-Content (POC) POC fornece mecanismos para encontrar uma "view" de uma peça-de-conteúdo em um determinado contexto do portal O framework POC acrescenta um ponto de entrada para o WebSphere Portal que permite acessar POCs em uma variedade de mime-types Piece of Content WCM Item Piece of Content Document Markup (HTML) … Data (ATOM, binary, …) 28 POC Framework WebSphere Portal © 2013 IBM Corporation
  • 29. Resource Addressability Framework - Piece-of-Content (POC) Quando usar o framework – para referenciar conteúdo em URLs para usuário – se você quiser link para o conteúdo e não para o estado de navegação (por exemplo, resultados de pesquisa, documentos, etc) Piece of Content (POC) Como uma POC é identificada? A POCé identificada por uma URI (RFC 3986) POCURI = <scheme> : <scheme-specific-part> Interpretado pelo Navigation Model POC framework para tratar a POC Interpretado pelo POC handler Como uma POC é acessada? A URL para um POC pode ser construída via concatenação de string ou via Portal-API /wps/[my]poc[/<vp>]?uri=<scheme>:<ssp> (1) /wps/[my]poc[/<vp>]/<scheme>/<ssp> (2) 29 © 2013 IBM Corporation
  • 30. Data Sources atualmente suportados ByteDataSource ● Nível mais baixo, apenas trasmite bytes CharDataSource ● Transmite caracteres, usado para dados baseado em texto XmlDataSource ● Baseado em XML, usados para feeds, por exemplo JsonDatasource ● Tramite no formato JSON MultipartDataSource ● Combina multiplos data sources em um único multipart stream (usado, por exemplo, por questões de performance para poupar requests) WebdavDataSource ● Transmite POCs pelo protocolo WebDAV Todos Data Sources são transmitidos independentemente do tamanho dos dados! 30 © 2013 IBM Corporation
  • 31. Criação de URLs POC ● ● POC-URLs podem ser geradas via PocService API (com.ibm.portal.resolver.service.PocService) Via uma TAG API <resolver:resolvedURL/> - Entrando com o URI dinâmicamente <%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/resolver" prefix="resolver" %> <form method="GET" action="<resolver:resolvedURL/>"> Enter POC-URI: <input type="text" name="uri" value=""> <input type="submit" name="submit" value=„Display"> </form> - Informando o endereço URI diretamente <%@ taglib uri="http://www.ibm.com/xmlns/prod/websphere/portal/v7.0/resolver" prefix="resolver" %> <a href="<resolver:resolvedURL uri='cm:oid:wps.content.root'/>">Go to Root Page</resolver:resolvedURL> 31 © 2013 IBM Corporation
  • 32. WebDAV System Programming Interface (SPI) ● Extensão HTTP, Web Distributed Authoring and Versioning (RFC 4918) ● Extende metódos HTTP para gerênciamento de recursos (REST) ● Interface fácil de administração e programação ● Grande variedade de softwares implementam este protocolo WebDAV Client OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT WebSphere Portal WebDAV PROPFIND PROPPATCH MKCOL COPY MOVE (UN)LOCK 32 © 2013 IBM Corporation
  • 33. WebDAV Clients Multiplataforma ● AnyClient (Java/httpclient), cURL, DAV Explorer (Java) Windows ● Incluído no S.O. WindowsXP / Windows 7 ● Cyberduck, Bitkinex, Novell NetDrive, WebDrive ● Microsoft Office / Open Office ● Adobe Dreamweaver Linux ● Neon, davfs2, Cadaver, GNOME Nautilus, KDE Konqueror MacOS / iPad ● Incluído no S.O. MacOS, iPad (iWork), Cyberduck 33 © 2013 IBM Corporation
  • 34. Metadata Filestore mirror ThemeList Representação do ThemeList (List) X X X SkinList Representação do SkinList (List) X X X ContentModel Representação do ContentModel (Tree) X X Recurso Descrição Static Content Localized Portal WebDAV – Recursos disponíveis Filestore / JCR Filestore based on JCR 34 X © 2013 IBM Corporation
  • 35. WebDAV SPI WebDAV SPI permite criar serviços baseados no protocolo WebDAV WebSphere Portal WebdavTreeModel HTTP Portal WebDAV Layer WebdavTreeModelController 35 © 2013 IBM Corporation
  • 36. Exemplo de Uso - Portal Theme O tema combina o uso de Model SPI, REST SPI e WebDAV SPI Browser Web Experience Suite Theme Server Engine REST SPI Model SPI Theme Client Engine WebDAV SPI 36 © 2013 IBM Corporation
  • 37. Parte 3: Criando Portlets com JSF 1878A 37 © 2013 IBM Corporation
  • 38. Utilizando Frameworks ● ● ● Frameworks cuidam da infra-estrutura permitindo-nos focar nas funcionalidades Escrever Portlets do zero, sem ferramentas de apoio, é obviamente uma opção Existem várias opções no mercado (JSF, Spring MVC, Struts 2, etc), neste workshop vamos utilizar o JSF 38 © 2013 IBM Corporation
  • 39. Por que Java Server Faces (JSF)? ● Produtividade - Permite criar interface de usuário de forma rápida - Suporte incluso para coisas que de outra forma você teria de codificar por si mesmo: Ajax, Validação, Navegação, etc ● É uma especificação (JSF 2.0 é JSR 314) - Já assimilado por muitas organizações e no mercado - Apoio da IBM: usado em muitos portlets fornecidos - Apoiado por ferramentas como o Rational Application Developer 39 © 2013 IBM Corporation
  • 40. Por que Java Server Faces (JSF)? ● Extensibilidade - Permite criar componentes personalizados e reutilizáveis - Muitas extensões de terceiros disponiveis: PrimeFaces (Prime Technology) IceFaces (IceSoft) RichFaces (Jboss) ADF Faces (Oracle) PrettyFaces (OCPSoft) MyFaces (Apache) ... 40 © 2013 IBM Corporation
  • 41. Arquitetura do JSF ● ● ● ● ● ● Modelo de componentes de interface - É uma estrutura que cria componentes de UI personalizada Modelo de redenrização - Fornece a estrutura para separar as funções dos componentes da forma como ele é processado Modelo de programação orientada a eventos - Fornece um framework manipulador de eventos para processar eventos clientdriven Modelo de conversão ou de formatação - Fornece uma maneira de transformar dados entre o modelo e as camadas de apresentação Modelo de validação - Oferece estrutura de validação para a entrada de dados Modelo de navegação - Fornece rotas de navegação entre as páginas sem a necessidade de escrever código 41 © 2013 IBM Corporation
  • 42. Processamento de um JSF request O ciclo de vida do processamento de um JSF request trabalha com as seguintes estruturas inter-relacionadas: 42 © 2013 IBM Corporation
  • 43. Processamento de um JSF request 1.Restore View - Recupera a árvore de componentes do cliente ou sessão 43 © 2013 IBM Corporation
  • 44. Processamento de um JSF request 1.Restore View 2.Apply Request Values - Decodifica os componentes - Preenche-os com valores do tipo string 44 © 2013 IBM Corporation
  • 45. Processamento de um JSF request 1.Restore View 2.Apply Request Values 3.Process Validation - Converte strings para objetos - Valida os objetos 45 © 2013 IBM Corporation
  • 46. Processamento de um JSF request 1.Restore View 2.Apply Request Values 3.Process Validation 4.Update Model Values - Chama os métodos setters dos managed beans 46 © 2013 IBM Corporation
  • 47. Processamento de um JSF request 1.Restore View 2.Apply Request Values 3.Process Validation 4.Update Model Values 5.Invoke Application - Invoca os métodos - Verifica a navegação 47 © 2013 IBM Corporation
  • 48. Processamento de um JSF request 1.Restore View 2.Apply Request Values 3.Process Validation 4.Update Model Values 5.Invoke Application 6.Render Response - Chama os métodos getters para preencher os componentes 48 © 2013 IBM Corporation
  • 49. Checkpoint Qual dessas fases NÃO faz parte do ciclo de vida de um JSF request A – Restore View B – Process Validation C – Apply Request Values D – Render parameters E – Invoke Application 49 © 2013 IBM Corporation
  • 50. Evolução do Java Server Faces JSF 1.x, 1.2 ● ● ● ● ● Complexidade para criação de componentes Não tem requisições GET apenas POST... URL’s nada amigáveis JSF 2.0 ● ● Templates baseados em Facelets ● Componentes UI com xhtml Sem suporte a Ajax nativo, necessário suporte de terceiros ● Permite uso de JSP, scriptlets (código java na sua página web) ● Configurações baseadas em XML ● 50 Suporte nativo a Ajax e Annotations Navegação implícita e condicional Melhorias no mecanismo de eventos Suporte a requisição via GET, novos escopos © 2013 IBM Corporation
  • 51. Páginas no JSF 2.0 ● ● XML no lugar de JSP... JSP era a tecnologia padrão de Java para Web, inclusive no JSF 1.x Vários conceitos de JSF não são suportados por JSP, e conceitos do JSP se tornam desnecessários para JSF. Exemplo: a necessidade de tradução e compilação dos arquivos JSP. Faz sentido para os JSPs, mas não para o JSF que apenas pretende representar uma árvore de componentes. 51 © 2013 IBM Corporation
  • 52. Páginas no JSF 2.0 ● As páginas da aplicação JSF 2 são definidas através de arquivos xhtml Esses arquivos são processados pela engine do Facelets que faz parte do JSF 2.0 ● ● ● Os Componentes de Interface que formam as telas da aplicação são inseridos através de tags xhtml Suporte à instrução HTTP GET, permitindo usar páginas JSF como favoritos em navegadores Integração com a nova especificação Bean Validation, facilitando a validação de JavaBeans 52 © 2013 IBM Corporation
  • 53. Anotações do JSF 2.0 ● O suporte a anotações faz com que na maioria das vezes não seja necessário ter o arquivo faces-config.xml. Apenas para algumas exceções como message bundle ● Algumas anotações: @ManagedBean @ManagedProperty @*Scoped (View, Session, Application, etc) @FacesConverter @FacesComponent @FacesValidator 53 © 2013 IBM Corporation
  • 54. Suporte Ajax nativo no JSF 2.0 ● Inspirado em frameworks como: ADF Faces, Richfaces, Icefaces ● Javascript ajax API ● Suporte à tag <f:ajax> <h:commandButton id=“btnDelete” action=“#{contactBean.delete}”> <f:ajax update=“contactsList” /> </h:commandButton> 54 © 2013 IBM Corporation
  • 55. Economizando código com Facelets ● Economiza código, promovendo a reutilização ● Manutenção mais rápida ● Não seja um “Code Monkey” 55 © 2013 IBM Corporation
  • 56. Construindo Portlets JSF com o RAD ● Passo 1 - Criar um projeto de portlet que especifica Faces portlet ● Passo 2 - Criar suas páginas ● Passo 3 - Adicionar componentes e dados JSF nas páginas ● ● ● 56 Passo 4 - Configurar atributos para cada componente JSF, incluindo propriedades de conversão e validação Passo 5 - Escrever o código de ação que está associado com os componentes de comando Passo 6 - Especificar regras de navegação para o fluxo da aplicação © 2013 IBM Corporation
  • 57. Laboratório 5: Criando um Faces Portlet ● Criar um portlet do tipo Faces Portlet ● Utilizar componentes JSF ● Publicar o Faces Portlet no portal 57 © 2013 IBM Corporation
  • 58. Parte 4: Melhores Práticas 1878A 58 © 2013 IBM Corporation
  • 59. Diretrizes para codificação de Portlets ● Projeto de portlet O projeto correto de um portlet é dividido em três partes distintas: Model, View e Controller (MVC). Este modelo é o padrão de projeto clássico da orientacão a objetos, onde cada parte é autosuficiente e modular, facilitando a manutenção, extensões, e os avanços ● Construindo com blocos Para aproveitar a flexibilidade dos portlets, eles podem ser utilizados como blocos de construção, os programadores podem projetar pequenos portlets que contêm uma função específica em vez de um grande portlet que inclui todas as funções. 59 © 2013 IBM Corporation
  • 60. Diretrizes para codificação de Portlets ● Não use as variáveis de instância Portlets, assim como servlets, existem como uma instância singleton dentro da JVM do servidor. Os dados armazenados em variáveis de instância estarão acessíveis nas solicitações e entre usuários e pode colidir com outros pedidos. Os dados devem ser passados para métodos internos como parâmetros ● Passe dados para a view como um bean no request Use o objeto RenderRequest para passar dados para a view, de modo que quando o pedido for concluído, os dados estão fora do escopo e eliminados 60 © 2013 IBM Corporation
  • 61. Diretrizes para codificação de Portlets ● Limite o uso da sessão de portlet para armazenamento O PortletSession é um local conveniente para armazenar dados globais, que é específico ao usuário e portlet e que abrange os portlet requests. No entanto, há uma sobrecarga considerável na gestão da sessão, tanto em ciclos de CPU, bem como heap consumption ● Agrupe portlets que utilizam o mesmo back-end em uma aplicação de portlet Adote o conceito de aplicação de portlet agrupando portlets utilizam os mesmos dados de back-end. Os portlets desta aplicação podem compartilhar as definições de configuração, como o nome do servidor ou dados de usuário / senha, dados, etc 61 © 2013 IBM Corporation
  • 62. Diretrizes para codificação de Portlets ● Usar cache, tanto quanto possível Se o conteúdo do portlet é estático por natureza ou é válido por um longo período de tempo antes de ser atualizado, então o seu portlet deve habilitar cache Defina um tempo de expiração padrão no descritor de implementação do portlet (portlet.xml) usando a tag: <expiration-cache> Durante a execução do portlet, pode ser adicionado um tempo de expiração para cada response individualmente usando a chamada: RenderResponse.setProperty (EXPIRATION_CACHE, time) 62 © 2013 IBM Corporation
  • 63. Diretrizes para codificação de Portlets ● Evite usar threads Porque portlets são multi-threaded, gerar child threads pode criar problemas de sincronização. Use threads com extrema cautela e, quando necessário, use-as brevemente ● Evite métodos sincronizados Sincronização provoca um gargalo através de seu portlet, ou um caminho que permite apenas um thread por vez para passar. Além de retardar o portal como um todo, a possibilidade de ocorrência de um deadlock também é alta, o que pode indisponibilizar o portlet ou portal, para todos os usuários 63 © 2013 IBM Corporation
  • 64. Diretrizes para codificação de Portlets ● Inicialize serviços no método init() do portlet Como chamadas JNDI são bastante caras, portlets devem usar serviços de pesquisa JNDI no método init() ● Não use o mesmo nome para portlets e servlets dentro da mesma aplicação web Ferramentas e portais podem usar o nome do portlet para identificar o portlet em um aplicativo Web e podem se confundir, se o aplicativo da Web inclui um servlet com o mesmo nome 64 © 2013 IBM Corporation
  • 65. Diretrizes para codificação de Portlets ● Minimize dependências de JavaScript Porque implementações e comportamento de JavaScript diferem amplamente entre os tipos e versões de navegadores, quanto mais o seu portlet depender de JavaScript, mais dependente de navegador seu portlet se torna ● URIs, nome de elementos HTML, e os recursos JavaScript devem ser namespace encoded Uma vez que muitos portlets podem existir em uma página e é possível que mais do que um portlet produza conteúdo contendo elementos com o mesmo nome, existe um risco de colisão entre elementos, causando problemas funcionais na página 65 © 2013 IBM Corporation
  • 66. Diretrizes para codificação de Portlets ● Forneça informações sobre a versão A fim de permitir aos administradores do portal diferenciar as diferentes versões do aplicativo de portlet e fornecer suporte para a atualização Declare a versão do seu aplicativo de portlet no METAINF/MANIFEST.MF usando o atributo Implementation-Version Use a especificação Java Product Versioning Specification que sugere major.minor.micro, onde: major - identifica alterações funcionais significativas. minor - identifica extensões menores para funcionalidades micro - são ainda menores que a versão minor 66 © 2013 IBM Corporation
  • 67. Diretrizes para codificação de Portlets ● Projete o portlet para caber em uma página com outros portlets Ao contrário de outras aplicações Web, portlets geralmente ocupam uma parte da página. O tamanho da sua janela pode determinar a facilidade com que o portlet pode caber em uma página com várias colunas e outros portlets. Uma janela grande vai "apertar" outros portlets para fora da tela e criar barras de rolagem, resultando em problemas de usabilidade ● Use IFRAMEs com cautela IFRAMEs são uma maneira fácil de incluir conteúdo externo dentro de um portlet, mas mina todo o princípio de portlets. Portanto, IFRAMEs devem ser usados somente em casos muito especiais, como integração de aplicações legadas 67 © 2013 IBM Corporation
  • 68. Diretrizes para codificação de Portlets ● Internacionalize os portlets utilizando resource bundles Use um resource bundle por portlet para internacionalizar a exibição do portlet, e declare este resource bundle no descritor de implementação do portlet ● Crie páginas totalmente acessíveis Para permitir que os usuários do portal com deficiência sejam capazes de usar seu portlet, as páginas devem ser totalmente habilitadas para uso apenas do teclado e outras tecnologias de assistência 68 © 2013 IBM Corporation
  • 69. Adote bons hábitos de documentação de código ● ● ● Comentar código não é necessário para a funcionalidade do portlet, é essencial para a sua manutenção A manutenção de um portlet pode mudar de mãos ao longo do tempo, e portlets bem escritos podem servir como modelos para outros portlets Exemplos de documentação a serem seguidos: a. Insira JavaDoc em todas as classes públicas, variáveis e métodos. Entradas e saídas de documentos b. Incluir comentários na linha, mas não incluí-los na mesma linha do código Java. É difícil alinhar e seguir observações que estão na mesma linha do código c. Use nomes significativos para as variáveis e métodos 69 © 2013 IBM Corporation
  • 70. A importância da interface com o usuário ● ● É onde normalmente os usuários passam a maior parte do tempo realizando suas tarefas diárias Precisa ser simples e amigável 70 © 2013 IBM Corporation
  • 71. Utilizando frameworks JavaScript no seu Portlet ● Por que utiliza-los? - Reduz significativamente o número de recargas da página - Permite tornar atraente experiência do usuário, com efeitos, animações, transições, etc - Existem várias opções no mercado (jQuery, Dojo, ExtJS, Prototype, etc), neste workshop utilizamos o jQuery 71 © 2013 IBM Corporation
  • 72. Utilizando frameworks JavaScript no seu Portlet ● Comportamento de JavaScript em portlets - Não pode assumir nada sobre como outros portlets ou o Portal está usando JavaScript - Não pode assumir que haverá apenas uma cópia do seu próprio conteúdo da página ● Evite problemas - Use <c.url> para se referir aos recursos na sua webapp - Declare variáveis JS com <portlet:namespace/> (isto é RenderResponse.getNamespace ()) - Utilize o Namespace tags HTML importantes da mesma forma - Coloque o código JS em: $(document)ready(function() {...}); 72 © 2013 IBM Corporation
  • 73. Utilizando frameworks JavaScript no seu Portlet ● Exemplo de uso <script src=”<c:url value=”rs/jquery/1.3.2/jquery.min.js” />” <c:set var=”n”><portlet-namespace/></c:set> <div id=”${n}container”> <script type=”text/javascript”> var ${n} = {} ${n}.jQuery = jQuery.noConflict(true); ${n}.jQuery(function() { //Código Javascript aqui } </script> 73 © 2013 IBM Corporation
  • 74. Integrando frameworks externos ao RAD ● ● ● ● Drag and Drop de componentes a partir da paleta de componentes Assistentes de codificação dentro do Editor Customização dos componentes para incluir attributos ou códigos JavaScript associados com o componente Maior produtividade 74 © 2013 IBM Corporation
  • 75. Integrando frameworks externos ao RAD Demonstração 75 © 2013 IBM Corporation
  • 76. Para saber mais... WebSphere Portal and IBM Web Content Manager Information Center http://www.ibm.com/developerworks/websphere/zones/portal/proddoc.html WebSphere Portal and Web Content Manager Business Solutions Catalog https://greenhouse.lotus.com/catalog/ WebSphere Portal developerWorks forum http://www.ibm.com/developerworks/forums/forum.jspa?forumID=168 The WebSphere Portal wiki http://www-10.lotus.com/ldd/portalwiki.nsf/xpViewCategories.xsp?lookupNa me=IBM%20WebSphere%20Portal%208%20Product%20Documentation IBM Redbooks® publications http://www.redbooks.ibm.com/portals/websphere © 2013 IBM Corporation
  • 77. Obrigado!!! Rodrigo Reis rodrigoareis@br.ibm.com IT Specialist & Application Architect IBM Software Services for Collaboration © 2013 IBM Corporation
  • 78. © IBM Corporation 2013. All Rights Reserved. The information contained in this publication is provided for informational purposes only. While efforts were made to verify the completeness and accuracy of the information contained in this publication, it is provided AS IS without warranty of any kind, express or implied. In addition, this information is based on IBM’s current product plans and strategy, which are subject to change by IBM without notice. IBM shall not be responsible for any damages arising out of the use of, or otherwise related to, this publication or any other materials. Nothing contained in this publication is intended to, nor shall have the effect of, creating any warranties or representations from IBM or its suppliers or licensors, or altering the terms and conditions of the applicable license agreement governing the use of IBM software . References in this presentation to IBM products, programs, or services do not imply that they will be available in all countries in which IBM operates. Product release dates and/or capabilities referenced in this presentation may change at any time at IBM’s sole discretion based on market opportunities or other factors, and are not intended to be a commitment to future product or feature availability in any way. Nothing contained in these materials is intended to, nor shall have the effect of, stating or implying that any activities undertaken by you will result in any specific sales, revenue growth or other results. Performance is based on measurements and projections using standard IBM benchmarks in a controlled environment. The actual throughput or performance that any user will experience will vary depending upon many factors, including considerations such as the amount of multiprogramming in the user's job stream, the I/O configuration, the storage configuration, and the workload processed. Therefore, no assurance can be given that an individual user will achieve results similar to those stated here. Adobe, the Adobe logo, PostScript, and the PostScript logo are either registered trademarks or trademarks of Adobe Systems Incorporated in the United States, and/or other countries. Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both. Microsoft and Windows are trademarks of Microsoft Corporation in the United States, other countries, or both. ries in the United States and other countries. Linux is a registered trademark of Linus Torvalds in the United States, other countries, or both. Other company, product, or service names may be trademarks or service marks of others. All references to OpenFinancial, Greenwell and Open Bier refer to a fictitious company and are used for illustration purposes only. © 2013 IBM Corporation