SlideShare a Scribd company logo
1 of 78
Download to read offline
Construindo Portlets para IBM
WebSphere Portal – Parte 2
+ Melhores Práticas
Rodrigo Reis
IT Specialist & Application Architect
IBM Collaboration Solutions

© 2013 IBM Corporation
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
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
Parte 1: Revisando conceitos de
Portal e Portlets

1878A
4

© 2013 IBM Corporation
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
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
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
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
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
Parte 2: IBM WebSphere Portal API
(Model SPI, REST, WebDAV)

1878A
10

© 2013 IBM Corporation
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
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
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
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
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
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
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
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
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
Laboratório 4: Trabalhando com Model SPI
●

Implementar um portlet usando Model SPI

20

© 2013 IBM Corporation
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
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
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
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
Exemplo: ATOM feed – Portal Navigation Model

25

© 2013 IBM Corporation
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
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
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
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
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
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
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
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
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
WebDAV SPI
WebDAV SPI permite criar serviços baseados no protocolo WebDAV

WebSphere Portal
WebdavTreeModel

HTTP

Portal
WebDAV
Layer

WebdavTreeModelController

35

© 2013 IBM Corporation
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
Parte 3: Criando Portlets com JSF

1878A
37

© 2013 IBM Corporation
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
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
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
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
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
Processamento de um JSF request
1.Restore View
- Recupera a árvore de componentes do cliente ou sessão

43

© 2013 IBM Corporation
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Parte 4: Melhores Práticas

1878A
58

© 2013 IBM Corporation
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Integrando frameworks externos ao RAD

Demonstração

75

© 2013 IBM Corporation
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
Obrigado!!!

Rodrigo Reis
rodrigoareis@br.ibm.com
IT Specialist & Application Architect
IBM Software Services for Collaboration

© 2013 IBM Corporation
© 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

More Related Content

What's hot

Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLFabio Moura Pereira
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendThiago Sinésio
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks phpIgor Moura
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Introdução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPIntrodução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPManoel Afonso
 
Padrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebPadrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebDenis L Presciliano
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openrukoÉverton Ribeiro
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Rodrigo Urubatan
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JSRodrigo Urubatan
 
Aula 1 - curso java web - JSP Java Server Page
Aula 1 - curso java web - JSP Java Server PageAula 1 - curso java web - JSP Java Server Page
Aula 1 - curso java web - JSP Java Server PageEvandro Júnior
 
Curso ASP.Net - Módulo 1
Curso ASP.Net - Módulo 1Curso ASP.Net - Módulo 1
Curso ASP.Net - Módulo 1michellobo
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!Bruno Borges
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteMichael Cardoso
 

What's hot (20)

Curso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTMLCurso de Desenvolvimento de Sistemas Web - (X)HTML
Curso de Desenvolvimento de Sistemas Web - (X)HTML
 
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e ZendAnálise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
Análise sobre a utilização de frameworks em PHP: CakePHP, CodeIgniter e Zend
 
Analise frameworks php
Analise frameworks phpAnalise frameworks php
Analise frameworks php
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Introdução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSPIntrodução ao Desenvolvimento de aplicações WEB com JSP
Introdução ao Desenvolvimento de aplicações WEB com JSP
 
JavaFX 1.2
JavaFX 1.2JavaFX 1.2
JavaFX 1.2
 
Servlets e jsp
Servlets e jspServlets e jsp
Servlets e jsp
 
Servlets e JSP
Servlets e JSPServlets e JSP
Servlets e JSP
 
Padrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações WebPadrões de Projeto J2EE para Aplicações Web
Padrões de Projeto J2EE para Aplicações Web
 
The twelve factor apps and openruko
The twelve factor apps and openrukoThe twelve factor apps and openruko
The twelve factor apps and openruko
 
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015Interfaces ricas com Rails e React.JS @ Rubyconf 2015
Interfaces ricas com Rails e React.JS @ Rubyconf 2015
 
Java Web 1 Introducao
Java Web 1 IntroducaoJava Web 1 Introducao
Java Web 1 Introducao
 
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015  Porto Alegre - Interfaces ricas com Rails e React.JSTDC2015  Porto Alegre - Interfaces ricas com Rails e React.JS
TDC2015 Porto Alegre - Interfaces ricas com Rails e React.JS
 
Curso de JSP
Curso de JSPCurso de JSP
Curso de JSP
 
Aula 05 - Java Script Básico
Aula 05 -  Java Script BásicoAula 05 -  Java Script Básico
Aula 05 - Java Script Básico
 
Aula 1 - curso java web - JSP Java Server Page
Aula 1 - curso java web - JSP Java Server PageAula 1 - curso java web - JSP Java Server Page
Aula 1 - curso java web - JSP Java Server Page
 
Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018Framework web 01 - Aula UTFPR 2018
Framework web 01 - Aula UTFPR 2018
 
Curso ASP.Net - Módulo 1
Curso ASP.Net - Módulo 1Curso ASP.Net - Módulo 1
Curso ASP.Net - Módulo 1
 
GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!GlassFish e Maven: Java EE sem dor!
GlassFish e Maven: Java EE sem dor!
 
Zend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil CompetenteZend Framework 2 - Desenvolvimento Ágil Competente
Zend Framework 2 - Desenvolvimento Ágil Competente
 

Similar to Construindo Portlets para IBM WebSphere Portal

Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Rafael Benevides
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaDr. Spock
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesCI&T
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?Rafael Benevides
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysDr. Spock
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JSRodrigo Urubatan
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVCEder Magalhães
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 

Similar to Construindo Portlets para IBM WebSphere Portal (20)

Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
JSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com JavaJSF 2.0: Uma Evolução nas Interfaces Web com Java
JSF 2.0: Uma Evolução nas Interfaces Web com Java
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Apache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentesApache Wicket - Desenvolvimento WEB orientado a componentes
Apache Wicket - Desenvolvimento WEB orientado a componentes
 
TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?TDC 2014 SP - E o DeltaSpike ?
TDC 2014 SP - E o DeltaSpike ?
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Model View Controller
Model View ControllerModel View Controller
Model View Controller
 
JSF 2.0 e ScrumToys
JSF 2.0 e ScrumToysJSF 2.0 e ScrumToys
JSF 2.0 e ScrumToys
 
Kotlin first
Kotlin firstKotlin first
Kotlin first
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
Backbone.js
Backbone.jsBackbone.js
Backbone.js
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015  - Interfaces Ricas com Rails e React.JSTDC São Paulo 2015  - Interfaces Ricas com Rails e React.JS
TDC São Paulo 2015 - Interfaces Ricas com Rails e React.JS
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
Introducao ao Spring Web MVC
Introducao ao Spring Web MVCIntroducao ao Spring Web MVC
Introducao ao Spring Web MVC
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
Caelum Day In Rio
Caelum Day In RioCaelum Day In Rio
Caelum Day In Rio
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 

Construindo Portlets para IBM WebSphere Portal

  • 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