1
G
Módulo
RIA, Extensions e
SOA (BPM e WS/RS)
.A
Este módulo introduz novidades das versões 5.5.x e 6.0.x do jCompany Developer
Suite, em áreas de grande impacto no desenvolvimento de sistemas atuais, tais
como:
o Rich Internet Application: incorporação de recursos Web 2.0 via jQuery, jQuery UI, jQuery
Plugins e jQuery UI Theme Roller, para máxima usabilidade.
o jCompany Extensions: mecanismos de extensão avançados que mesclam recursos de OO do
novo padrão CDI com complementos de Geração de Código do jCompany para formarem um
poderoso instrumento para arquitetos de software definirem novos padrões, do zero ou via
customizações dos disponíveis no jCompany.
o SOA - BPM: integração de referência com solução de Business Process Management (BPM),
trazendo padrões de interação de formulários corporativos desenvolvidos em jCompany com
motores externos de BPM, utilizando o jBPM.
o SOA - JAX-WS 2.0: uso de Web-Services tradicionais, com protocolo SOAP, WSDL, etc., através
de padrões Java EE robustos e de alta produtividade.
o SOA - JAX-RS 1.0: uso de RESTful Web-Services sobre HTTP, com tráfego JSON, XML ou
Text/Plain e também através de padrões Java EE robustos e de alta produtividade
2
Capítulo
Rich Internet Application
(RIA) com jQuery
1
A
22
RIA (Rich Internet Application) no jCompany
- Níveis de RIA no jCompany
Aplicações de Internet são consideradas "ricas" quando incorporam características e funcionalidades
mais típicas de softwares Desktop, ou mesmo superam recursos deste ambiente, como é o caso de
Mashups (recursos que mixam dados de aplicações de negócio e serviços externos, como Google Maps,
por exemplo). Soluções de RIA típicas transferem a maior parte do processamento da interface para o
navegador (Browser), porém preservando a maior parte dos dados e as regras de negócio no servidor de
aplicação.
Em lugar de radicalizar neste aspecto, passando totalmente os recursos de visão para a máquina cliente
(algo que traz também sequelas, como programação intensiva de Javascript ou linguagens menos
robustas e disseminadas relacionadas a Flash, por exemplo), o jCompany oferece um suporte gradual ao
uso de tecnologias RIA, em 3 níveis:
o
Basic: permite que se introduzam componentes de RIA em aplicações existentes, modo
organizado, compreensivo e performático - tanto em tecnologia JSF/Facelets quanto JSF/Tiles ou
mesmo Struts/Tiles, mais antigas. Alguns recursos embutidos e facilmente ativáveis são: autocomplete e seleção Popup modal para vinculados, máscaras mais flexíveis em campos, campos
com altura dinâmica (autogrow), Google Maps para endereços, dentre outros Widgets jQuery UI
como datepicker, introduzidos com a tecnologia Unobstrusive Javascript do jQuery, o que
dispensa alterações em aplicações existentes para serem ativados (pouco intrusivos).
o
Advanced: quando utilizando os novos leiautes via Facelets, o jCompany oferece o uso de Ajax
e jQuery mais refinado, complementando os recursos básicos acima com diversos outros:
redução quase total de submissões "não Ajax" (eliminação de recargas total do navegador),
substituições de trechos menores de formulários nas operações padrões de CRUD via Ajax
(maior performance), processamento do "conforto visual" (esconder itens de menu, abas ou
botões) "no cliente", sobre HTML estático, uso de Widgets jQuery UI para Tab-Folder, Menus e
outros componentes visuais.
o
Extremme (Versão Futura): leva praticamente toda a camada controle para o cliente,
eliminando a necessidade de JSF e outras tecnologias de "camada Visão no servidor",
basicamente operando com HTML estático + Javascript/Widgets e recursos de JAX-RS/AtomPublisher para operacionalizar os formulários - em uma arquitetura RIA mais purista ou extrema.
Importante: o RIA Extremme ainda não está disponível na versão 6.0, sendo prevista para
próximas grandes versões. A versão 6.0 tem foco na incorporação de tecnologias Java EE 6, mas
já traz diversas "partes" do RIA Extremme disponíveis, como JAX-RS 2.0/Atom via jCompany
Services e todos os recursos do RIA Advanced (é base para o RIA Extremme).
Neste capítulo iremos introduzir os recursos "Basic" e "Advanced" para um uso diligente e progressivo de
tecnologias RIA nas aplicações produzidas com jCompany. Isso evita armadilhas típicas de adoção
precoce de uma versão mais extrema, pavimentando caminho para um balanceamento mais maduro
destes recursos, na medida em que amadurecem no mercado.
- jQuery, jQuery UI, jQuery UI Theme Roller e jQuery Plugins
A principal tecnologia de "cliente RIA" adotada no jCompany é também a mais popular dentre as opções
conhecidas: o jQuery e sua arquitetura de Javascript "não intrusivo" ou "não obstrutivo". Esta
elegante e performática arquitetura tomou de assalto o mercado por utilizar um tipo de Design Pattern
"Decorator" para, sem intervenção em um documento HTML gerado (ou estático), introduzir
componentes ricos e poderosos no cliente, conhecidos como Widgets.
4
Capítulo G22
A arquitetura extensível do jQuery também produziu uma das comunidades mais vibrantes nesta área,
que já disponibiliza, literalmente, milhares de plugins (Widgets, utilitários, etc.) para reuso, gratuitos em
sua maioria - e facilmente incorporáveis ao jCompany, como veremos.
A opção por fazer RIA com Browsers e HTML/Javascript, ao menos como primeira opção, é também
natural já que se trata da plataforma mais exigida pelo mercado - e especialmente promissora com a
evolução recente do mercado de navegadores através do Chrome, HTML 5, etc.. Além disso, linguagens
de script como o Javascript estão mais populares e ganham presença mesmo em servidores e outras
engines como o Eclipse BIRT.
Finalmente, o jQuery foi laureado em uma avaliação do Gartner Group de Dezembro/2008 como uma das
tecnologias principais para RIA, dada sua arquitetura, comunidade, arquitetura elegante e aderente aos
padrões Web.
- JAX-RS/jBoss RestEasy e Atom Publishing Protocol (AtomPub)
A maior parte dos componentes RIA precisam comunicar-se com o servidor e devem fazê-lo via Ajax,
para o resultado esperado. A tecnologia de servidor para recepção de mensagens RIA adotada no
jCompany foi o JAX-RS (padrão Java EE 6) via jBoss RestEasy (implementação de referência do padrão
JAX-RS).
Portanto, serviços REST genericamente construídos estão disponíveis para servir dados para
componentes RIA, funcionando quaisquer que sejam os grafos de entidades ou propriedades envolvidos.
Estes serviços são automaticamente habilitados via declarações simples e servem dados nos formatos
Text-Plain, JSON e AtomPub. Os dois últimos são utilizados quando se pretende fazer todo o CRUD
(Incluir, Recuperar, Atualizar e Excluir) de agregações de objetos (Mestre/Detalhe/SubDetalhe) via REST,
o que será melhor abordado nos próximos capítulos.
Reutilizando componentes RIA "prontos para uso"
- Reutilizando componentes RIA integrados a componentes JSF
Componentes RIA "prontos para uso" no jCompany podem ser acionados através do uso de um novo
atributo "riaUsa" disponíveis em diversos componente JSF.
O desenvolvedor deve inserir a chamada ao componente com o seguinte padrão:
riaUsa="nomeComponenteRIA(parâmetro1='valorDoParâmetro1', etc.)".
Essas configurações permitem que o XHTML, ao ser compilado, busque o componente utilizado e o
renderize de maneira não obstrutiva. A Figura G22.1 mostra o exemplo da configuração RIA
autocomplete e seus parâmetros.
Figura G22.1. Configurações no riaUsa de um componente vinculado, para ativar o Widget "autocomplete".
Note que o Widget chama "autocomplete" e que recebe como argumento, neste caso, apenas uma "url"
(diversos outros argumentos podem estar disponíveis, conforme cada Widget). Apenas com esta
declaração, um complexo comportamento de "Auto Complete" será ativado no campo de descrição de
componentes "vinculado": a verificação de digitação, seguida por uma chamada Ajax/REST contra um
serviço genérico no padrão JAX-RS e por fim a apresentação do resultado ao usuário através de um
"combo dinâmico" que permite uma seleção dentre a lista de valores retornados, com filtro local, ao final
dos resultados.
No caso específico deste componente, argumentos como "mínimo de letras digitadas para a pesquisa",
"máximo de itens apresentados no combo", dentre outros, podem ser informados, conforme
documentação do próprio componente.
- Implementando recursos de "auto-complete" em vinculados
Vamos ver a facilidade para se incorporar recurso de auto-complete (típico de aplicações RIA,
popularizado pelo Google), em todos os componentes do tipo "vinculado" (listas Popup), de nossa
aplicação. A Figura G22.2 mostra um exemplo de auto-complete em um XHTML de manutenção que
seleciona "cargo", com explicações sobre como é possível se definir este recurso, para quaisquer outros
casos.
Rich Internet Application (RIA) com jQuery
Figura G22.2. Configuração para "auto-complete". O parâmetro "url" contém o caminho do serviço JAX-RS que
será utilizado para recuperar as informações e a propriedade "nome" será o parâmetro de pesquisa utilizado.
#1. O segredo para se ativar o auto-complete para qualquer caso é o parâmetro "url". Ele deve ser
fornecido incluindo as partes fixas abaixo e substituindo-se as variáveis entre colchetes, de
acordo com cada caso:
'/[nome do projeto]/soa/service/autocomplete.[nome da colaboração]?[nome do campo]'.
A Figura G22. mostra o resultado desta configuração do autocomplete.
Figura G22.3. Widget "auto-complete" funcionando em um projeto jCompany.
Vamos então aplicá-lo, customizando diversos elementos (total de caracteres digitados, máximo
retornado, etc.), para um caso de uso que implementamos na aplicação rhtutorial, ficando o
desenvolvedor incumbido de replicar esta implementação para os demais casos:
1.
Selecione o projeto rhtutorial, abra o diretório "src/main/webapp/WEBINF/fcls/unidadeorganizacional" para editar o arquivo "unidadeorganizacionalMan.xhtml".
A Figura G22.4 mostra o caminho até o XHTML de manutenção.
Figura G22.4. Caminho para o formulário a ser editado.
2.
Digite as propriedade "riaUsa" com parâmetros conforme abaixo, na tag "plcf:vinculado":
riaUsa="autocomplete(url='/rhtutorial/soa/service/autocomplete.unidadeorganizacionalman?q=nom
e', tamanhoMinimo='2', tamanhoLista='3')".
Note que os parâmetros "tamanhoMinimo" e "tamanhoLista" não foram usados anteriormente por
não serem obrigatórios. Eles tratam, respectivamente, do número mínimo de caracteres digitados
para que o autocomplete funcione e do número máximo de resultados que aparecerão no "combo
dinâmico" do auto-complete. A Figura G22.5 mostra as configurações feitas no XHTML de
manutenção.
Capítulo G22
Figura G22.5. Alterações feitas no XHTML de manutenção da lógica "unidadeorganizacional"
3.
Acesse a aplicação e verifique a funcionalidade do auto-complete. A Figura G22. mostra o vinculado
da lógica "Unidade Organizacional" com o componente "autocomplete" ativado.
Figura G22.6. Auto-complete sendo ativado com duas letras e mostrando apenas três resultados.
- Implementando uma "seleção auto-complete".
Esta é uma variação da funcionalidade acima, que também recupera dados de uma entidade através de
uma popup e auto-complete, mas sem requerer um vinculado como componente. Ela funciona de
maneira análoga ao vinculado, mas em campos texto comuns (plcf:texto), sem retornar uma chave
primária associada à descrição, como no primeiro caso. A Figura G22.7 mostra um exemplo deste tipo de
seleção caso quiséssemos buscar descrições de cidades de uma base para replicar no formulário (sem
Object-Id referenciando esta base).
Figura G22.7. Configurações no riaUsa de um projeto jCompany.
#1. O parâmetro "url" fornece para o componente RIA o caminho da lógica de seleção que será
recuperada.
#2. O parâmetro propSelPop fornece para a seleção o campo presente que fará a busca.
A Figura G22.8 mostra o resultado visual deste componente.
Figura G22.8. Widget "selecao" em um projeto jCompany.
Não iremos aplicar no rhtutorial por se tratar de um recurso com funções equivalentes às do vinculado (e
considerando que não existe caso aplicável).
- Implementando "autogrowtextarea" (altura dinâmica) em campos tipo "area".
Este outro plugin jQuery modifica a altura de um campo "area" do jCompany (texto com múltiplas linhas)
dinamicamente, em função de seu conteúdo. A Figura G22. mostra um exemplo deste plugin no XHTML
de manutenção.
Rich Internet Application (RIA) com jQuery
Figura G22.9. Configuração de "altura dinâmica" para campo "textarea"
#1. O parâmetro "tamanhoMaximo" estabelece o maior tamanho em caracteres que o campo pode
assumir.
A Figura G22. mostra um exemplo de "autogrowtextarea" funcionando em uma aplicação jCompany.
Figura G22.10. Widget "autogrowtextarea" em um projeto jCompany.
Este é um componente trivial. Procure componentes "area" na aplicação que desenvolvemos para ativar
este recurso nos locais desejados.
- Implementando múltiplos componentes RIA em um mesmo componente (datemask e datepicker).
O componente de "datepicker" (seleção de datas em calendário) possui diversos argumentos
interessantes e o "datemask" oferece apoio durante a digitação livre.
Para definir mais de um componente, como neste caso, separe-os com ponto e vírgula, conforme abaixo.
A Figura G22. mostra um exemplo de datemask e datepicker no XHTML de manutenção, com argumentos
customizados.
Figura G22.11. Configurações no riaUsa de um projeto jCompany.
A Figura G22. mostra o efeito da customização acima.
Figura G22.12. Componentes RIA "datemask" e "datepicker" em um projeto jCompany.
Agora vamos aplicar o componente "datemask" e "datepicker" no rhtutorial, aproveitando para fazer uma
pequena customização, como o número de meses que aparecem no calendário, para o caso de uso
padrão "funcionario", que implementamos na aplicação rhtutorial:
1.
Selecione o projeto rhtutorial, entre no diretório "src/main/webapp/WEB-INF/fcls/funcionario" e abra
o arquivo "funcionarioMdt.xhtml". A Figura G22.3 mostra todo o processo.
Capítulo G22
Figura G22.13. Caminho para o formulário a ser editado.
2.
Digite as propriedades riaUsa="datemask; datepicker(meses='3')" na tag "plcf:data". O novo
parâmetro inserido, "meses", indica quantos meses aparecerão no componente para o usuário
selecionar. A Figura G22.14 mostra o XHTML corretamente configurado.
Figura G22.14. Widgets "datemask" e "datepicker" configurados no XHTML de manutenção.
3.
Acesse a aplicação e verifique a funcionalidade do datepicker com a apresentação de 3 meses. Note
que o parâmetro "meses" mostra o mês atual e posteriormente os outros meses configurados. A
Figura G22.25 mostra o componente "datemask" e "datepicker" funcionando corretamente.
Figura G22.25. Widgets "datemask" e "datepicker" funcionando em "/funcionariomdt".
- Implementando "fckeditor" (edição multimídia) nas observações de funcionário.
Este outro plugin jQuery ativa o "fckeditor", editor que permite a gravação de texto em formato HTML em
campos área, podendo incluir formatações, links, etc., via edição visual! A Figura G22.36 mostra um
exemplo de Fckeditor no XHTML de manutenção.
Figura G22.36. Ativação de editor multimídia em campo texto
A Figura G22.47 mostra o resultado funcionando no antigo local onde somente texto era possível.
Rich Internet Application (RIA) com jQuery
Figura G22.47. Widget "fckeditor" em um projeto jCompany.
Agora vamos aplicar o componente RIA "fckeditor" com pequenas customizações no caso de uso padrão
"funcionario" do projeto rhtutorial:
1.
Selecione o projeto rhtutorial, entre no diretório "src/main/webapp/WEB-INF/fcls/funcionario" e abra
o arquivo "funcionarioMdt.xhtml".
2.
Digite, na tag "plcf:area", as seguintes propriedades: riaUsa="fckeditor(width='800',height='250')".
Os novos parâmetros fornecidos, width e height, correspondem respectivamente à largura e altura
da área em que estamos inserindo o componente RIA. Todo o processo é mostrado na Figura
G22.58.
Figura G22.58. XHTML de manutenção com componente riaUsa "fckeditor" configurado.
3.
Acesse a lógica funcionário e verifique o componente RIA "fckeditor" funcionando com a altura e a
largura estabelecidas, conforme 19.
Figura G22.19. Caso de uso padrão "funcionario" com "fckeditor" implementado no campo "observacao".
- Implementando um Mashup para exibição visual de endereço via Google Maps.
Mashups são conhecidos por "mixar" dados de várias fontes distintas para um resultado novo e
interessante. O exemplo mais conhecido é o de mixagem dos dados de endereço de uma aplicação
corporativa, antes restritos à sua exibição "textual", com a apresentação do mesmo com os recursos
multimídia do Google Maps.
A Figura G22. mostra um exemplo de configuração do componente Google Maps em um XHTML de
manutenção.
Capítulo G22
Figura G22.20. Configuração de "Mashup" para apresentação de endereço em um mapa do Google.
#1. O parâmetro mapa fornece o mapa inicial que será exibido, como default deve-se preencher
com "google-maps".
#2. O parâmetro "campo" deve conter campos de referência para a busca do endereço correto no
mapa. Note que podemos informar rua e número somente e algum resultado será retornado,
porém com chances de erro devido a duplicidades. Quanto mais precisos forem os campos (UF,
CEP, etc), melhores as chances de retorno da localização desejada.
#3. Elemento "div" que cria o botão e provê o espaço para efetuar a pesquisa e apresentar o mapa,
respectivamente.
A Figura G22.6 mostra o resultado final ativado no cadastro de funcionário.
Figura G22.6. Mapa exibindo endereço no Google Maps!
Agora que já entendemos como funciona o Mashup Google Maps, vamos aplicá-lo em um formulário do
rhtutorial:
1.
Selecione o projeto rhtutorial, entre no diretório "src/main/webapp/WEB-INF/fcls/funcionario" e abra
o arquivo "funcionarioMdt2.xhtml".
2.
Insira as seguintes propriedades do "googlemaps" na primeira tag "plcf:texto" do XHTML de
manutenção de componente:
riaUsa="googleMaps(mapa='google-maps', googleMapsKey=[CHAVE GERADA],
campo='corpo:formulario:enderecoResidencial_logradouro, corpo:formulario:
enderecoResidencial_numero, corpo:formulario:enderecoResidencial_bairro, corpo:formulario:
enderecoResidencial_cep, corpo:formulario:enderecoResidencial_uf ')". Note que a declaração deste
componente pode ser inserida em qualquer tag do formulário.
Rich Internet Application (RIA) com jQuery
3.
Insira o elemento "div" que irá gerar o botão de pesquisa do mapa no XHTML de manutenção,
conforme Figura G22.72.
Figura G22.72. Elemento "div" que renderiza o botão de pesquisa e a apresentação do mapa.
4.
Execute a aplicação rhtutorial e teste na aba "Endereco", o componente RIA criado.
- Implementando máscaras em textos com o componente RIA "textmask".
Este outro plugin jQuery permite que o desenvolvedor aplique diversos tipos de máscaras em campos
textos. Tal funcionalidade é útil ao desenvolvedor, pois permite que campos como "CPF" ou "CNPJ"
tenham suas características (pontos, underscore, etc) reproduzidas na aplicação. A Figura G22.8 mostra
um exemplo de "textmask" em um campo "cpf".
Figura G22.83. Widget "textmask" configurado para "cpf".
#1. O parâmetro "mask" fornece a máscara criada para a aplicação.
#2. Ao preencher o parâmetro "mask" os números que compõem a máscara devem ser
preenchidos com o valor nove. Isso indica que o valor alocado naquele espaço estará entre zero
e nove.
Agora vamos aplicar a máscara de CPF no campo de mesmo nome da aplicação "funcionario" do projeto
rhtutorial:
1.
Selecione o projeto rhtutorial, entre no diretório "src/main/webapp/WEB-INF/fcls/funcionario" e abra
o arquivo "funcionarioMdt.xhtml".
2.
Dentro da tag "plcf:texto", referente ao campo "CPF", insira a seguinte propriedade:
riaUsa="textmask(mask='999.999.999-99')". Note que a máscara criada é idêntica a usada em um
CPF.
3.
Acesse a colaboração de manutenção do funcionário, do projeto rhtutorial, e verifique no campo CPF
o comportamento do componente RIA. A Figura G22.9 mostra o componente .
Figura G22.9. Componente RIA "textmask".
4.
Note que o campo "CPF" agora exige uma "rolagem lateral" para a exibição completa do valor. Isso
ocorre porque inicialmente o campo "CPF" armazenaria 11 dígitos, e com a adição da máscara, o
valor passou a ser de 14 dígitos! Para adequar o tamanho do campo da tabela à quantidade de
dígitos com a máscara, basta alterar o tamanho do campo na entidade e proceder com a geração da
Capítulo G22
tabela novamente (menu Área Técnica, Geração de DDL/Esquema). A Figura G22.105 mostra a
aplicação funcionário com o campo "CPF" ajustado.
Figura G22.10. "textmask" funcionando após ajustes de tamanho.
Criando novos ou reutilizando outros componentes RIA
- Entendendo os padrões arquiteturais para incorporação de novos componentes RIA
Como dito na introdução deste capítulo, existem milhares de outros plugins jQuery disponíveis para
download livre na Web dentre Widgets e utilitários diversos, além dos citados na seção anterior. Com
tantas opções, uma das formas comuns de se deteriorar consideravelmente a compreensão (e, por
consequência, a manutenibilidade) de uma aplicação é incorporando-se um "punhado" destes
componentes RIA de maneira apressada e com critérios aleatórios, artesanais.
Como estes plugins normalmente envolvem arquivos de Javascript/bibliotecas, mídias, CSS e código
Javascript de Ativação, pode-se facilmente produzir um emaranhado de códigos de difícil leitura e em
diversas linguagens/markups diferentes ao longo de um projeto - um verdadeiro caos!
Em alguns casos estes novos componentes serão utilizados em apenas um formulário, mas o mais
comum é que um mesmo componente tenha potencial de reúso por diversos pontos da aplicação ou
mesmo da empresa. Por este motivo, é altamente recomendável que haja um padrão em nível
arquitetural, bem definido, para sua incorporação.
Para fazer frente a esta demanda, o jCompany provê, além dos componentes RIA prontos para uso que
vimos na seção anterior, uma arquitetura apropriada para se introduzir componentes RIA de
maneira compreensiva, produtiva e performática. Esta "mini-arquitetura" dentro da arquitetura
maior definida pelo jCompany estabelece padrões para acomodação de todos os componentes de um
novo plugin jQuery, bem como para seu código de ativação, utilizando convenções que facilitam também
a passagem de argumentos homologados de um Widget, de modo homogêneo.
Com esta arquitetura, pode-se incorporar dezenas de componentes RIA sem incorrer em aumento
excessivo da complexidade do código ou na introdução de problemas de performance, como downloads
excessivos de arquivos Javascript, de CSS ou de mídia. Este processo de incorporação é baseado nos
passos abaixo:
1.
Identificação e download do componente reutilizável (ou codificação de um novo componente "do
zero"). Para reuso, um excelente começo é pelo site http://plugins.jquery.com/.
2.
Distribuição dos arquivos envolvidos no componente, conforme seu tipo, em diretórios padrões da
aplicação. Os principais diretórios são:
CSS: [aplicacao]/res-plc/css/jquery/
Javascript do Componente: [aplicacao]/res-plc/javascript/jquery/
Mídia: [aplicacao]/plc/midia/jquery
Rich Internet Application (RIA) com jQuery
3.
Codificação do Javascript de ativação (unobstrusive) de modo genérico, seguindo os preceitos
abaixo:
o Selecionar dentre todos os argumentos possíveis do plugin aqueles argumentos mais comuns ou
que se pretende disponibilizar para a empresa utilizar, colocando-os entre #{} no Javascript de
ativação. Ex: "#{mask}" para receber um valor de máscara como utilizado no componente
"textmask".
o Salvar este pequeno trecho de javascript em um arquivo cujo nome define aquele a ser utilizado
no atributo "riaUsa", disponível em todas as principais tags JSF do jCompany.
Ex: textmask.js para que se use riaUsa="textmask(...)"
A Figura G22.14 mostra como exemplo o arquivo Javascript de ativação para o auto-complete.
o
Salvar este arquivo Javascript de acionamento no diretório padrão:
[aplicacao]/src/main/webapp/res-plc/javascript/un ("un" de unobstrusive).
o Ativação/Uso destes componentes em tags JSF, passando os argumentos entre parênteses,
conforme os exemplos que vimos.
Figura G22.116. Exemplo de código RIA Javascript.
#1. As variáveis entre "#{}" recebem os valores passados como argumento nas chamadas
declaradas em "riaUsa".
Veja exemplos dos códigos de ativação dos componentes homologados dentro do projeto
"jcompany_visao/res-plc/javascript/un". Perceba que o "id" é utilizado no padrão #{id} mas não precisa
ser passados nas chamadas do "riaUsa" - ele é substituído pelo jCompany pelo "id" do componente JSF
onde o "riaUsa" é declarado.
- Otimizando o download de CSS e Javascript
Imagine que cada componente RIA de um total de 30 reutilizados em uma aplicação corporativa tenha 5
arquivos em média: 1 CSS, 1 Javascript e alguns de mídia (png, gif, etc), além do Javascript de ativação.
Em certo momento da chamada desta aplicação pode-se demandar o download de mais de uma centena
de recursos em diversas chamadas HTTP, degradando a performance consideravelmente.
Para evitar esta escalada de degradação, a arquitetura do jCompany utiliza um recurso poderoso para
garantir o máximo de performance no uso de CSS, Javascript e Mídias, em um ambiente RIA:
1.
Um arquivo "plc.comuns.css" importa todos os arquivos "css" utilizados na aplicação em um único
ponto, garantindo que apenas um download de CSS será realizado em uma única conexão HTTP (há
algumas exceções, para os arquivos CSS trocados dinamicamente pelo usuário, específico de cada
pele).
2.
Outro arquivo "plc.comuns.js" importa todos os arquivos Javascript utilizados na aplicação, de forma
similar ao CSS.
3.
Além disso, o download dos dois arquivos acima ocorre uma única vez na vida da aplicação, graças a
diretivas de caching incluídos automaticamente pelo jCompany no header de cada resposta HTTP,
Capítulo G22
definindo um "max-age" para estes recursos que evitam sua recarga a cada requisição, por
exemplo. (exceto se o usuário clicar no "reload/refresh" do Browser)
Para preservar este mesmo ganho de performance em sua aplicação, o desenvolvedor deve
cadastrar todos os seus arquivos css (folha de estilo) e js (Javascript) nos seguintes facilitadores:
"app.comuns.js" e "app.comuns.css".
Esses arquivos possuem as mesmas funções do "plc.comuns.css" e do "plc.comuns.js". A Figura
G22.12 e a Figura G22.13 mostram os arquivos CSS e Javascript declarados, para um hipotético
componente "richWindow" que possua estes arquivos com mesmo nome:
Figura G22.127. Padrão de declaração de um arquivo CSS no "app.comuns.css".
#1. Função de importação padrão de códigos CSS.
#2. Indica que será inserida uma URL.
#3. Caminho de contexto, ou seja, ele irá pegar o caminho do projeto principal até as pastas em
que se encontram os arquivos CSS. No caso do rhtutorial, o contextPath representaria o
seguinte caminho: rhtutorial\src\main\webapp
#4. Caminho para o arquivo CSS do componente.
Figura G22.138. Padrão de declaração de um arquivo Javascript no "app.comuns.js".
#1. Indica que será escrito no documento um script. Declaração padrão Javascript.
#2. Início do script. Declaração padrão Javascript.
#3. Caminho do contexto, funciona de maneira análoga ao contextPath do "app.comuns.css".
#4. Caminho para o arquivo Javascript do componente.
#5. Fim do script.
É ainda importante que o desenvolvedor entenda e utilize corretamente o modo de execução de sua
aplicação, pois ela influirá decisivamente na maneira como estes arquivos serão servidos em requisições
HTTP.
Quando utilizamos as rotinas Maven de desenvolvimento, a aplicação final (WAR ou EAR) é "carimbada"
no "web.xml", com um parâmetro que indica para o framework que ela está executando "em modo de
desenvolvimento". Este parâmetro é o "modoExecucao=D" (default). Neste caso,nenhuma otimização é
feita, para facilitar a alteração e testes de CSS e Javascript. Já quando usamos alguma rotina de
"Liberação para Produção", este parâmetro é alterado para "modoExecucao=P", e o download de CSS e
Javascript é otimizado, conforme abaixo:
1.
Modo de Desenvolvimento ("modoExecucao=D"): a aplicação continua servindo todos os arquivos
declarados no "app.comuns.css" e no"app.comuns.js" em separado, bem como "plc.comuns.css" e
"plc.comuns.js". Isso viabiliza com que mudanças sejam prontamente liberadas por hot-deploy, por
exemplo.
2.
Modo de Produção ("modoExecucao=P"): com a aplicação neste modo, um "Filter" do jCompany
realiza uma leitura inicial de todos os arquivos CSS ou Javascript declarados, tanto em
"plc.comuns.*" quando em "app.comuns.*", e os serve para o Browser como um único arquivo,
reduzindo drasticamente o número de chamadas HTTP realizadas para se renderizar uma página.
Existe ainda um estado de "modoExecucao=T", utilizado principalmente pelo jCompany QA Suite, que
habilita facilitadores para testes funcionais e também usa a otimização para que possa ser averiguada em
um ambiente de Integração Contínua, por exemplo.
Rich Internet Application (RIA) com jQuery
Sumário
Neste capitulo, discutimos brevemente sobre RIA, envolvendo jQuery e JAX-RS, utilizadas no jCompany
para implementar duas modalidades (graduações) de RIA: Basic e Advanced.
Conhecemos alguns dos principais componentes de RIA disponíveis e vimos a facilidade com que
conseguimos ativá-los, com pouca intrusão e risco de problemas.
Por fim, entendemos a arquitetura que o jCompany provê para que se incorpore um grande número de
componentes RIA (plugins jQuery) sem perda de controle e de performance/escalabilidade.
Download

Cap 22 - Rich Internet Application(RIA) com jQuery