1 - UFSC

Propaganda
UNIVERSIDADE FEDERAL DE SANTA CATARINA
Aplicações Ricas com Ajax
Ulysses Kuntze
Florianópolis - SC
2008/01
UNIVERSIDADE FEDERAL DE SANTA CATARINA
DEPARTAMENTO DE INFORMÁTICA E ESTATÍSTICA
CURSO DE SISTEMAS DE INFORMAÇÃO
Aplicações Ricas com Ajax
Ulysses Kuntze
Trabalho de conclusão de
curso apresentado como parte
dos requisitos para obtenção
do grau de Bacharel em
Sistemas de Informação.
Florianópolis - SC
2008/01
Ulysses Kuntze
Aplicações Ricas com Ajax
Trabalho de conclusão de curso apresentado como parte dos
requisitos para obtenção do grau de Bacharel em Sistemas de
Informação.
Orientador:
_________________________________
Rogério Cid Bastos
Banca Examinadora: _________________________________
Fernando Ostuni Gauthier
_________________________________
Masanao Ohira
Agradecimentos
Agradeço a minha família, pelo apoio e motivação.
Agradeço ao Rogério, Cislaghi, Marta e Mauro pela paciência e
indispensável ajuda.
Muito obrigado a todos vocês.
Sumário
Lista de Figuras .................................................................................................. 9
Lista de Quadros .............................................................................................. 11
Lista de Tabelas ............................................................................................... 13
Lista de Reduções............................................................................................ 14
Resumo ............................................................................................................ 15
1
Introdução ................................................................................................. 16
1.1
Considerações Iniciais ....................................................................... 16
1.2
Justificativa ........................................................................................ 17
1.3
Objetivos ............................................................................................ 17
1.3.1
Objetivo Geral ............................................................................. 17
1.3.2
Objetivos Específicos .................................................................. 17
1.4
2
3
Limitações .......................................................................................... 18
Repensando o modelo de interatividade Web ........................................... 18
2.1
Clientes ricos ..................................................................................... 19
2.2
Comparando as experiências do usuário ........................................... 19
2.3
Latência de rede ................................................................................ 20
2.4
Interações assíncronas ...................................................................... 21
2.5
Padrões de uso soberano e transitório .............................................. 23
2.6
Desaprendendo a Web ...................................................................... 24
Ajax ........................................................................................................... 24
3.1
Os quatro princípios definidores do Ajax............................................ 25
3.1.1
O navegador hospeda uma aplicação, não o conteúdo. ............. 25
3.1.2
O servidor fornece dados, não conteúdo. ................................... 28
3.1.3
A interação do usuário com a aplicação pode ser fluente e
contínua 30
3.1.4
3.2
Uma codificação real requer disciplina ....................................... 32
Ajax no mundo real ............................................................................ 33
3.2.1
Google Maps............................................................................... 34
3.2.2
Google Mail ou GMail ................................................................. 37
3.2.3
Desktop Online ........................................................................... 39
3.2.4
Google Docs ............................................................................... 41
3.3
Alternativas ao Ajax ........................................................................... 43
3.3.1
Adobe Flash, Adobe Flex e Laszlo ............................................. 43
3.3.2
Java Web Start e Microsoft No Touch Deployment .................... 44
3.4
Os elementos-chave do Ajax ............................................................. 45
3.4.1
Orquestrando a experiência do usuário com JavaScript ............. 47
3.4.2
Definindo a aparência e o comportamento com CSS ................. 48
3.4.2.1
Seletores CSS ..................................................................... 49
3.4.2.2
Propriedades de estilo CSS ................................................. 52
3.4.3
Organizando a interface usando DOM ........................................ 53
3.4.3.1
3.4.3.1.1
Localizando um nó DOM .................................................. 55
3.4.3.1.2
Criando um nó DOM ......................................................... 56
3.4.3.1.3
Adicionando estilos ao documento ................................... 57
3.4.3.1.4
Utilizando a propriedade InnerHTML ................................ 58
3.4.4
Carregando dados assincronamente .......................................... 58
3.4.4.1
IFrames................................................................................ 59
3.4.4.2
Objetos XMLDocument e XMLHttpRequest......................... 60
3.4.4.3
Enviando uma solicitação para o servidor ........................... 61
3.4.4.4
Usando funções de retorno de chamada ............................. 62
3.4.5
3.5
Trabalhando com DOM utilizando JavaScript ...................... 55
Ciclo de vida completo ................................................................ 64
JSON ................................................................................................. 68
3.5.1
O Objeto Literal JavaScript ......................................................... 68
3.5.2
O que é JSON............................................................................. 69
3.5.2.1
Objeto .................................................................................. 70
3.5.2.2
Array .................................................................................... 71
3.5.2.3
Valor .................................................................................... 71
3.5.2.4
String ................................................................................... 73
3.5.2.5
Número ................................................................................ 74
3.5.3
Parsers JSON ............................................................................. 74
3.5.4
JSON vs XML ............................................................................. 76
3.6
O que diferencia o Ajax ...................................................................... 77
3.7
Vantagens e desvantagens ................................................................ 80
3.7.1
Vantagens ................................................................................... 80
3.7.1.1
Vantagens com relação à usabilidade ................................. 80
3.7.1.1.1
Tempos de espera mais curtos ........................................ 81
3.7.1.1.2
Validações automáticas em formulários ........................... 81
3.7.1.1.3
Páginas de confirmação ................................................... 82
3.7.1.1.4
Operações de Mestre-detalhe .......................................... 82
3.7.1.1.5
Autocompletar em campos de formulário ......................... 83
3.7.1.1.6
Manipulação de dados mais interativa ............................. 83
3.7.1.1.7
Navegação em estruturas hierárquicas profundas ........... 83
3.7.1.1.8
Interação do usuário com a aplicação .............................. 84
3.7.1.1.9
Rápida interação entre usuários ....................................... 84
3.7.1.1.10
Avançados controles e UI Widgets ................................. 84
3.7.1.1.11
Recarregamento de informações ................................... 84
3.7.1.2
Desempenho e compatibilidade........................................... 85
3.7.1.3
Dispositivos móveis ............................................................. 86
3.7.1.4
Web Standards .................................................................... 86
3.7.1.5
Independência de tecnologia do lado servidor..................... 86
3.7.1.6
Inúmeros frameworks de qualidade ..................................... 86
3.7.1.7
Adoção maciça da indústria ................................................. 87
3.7.2
Desvantagens ............................................................................. 87
3.7.2.1
Desvantagens em relação à usabilidade ............................. 87
3.7.2.1.1
Botão voltar e favoritos ..................................................... 87
3.7.2.1.2
Feedback ao usuário ........................................................ 87
3.7.2.1.3
Scrolling ............................................................................ 88
3.7.2.1.4
Rompimento das convenções existentes ......................... 88
3.7.2.1.5
Indexação ......................................................................... 88
3.7.2.1.6
Percepção do usuário ....................................................... 88
3.7.2.1.7
Eliminar aceitação ............................................................ 89
3.7.2.1.8
Quebrar o foco do usuário ................................................ 90
3.7.2.2
Desvantagens em relação à implementação ....................... 90
3.7.2.2.1
Aumenta a quantidade dos testes .................................... 90
3.7.2.2.2
Adiciona complexidade ..................................................... 91
3.7.2.2.3
Debuging difícil ................................................................. 91
3.7.2.2.4
Código-fonte fácil de pegar............................................... 91
3.7.2.2.5
Disponibilidade do objeto XMLHttpRequest ..................... 92
3.7.2.2.6
Sobrecarga do servidor .................................................... 92
3.7.2.2.7
3.8
Segurança .......................................................................................... 93
3.8.1
4
5
Lidando com assincronia .................................................. 93
Formas de Interação de uma Aplicação Ajax ............................. 94
A Aplicação UFSC Maps ........................................................................... 95
4.1
Tecnologias Empregadas .................................................................. 96
4.2
Telas .................................................................................................. 96
4.2.1
Tela Principal .............................................................................. 96
4.2.2
Tela de Cadastro ...................................................................... 100
4.2.2.1
Cadastro de Marcador ....................................................... 100
4.2.2.2
Cadastro de Polígono ........................................................ 102
Conclusão ............................................................................................... 103
5.1
Considerações finais ........................................................................ 103
5.2
Sugestões para futuros trabalhos .................................................... 103
Referências Bibliográficas .............................................................................. 105
Apêndice A
A.1
Ferramentas .......................................................................... 107
IDEs e IDEs Plugins ......................................................................... 107
A.1.1
Aptana ...................................................................................... 107
A.1.2
JSEclipse .................................................................................. 108
A.1.3
MyEclipse ................................................................................. 109
A.2
DOM Inspectors ............................................................................... 110
A.2.1
Firefox DOM Inspector .............................................................. 110
A.2.2
Internet Explorer Developer Toolbar ......................................... 111
A.3
Debuggers ....................................................................................... 112
A.3.1
Venkman JavaScript Debugger ................................................ 112
A.3.2
Firebug debug extension for Firefox ......................................... 113
A.4
Javascript Unit-Testing..................................................................... 114
A.4.1
Scriptaculous Unit-Testing ........................................................ 114
A.4.2
JsUnit (Hieatt) ........................................................................... 114
A.4.3
JsUnit (Schaible) ....................................................................... 115
Apêndice B
Frameworks e bibliotecas ...................................................... 116
B.1
Dojo.................................................................................................. 116
B.2
ExtJS................................................................................................ 116
B.3
Yahoo! UI ......................................................................................... 116
B.4
Prototype.......................................................................................... 117
B.5
Script.aculo.us ................................................................................. 117
B.6
JQuery ............................................................................................. 117
B.7
Mochikit ............................................................................................ 117
B.8
OpenRico ......................................................................................... 118
B.9
Quooxdoo ........................................................................................ 118
B.10
Mootools ....................................................................................... 118
B.11
Ruby on Rails ............................................................................... 118
B.12
DWR - Direct Web Remoting ........................................................ 119
B.13
GWT - Google Web Toolkit .......................................................... 119
Anexos ........................................................................................................... 120
Lista de Figuras
Figura 1
Ciclo de vida típico de uma aplicação Web clássica [3]. ................ 26
Figura 2
Ciclo de vida de um aplicativo Ajax [3]. .......................................... 27
Figura 3
Distribuição do conteúdo entregue (A) por um aplicativo Web
clássico e (B) por um aplicativo Ajax. A medida que o aplicativo continua a ser
utilizado, aumenta o tráfego acumulado (C). .................................................... 29
Figura 4
Página inicial do Google Maps. ...................................................... 35
Figura 5
Pop-up aberta ao clicar em um item do resultado da pesquisa. ..... 36
Figura 6
Interface do GMail com apresentação de mensagens de forma
escalonada, mensagens instantâneas e corretor ortográfico. .......................... 38
Figura 7
Protopage ....................................................................................... 40
Figura 8
Goowy ............................................................................................ 40
Figura 9
Online Operating System ............................................................... 41
Figura 10
Página Inicial do Google Docs .................................................... 42
Figura 11
Planilha do Google Docs. ........................................................... 42
Figura 12
Os quatro componentes principais do Ajax [3]. ........................... 46
Figura 13
O DOM representa um documento HTML em forma de arvore. . 54
Figura 14
Seqüência de eventos em uma comunicação assíncrona [3]. .... 60
Figura 15
Resultado da execução da solicitação visualizado no Internet
Explorer.
66
Figura 16
Resultado da execução da solicitação visualizado no Mozilla
Firefox.
66
Figura 17
Objeto em notação JSON ........................................................... 70
Figura 18
Array em notação JSON ............................................................. 71
Figura 19
Valor em notação JSON ............................................................. 72
Figura 20
String em notação JSON ............................................................ 73
Figura 21
Número em notação JSON ......................................................... 74
Figura 22
Uma página com componentes Ajax embutidos [3]. ................... 78
Figura 23
Uma aplicação Ajax em que ilhas de conteúdo do tipo documento
podem ser carregadas ou declaradas programaticamente. ............................. 79
Figura 24
Validação automática no servidor de nome de usuário em
formulário
81
9
Figura 25
Exemplo de operação mestre-detalhe ........................................ 82
Figura 26
Exemplo de autocompletar em campo no Google GMail. ........... 83
Figura 27
Exemplo de busca de informações atualizadas no servidor. ...... 85
Figura 28
Exemplos de feedback ao usuário .............................................. 88
Figura 29
Comparativo entre os modelos de interação .............................. 89
Figura 30
Focando a percepção as áreas atualizadas de forma sutil ......... 89
Figura 31
Tela inicial da aplicação. ............................................................. 97
Figura 32
Menu de mapeamentos expandido. ............................................ 98
Figura 33
Toolbar com botões selecionados. ............................................. 99
Figura 34
Tela de atualização de marcador. ............................................. 100
Figura 35
Tela de cadastro de marcador. ................................................. 101
Figura 36
Tela de cadastro de polígono.................................................... 102
Figura 37
Aptana Studio IDE .................................................................... 108
Figura 38
JSEclipse .................................................................................. 109
Figura 39
MyEclipse ................................................................................. 110
Figura 40
Firefox DOM Inspector .............................................................. 111
Figura 41
Internet Explorer Toolbar .......................................................... 112
Figura 42
Venkman JavaScript Debugger ................................................ 113
Figura 43
Firebug ...................................................................................... 114
10
Lista de Quadros
Listagem 1
Exemplo de seletor e declaração de estilo. ................................ 49
Listagem 2
Seletor por tipo de tag HTML. ..................................................... 49
Listagem 3
Seletor por tipo de classe declarada. .......................................... 50
Listagem 4
Atribuição de classe de estilo...................................................... 50
Listagem 5
Estilo textolaranja........................................................................ 50
Listagem 6
Elemento com mais de uma classe de estilo. ............................. 50
Listagem 7
Combinação de classes com regras baseadas em elementos. .. 51
Listagem 8
Seletor por ID único de elemento................................................ 51
Listagem 9
Pseudo-seletores. ....................................................................... 51
Listagem 10
Exemplo de propriedades para estilização de fontes. ............. 52
Listagem 11
Exemplo de propriedades para estilização de layout .............. 52
Listagem 12
Propriedade background-image. ............................................. 53
Listagem 13
Atribuição de ID a um elemento DOM. .................................... 55
Listagem 14
O método getElementById(). ................................................... 55
Listagem 15
A propriedade childNodes. ...................................................... 56
Listagem 16
O método createElement(). ..................................................... 56
Listagem 17
O método createTextnode(). ................................................... 57
Listagem 18
O método appendChild(). ........................................................ 57
Listagem 19
A propriedade className. ...................................................... 57
Listagem 20
A propriedade style. ................................................................ 58
Listagem 21
A propriedade innerHTML. ...................................................... 58
Listagem 22
Exemplo de função de criação do objeto XMLHttpRequest. ... 61
Listagem 23
Exemplo
de
envio
de
solicitação
através
do
objeto
XMLHttpRequest. 62
Listagem 24
Exemplo de rotina de retorno de chamada. ............................ 63
Listagem 25
Exemplo de ciclo de vida completo de carga de um documento.
64
Listagem 26
Arquivo XML retornado como resposta no exemplo ................ 67
Listagem 27
Método onReadyState modificado para receber uma resposta
em XML
67
Listagem 28
Método toConsole modificado para receber uma resposta em
XML
67
11
Listagem 29
Requisição pedindo um arquivo XML ...................................... 68
Listagem 30
Exemplo de objeto literal JavaScript ....................................... 69
Listagem 31
Exemplo de um objeto em notação JSON .............................. 70
Listagem 32
Exemplo de um array em notação JSON ................................ 71
Listagem 33
Exemplo de valores e estruturas aninhadas em notação JSON
72
Listagem 34
Exemplo de string em notação JSON ..................................... 73
Listagem 35
Conteúdo do arquivo json.txt ................................................... 75
Listagem 36
Método onReadyState modificado para receber uma resposta
JSON
75
Listagem 37
Método toConsole modificado para receber um parâmetro
JSON
75
Listagem 38
Requisição de resposta em formato JSON ............................. 76
Listagem 39
Exemplo em formato XML ....................................................... 76
Listagem 40
Exemplo em formato JSON ..................................................... 76
12
Lista de Tabelas
Tabela 1
Os elementos-chave do Ajax .......................................................... 45
Tabela 2
Vulnerabilidades por tipo de interação. .......................................... 94
13
Lista de Reduções
API
Application Programming Interfaces
CSS
Cascading Style Sheets
DOM
Document Object Model
HTML
HyperText Markup Language
HTTP
Hypertext Transfer Protocol
IDE
Integrated Development Enviroment
JSON
JavaScript Object Notation
MIME
Multipurpose Internet Mail Extensions
RIA
Rich Internet Application
RPC
Remote Procedure Call
RSS
Really Simple Syndication
UFSC
Universidade Federal de Santa Catarina
UI
User Interface
URL
Uniform Resource Locator
Web
World Wide Web
W3C
World Wide Web Consortion
WYSIWYG What You See Is What You Get
XHTML
Extensible HyperText Markup Language
XML
Extensible Markup Language
XSLT
Extensible Stylesheet Language Transformation
14
Resumo
A indústria se reinventa, conceitos e fundamentos pré-existentes são lançados
novamente ao mercado sob uma nova ótica. Iniciativas como Gmail, Google
Maps, Netvibes, Meebo, entre outras, despertaram a atenção de milhares de
desenvolvedores, que começam a reavaliar o processo de criação de interfaces
e aplicações Web. Em paralelo, a forma como os sistemas são projetados
também passa por mudanças profundas conceituais. A euforia sobre estes
conceitos, mais especificamente Web 2.0, RIA e Ajax, traz à tona novas
oportunidades.
Este trabalho tem por objetivo apresentar os conceitos, objetivos, tecnologias e
demais questões envolvidas na abordagem de desenvolvimento de aplicações
Web
conhecida
como
Ajax.
E
prover
uma
aplicação
Web
de
georeferenciamento do campus da UFSC utilizando a abordagem Ajax.
Palavras-chave: Ajax, RIA, Web 2.0, Desenvolvimento Web, DOM, CSS,
XMLHttpRequest, JSON
15
1 Introdução
1.1 Considerações Iniciais
A indústria se reinventa: conceitos e fundamentos pré-existentes são lançados
novamente ao mercado sob uma nova ótica. A euforia sobre estes conceitos,
mais especificamente Web 2.0, RIA e Ajax, traz à tona novas oportunidades,
em diferentes nichos, e faz alusão à bolha em meados de 2000 1.
Este novo movimento está centrado em soluções focando uma só idéia: mudar
o paradigma de como enxergamos a Web. Esta passará a ser plataforma e não
somente meio [8].
Até os tempos atuais, o paradigma que orientou muitas iniciativas na Web foi
utilizá-la como meio de comunicação, prospecção de clientes, disseminação de
campanhas e afins. Utilizá-la como plataforma de operações era até o presente
momento inviável, por questões meramente oftalmológicas: miopia estratégica
das empresas [1].
Nos dias atuais, grandes partes das atividades computacionais dos usuários
estão ocorrendo via Web, e com isto, cada vez mais e mais empresas estão
disponibilizando versões Web de seus aplicativos tradicionalmente desktops.
Iniciativas como Gmail2, Google Maps3, Netvibes4, Meebo5, entre outras,
despertaram a atenção de milhares de desenvolvedores, que começam a
reavaliar o processo de criação de interfaces e aplicações Web.
Em paralelo, a forma como os sistemas são projetados também passa por
mudanças profundas conceituais, gerando assim inúmeras possibilidades
inovadoras ao mercado.
1
10 de Março de 2000, dia em que o índice NASDAQ atingiu seu pico máximo.
2
Disponível em http://mail.google.com.
3
Disponível em http://maps.google.com.
4
Disponível em http://www.netvibes.com/.
5
Disponível em http://www.meebo.com/.
16
1.2 Justificativa
O Ajax atende a uma necessidade do mercado para clientes baseados na Web
mais ricos e mais responsivos e que não precisam de nenhuma instalação
local. O Ajax é capaz de entregar tudo isto utilizando apenas as tecnologias já
instaladas na maioria dos navegadores Web modernos, sem a necessidade de
instalação de plug-ins6 ou outros recursos adicionais.
Com o Ajax, pegamos algumas tecnologias antigas e as estendemos muito
além de seu escopo inicial.
1.3 Objetivos
A seguir serão apresentados os objetivos do presente trabalho.
1.3.1 Objetivo Geral
Apresentar os conceitos, objetivos, tecnologias e demais questões envolvidas
na abordagem de desenvolvimento de aplicações Web conhecida como Ajax.
Prover uma aplicação Web utilizando a metodologia Ajax. A aplicação tem
como escopo prover o georeferenciamento do campus da UFSC utilizando a
API Google Maps7.
1.3.2 Objetivos Específicos
Para atingir o objetivo geral supracitado, neste trabalho serão explanados os
seguintes tópicos:

Origem e definição do termo;

Objetivos, vantagens, desvantagens sob as perspectivas da usabilidade
e do desenvolvimento;

Diferenças entre a abordagem tradicional e a abordagem Ajax para a
construção de aplicações Web;
6
Plug-in é um programa de computador que serve normalmente para adicionar funções a
outros programas maiores, provendo alguma funcionalidade especial ou muito específica.
7
Disponível em http://code.google.com/apis/maps/.
17

Apresentação das tecnologias que compõe Ajax e o modo como estas
tecnologias agem em conjunto;

Aplicações do mundo real que utilizam Ajax;

Frameworks e ferramentas que auxiliam o desenvolvimento de
aplicações Ajax.
Para colocar em prática os conhecimentos apresentados, será construída uma
aplicação Web desenvolvida utilizando a abordagem Ajax.
Esta aplicação terá como escopo o georeferenciamento do campus da UFSC.
E tem por objetivo dar uma nova opção de visualização para o mapa da UFSC,
atualmente um arquivo no formato PDF, estático, disponível no site da
instituição no endereço http://www.ufsc.br/páginas/mapa_ufsc.php.
1.4 Limitações
A aplicação de georeferenciamento do campus da UFSC irá prover
mecanismos
para
o
cadastro
dos
pontos
de
interesse
a
serem
georeferenciados. Este trabalho não tem por objetivo o mapeamento e cadastro
de todos os pontos de interesse, e sim o de fornecer os mecanismos para que
os mesmos possam ser cadastrados por terceiros.
2 Repensando o modelo de interatividade Web
Idealmente uma interface com o usuário (user interface - UI) deve ser invisível
aos usuários, fornecendo apenas a opções de que eles precisam quando
necessário ou, de outro modo, ficando fora do caminho, deixando-os livres para
focalizarem o problema em questão.
Infelizmente, isto é muito difícil de conseguir, assim, nós nos acostumamos, ou
nos resignamos, a trabalhar diariamente com UIs improdutivas, até que alguém
mostre uma maneira mais adequada para que possamos perceber o quão
frustrante nosso método atual de fazer as coisas pode ser.
A Internet atualmente está passando por este tipo de situação, uma vez que as
tecnologias básicas dos navegadores Web utilizadas para exibir conteúdo de
18
documentos estão além do limite daquilo que elas podem alcançar de uma
maneira sensata.
O aplicativo Web clássico com que estamos acostumados começa a se
quebrar sob o esforço que os serviços baseados na Web, cada vez mais
sofisticados, impõem sobre ela. Uma variedade de tecnologias está sendo
convocada a preencher a lacuna com clientes mais ricos, mais inteligentes e
mais aprimorados.
2.1 Clientes ricos
“Rico” se refere ao modelo de interação do cliente. Um modelo de interação
rica com o usuário é aquele que pode suportar uma variedade de métodos de
entrada e que responde de maneira intuitiva e no momento oportuno. Em
outras palavras, para que a interação com o usuário seja rica, ela deve ser tão
boa quanto à geração atual dos aplicativos desktop, como editores de texto e
planilhas.
2.2 Comparando as experiências do usuário
Observando uma aplicação desktop típica como um editor de planilhas ou um
gerenciador de e-mails, nota-se que o programa responde intuitivamente e
rapidamente, dando feedbacks8 significativos e instantâneos ao usuário como:
o cursor mudar de forma, ícones e botões se realçarem ao cursor passar sobre
os mesmos, textos selecionados mudam de cores, janelas são destacadas, os
diálogos foram representados de uma maneira diferente e assim por diante. As
coisas acontecem naturalmente sem a necessidade de se clicar em nenhum
botão ou hyperlink9. Isto pode ser definido como uma experiência de
interatividade rica para o usuário.
Agora, ao se analisar as características de uma aplicação Web convencional,
temos o modelo de interação com o usuário definido como: "clicar e esperar até
8
Provimento de informação sobre o estado de um sistema.
9
Hyperlink ou link é uma referência num documento em hipertexto a outro documento ou a
outro recurso.
19
carregar a nova página". Este processo de carregamento da página pelo
navegador Web é necessário para todos os eventos, submissões de dados e
navegação. O usuário sempre precisa esperar pela resposta, pois o modelo de
comunicação é baseado em requisição e resposta dirigido a páginas, e todo
este fluxo é definido no servidor. Por mais ricas e interligadas que sejam as
informações que estejam sendo visualizadas, a única maneira de interagir com
as mesmas é clicando nos hyperlinks ou preenchendo formulários de texto, e
ao realizar tais ações o foco na atividade anterior é perdida por alguns
instantes até que a próxima página seja carregada.
Comparado com o editor de planilhas, o modelo de interação em que a
aplicação Web convencional se baseia é inegavelmente limitado. Estas
limitações estão presentes nas aplicações Web convencionais devido a
inúmeras razões técnicas, sendo apresentadas algumas a seguir.
2.3 Latência de rede
A visão grandiosa da era da Internet é que todos os computadores do mundo
estão interconectados como um único grande recurso de computação.
Chamadas de procedimentos remotos (Remote Procedure Call - RPC) e locais
tornam-se indistinguíveis e os emissores nem mesmo estão cientes da
máquina física em que eles estão trabalhando.
Infelizmente
chamadas
de
procedimento
remotas
e
locais
não
são
absolutamente a mesma coisa. Comunicações em uma rede são caras, isto é,
elas são lentas e não confiáveis. Fazer uma chamada através de uma rede
nunca será tão eficiente quanto chamar um método local na memória. Além
disso, a não-confiabilidade da rede e daí a necessidade de reenviar pacotes
perdidos de informações, torna esta ineficiência variável e difícil de prever.
Uma UI bem-sucedida precisa simular nossas expectativas o mundo real em
um nível muito básico. Uma das regras fundamentais mais básicas da
interação é que, quando pressionamos, selecionamos ou apontamos para algo,
este responde imediatamente. Pequenos retardos entre apontar para algo e a
resposta pode distrair o usuário, desvirtuando a atenção do usuário a tarefa em
questão para a própria UI.
20
Ter de fazer todo este trabalho extra para atravessar a rede é na maioria das
vezes suficiente para diminuir a velocidade de um sistema a tal ponto que o
retardo torna-se perceptível. Em uma aplicação desktop precisamos tomar
decisões de projeto ruins quanto à usabilidade para fazer com que o aplicativo
seja falho ou não responsivo, mas em um aplicativo de rede podemos obter
tudo isso gratuitamente.
Devido à imprevisibilidade da latência de rede, este estado falho perceptível
aparecerá e desaparecerá, e testar a responsividade do aplicativo também
pode ser mais difícil. Daí a latência de rede ser uma causa comum da pobre
interatividade de aplicativos do mundo real.
Há somente uma resposta sensata ao problema da latência de rede disponível
para o desenvolvedor de UI, supor o pior. Em termos práticos, precisamos
tentar fazer as UIs responderem independentemente da atividade de rede.
Felizmente, uma resposta sustentável com freqüência é suficiente, contanto
que seja oportuna.
2.4 Interações assíncronas
Com qualquer UI, é uma pratica bem estabelecida gerar uma thread10
assíncrona para tratar qualquer computação demorada e deixá-la em execução
no segundo plano enquanto o usuário faz outras coisas. O usuário
necessariamente permanece bloqueado enquanto esta thread é carregada,
mas isso pode ser feito em um período de tempo aceitavelmente curto. Devido
à latência de rede, uma boa pratica é tratar qualquer RPC como
potencialmente demorada e tratá-la assincronamente.
Mas existe um problema. O HTTP é um protocolo de solicitação-resposta. Isto
é, o cliente emite uma solicitação a um documento e o servidor responde,
entregando o documento, informando que ele não pode localizá-lo, oferecendo
uma localização alternativa, ou instruindo o cliente a utilizar sua copia
10
É uma forma de um processo dividir a si mesmo em duas ou mais tarefas que podem ser
executadas simultaneamente.
21
armazenada em cache11 e assim por diante. Um protocolo de solicitaçãoresposta é de uma via. O cliente pode fazer contato com o servidor, mas o
servidor não pode iniciar uma comunicação com o cliente. De fato, o servidor
não se lembra do cliente entre uma solicitação e outra.
A maioria dos desenvolvedores Web que usam linguagens modernas como
Java, PHP ou .NET estão familiarizados com o conceito de sessões do usuário.
Estas são desenvolvimentos posteriores introduzidos nos servidores Web para
fornecer o estado das sessões anteriores do lado servidor no protocolo HTTP.
O HTTP faz aquilo pra o qual foi originalmente e muito bem projetado, e ele foi
adaptado para ir muito além desse ponto com uma engenhosidade
considerável. Entretanto, o recurso-chave da nossa solução ao retorno de
chamada assíncrona é que o cliente é notificado duas vezes: uma vez quando
a thread é iniciada e a outra quando a thread é completada. O HTTP simples e
direto e o modelo clássico de aplicativo Web é que não podem fazer isto
automaticamente.
O modelo clássico das aplicações Web ainda é construído em torno da noção
de páginas. Um documento é exibido para o usuário contendo listas de links
e/ou elementos de formulário que permitem que eles pesquisem outros
documentos.
Ao longo dos anos esta modelo de interação ficou profundamente enraizada
em nossa maneira de se pensar a Internet comercial e cotidiana. Ferramentas
de autoria Web amigáveis e do tipo WYSIWYG (What You See Is What You
Get – o que você vê é o que será impresso) visualizam nosso site como uma
coleção de páginas. Estruturas Web de lado servidor modelam a transição
entre páginas como diagramas de transição de estado. O aplicativo Web
clássico está firmemente associado à falta de responsividade quando a página
é atualizada, sem um recurso fácil a solução de tratamento assíncrono.
Mas para entender porque o modelo de aplicativo Web clássico funciona muito
bem até hoje para a maioria das pessoas devemos levar em conta os padrões
de uso.
11
No caso dos navegadores Web, é um diretório em que as páginas são guardadas localmente
para evitar consultas constantes à rede.
22
2.5 Padrões de uso soberano e transitório
Alan Cooper, um especialista em usabilidade de software, definiu dois modos
principais de uso: transitório e soberano. Um aplicativo transitório poderia ser
utilizado todos os dias, mas somente esporadicamente, em geral, como uma
atividade secundaria. Um aplicativo soberano, ao contrario, precisa lidar com
toda a interatividade do usuário por várias horas em um dado momento [2].
Muitos aplicativos são inerentemente transitórios ou soberanos. Por exemplo,
um editor de texto para um escritor é um aplicativo soberano no qual algumas
atividades
transitórias
girarão,
como
o
gerenciador
de
arquivos
(frequentemente embutido no editor como um diálogo para salvar ou abrir
arquivos), um dicionário ou corretor ortográfico e um programa de correio
eletrônico ou de mensagens para comunicação com colegas. Para o
desenvolvedor de software o ambiente integrado de desenvolvimento
(Integrated Development Environment - IDE) é soberano, assim como o é o
depurador12.
Um bom padrão de comparação para a intensidade do trabalho é o efeito de
congelamento da interface sobre o fluxo de trabalho do usuário, lembrando
assim o usuário de que a interface existe. Se simplesmente estivermos
movendo arquivos de uma pasta à outra e existir um retardo de dois segundos,
podemos aceitar isso sem problemas. Se encontrar o mesmo retardo de dois
segundos ao compormos uma imagem em um programa de edição de
imagens, talvez isso nos atrapalhe bastante.
Aplicações como Google13, Americanas14, Submarino15, MercadoLivre16, e a
maioria dos aplicativos públicos baseados na Web, são aplicativos transitórios.
Soluções baseadas em páginas Web são suficientemente boas para uso
transitório, mas não para uso soberano.
12
Um depurador, ou debugger, é um programa de computador que é usado para testar outros
programas e fazer sua depuração, isto é, eliminar seus problemas ou bugs.
13
Disponível em http://www.google.com.br/
14
Disponível em http://www.americanas.com.br/
15
Disponível em http://www.submarino.com.br/
16
Disponível em http://www.mercadolivre.com.br/
23
2.6 Desaprendendo a Web
Interatividade complicada, linguagens de criação de scripts e plug-ins foram
estabelecidas à contra gosto nos navegadores Web modernos ao longo dos
anos, em uma corrida para proporcionar a mais atraente experiência
navegacional.
Introduzir uma nova tecnologia é um processo técnico e social. Depois que a
tecnologia está disponível, as pessoas precisam descobrir o que fazer com ela,
e, um primeiro passo costuma ser utilizá-la como se fosse algo mais antigo e
familiar. Essa é a razão porque as bicicletas antigas eram chamadas de
“hobbyhorses” (“cavalinho de pau”) ou “dandy horses” e eram guiadas com os
pés no chão. A medida que a tecnologia foi exposta a um publico mais amplo,
uma segunda onda de inovadores descobriria novas maneiras de utilizar esta
tecnologia, acrescentando melhorias como pedais, freios, engrenagens e
pneus. A cada melhoria incremental a bicicleta se tornava menos parecida com
um cavalo [3].
Os mesmos processos funcionam hoje em dia com o desenvolvimento Web. As
tecnologias por trás do Ajax têm a capacidade de transformar páginas Web em
algo radicalmente novo. Tentativas anteriores de se utilizar as tecnologias Ajax
ainda estavam pressas a noção tradicional de uma página Web e tinham
aquele espírito de “nenhuma coisa nem outra” do hobbyhorse. Para entender o
potencial do Ajax precisamos abandonar o conceito de página Web e, ao fazer
isso, desaprender uma grande quantidade de suposições que fizemos nos
últimos anos.
3 Ajax
O Ajax (Asynchronous JavaScript + XML) é um nome relativamente novo,
cunhado por Jesse James Garrett da Adaptive Path, em seu ensaio “Ajax: A
New Approach to Web Applications”, publicado em 18 de Fevereiro de 2005.
Neste ensaio, o nome Ajax é citado pela primeira vez, onde Garret explica
como ele acredita que as aplicações Web estão estreitando a diferença entre a
elas e as aplicações tradicionais desktop.
24
“Desktop applications have a richness and responsiveness that has seemed out of
reach on the Web. The same simplicity that enabled the Web’s rapid proliferation also
creates a gap between the experiences we can provide and the experiences users can
get from a desktop application.
That gap is closing. Take a look at Google Suggest. Watch the way the suggested
terms update as you type, almost instantly. Now look at Google Maps. Zoom in. Use
your cursor to grab the map and scroll around a bit. Again, everything happens almost
instantly, with no waiting for pages to reload.
Google Suggest and Google Maps are two examples of a new approach to web
applications that we at Adaptive Path have been calling Ajax. The name is shorthand for
Asynchronous JavaScript + XML, and it represents a fundamental shift in what’s
possible on the Web.” [4]
Algumas partes do Ajax foram anteriormente descritas como Dynamic HTML e
scripting remoto.
É porem muito mais que um nome. Há muitas expectativas em torno do Ajax e
muito mais a se esperar dele, tanto em uma perspectiva tecnológica como de
negócios. Tecnologicamente o Ajax da vazão a uma grande quantidade de
potenciais não realizados nas tecnologias dos navegadores Web. Google,
Yahoo, Microsoft e alguns outros dos principais competidores estão utilizando o
Ajax para aumentar as expectativas do público em geral sobre o que uma
aplicação Web pode fazer.
3.1 Os quatro princípios definidores do Ajax
O modelo clássico de aplicação baseado em páginas é amarrado em muitas
das estruturas que nós usamos, e também em nossas maneiras de pensar.
Segundo Crane, uma aplicação Ajax deve ser pensada levando em
consideração quatro suposições básicas [3].
3.1.1 O navegador hospeda uma aplicação, não o conteúdo.
Em uma aplicação Web clássica baseada em páginas, o navegador é
efetivamente um terminal burro. Ele não sabe nada sobre onde o usuário está
no fluxo de trabalho maior. Todas essas informações são mantidas no servidor
Web, tipicamente na sessão do usuário. Sessões de usuários no lado servidor
são comuns atualmente. No trabalho com Java ou .NET, a sessão no lado
25
servidor faz parte da API padrão, assim como controle de solicitações,
respostas, e tipos de conteúdo Multipurpose Internet Mail Extensions (MIME). A
Figura 1 ilustra o ciclo de vida típico de uma aplicação Web clássica.
Figura 1
Ciclo de vida típico de uma aplicação Web clássica [3].
Quando o usuário efetua o login17 ou de outra maneira inicia uma sessão,
vários objetos são criados no lado servidor, representando, por exemplo, a
cesta de compras e as credenciais do cliente, se isso for um site de comércio
eletrônico. Ao mesmo tempo, a página inicial é apresentada ao navegador, em
um fluxo de marcação HTML que mistura apresentação de texto padronizado,
dados específicos ao usuário e conteúdo, como uma lista de itens recémvisualizados.
17
Ação necessária para acessar um sistema computacional restrito inserindo uma
identificação.
26
Toda vez que o usuário interage com o site, um outro documento é enviado ao
navegador, contendo a mesma combinação de texto padronizado e dados. O
navegador obedientemente descarta o documento anterior e exibe o novo, uma
vez que ele é burro e não sabe mais o que fazer.
Quando o usuário efetua logout18 ou fecha o navegador, a aplicação fecha e a
sessão é destruída. Qualquer informação que o usuário necessite ver na
próxima vez que ele entrar terá que ser passada para a camada de
persistência de dados em cada visita. Já em uma aplicação Ajax, parte da
lógica da aplicação é movida para o navegador, como a Figura 2 ilustra.
Figura 2
Ciclo de vida de um aplicativo Ajax [3].
Neste novo cenário, quando o usuário efetua login, um documento mais
complexo é entregue ao navegador, uma grande proporção do qual é código
JavaScript. Este documento permanecerá com o usuário por toda a sessão,
18
Ação de sair do sistema
27
embora seja provável que ele mude de aparência consideravelmente enquanto
o usuário está interagindo com ele. O documento sabe como responder às
interações do usuário e é capaz de decidir se deve tratar ele mesmo os dados
inseridos pelo usuário ou passar uma solicitação para o servidor Web (que tem
acesso ao banco de dados do sistema e outros recursos), ou ainda, fazer uma
combinação de ambos.
Como o documento persiste por toda a sessão do usuário, ele pode armazenar
o estado. Por exemplo, o conteúdo de uma cesta de compras pode ser
armazenado no navegador, em vez de ser armazenado na sessão do servidor
[3].
3.1.2 O servidor fornece dados, não conteúdo.
Como observado, uma aplicação Web clássica apresenta a mesma mistura de
texto padronizado, conteúdo e dados em cada passo. Quando nosso usuário
adiciona um item na cesta de compras, tudo que realmente precisamos
responder é o valor atualizado da cesta ou informar se alguma coisa deu
errado. Como ilustrado na Figura 3, isto será uma parte muito pequena do
documento geral.
28
Figura 3
Distribuição do conteúdo entregue (A) por um aplicativo Web clássico e
(B) por um aplicativo Ajax. A medida que o aplicativo continua a ser utilizado, aumenta o
tráfego acumulado (C).
Um carrinho de compras baseado em Ajax pode comportar-se de forma mais
inteligente, enviando solicitações assíncronas ao servidor. O texto padronizado,
o rastro de navegação, e outras características do layout da página já estão
todos carregados, portanto o servidor só precisa enviar os dados relevantes.
Uma aplicação Ajax poderia fazer isto de vários modos, como retornar um
fragmento de JavaScript, um fluxo de texto simples, ou um pequeno documento
XML. Existem as vantagens e desvantagens de cada um, mas é suficiente
dizer que qualquer um destes formatos será relevantemente menor que a
miscelânea devolvida pela aplicação Web clássica.
Em uma aplicação Ajax, a maior parte do tráfego ocorre no início, com um
grande e complexo cliente sendo entregue de uma única vez, quando o usuário
29
efetua o login. Comunicações subseqüentes com o servidor são, porém, muito
mais eficientes. Para um aplicativo transitório, o tráfego acumulado pode ser
menor para uma aplicação Web convencional, mas conforme o tamanho médio
do tempo de interação aumenta, o custo de largura de banda da aplicação Ajax
se torna menor que o da aplicação Web clássica [3].
3.1.3 A interação do usuário com a aplicação pode ser fluente e
contínua
Um navegador Web oferece dois mecanismos de entrada prontos para uso:
hyperlinks e formulários HTML.
Hyperlinks podem ser construídos sobre o servidor e pré-carregados
apontando para páginas dinâmicas ou servlets. Eles podem ser aprimorados
com imagens e Cascading Style Sheets (CSS) para fornecer um feedback
rudimentar, como por exemplo, definir efeitos quando o mouse estiver sobre
eles.
Controles de formulário oferecem um subconjunto básico de componentes
padrões de interface com o usuário: caixas de texto, caixas de checagem e
botões de rádio, além de listas de seleção. Vários possíveis candidatos não
estão presentes. Não existem controles prontos para uso como: estruturas de
árvore, grades editáveis, ou caixas de combinação. Os formulários, assim
como os hyperlinks, apontam para URLs no servidor.
Como alternativa, os hyperlinks e os controles de formulário podem ser
apontados para funções Javascript. É uma técnica comum em páginas Web
fornecer uma validação de formulário rudimentar em Javascript, a fim de
verificar campos vazios, valores fora de intervalo, e assim por diante, antes de
submeter os dados para o servidor. Estas funções Javascript só persistem pelo
tempo da própria página e são substituídas quando a página submete dados ao
servidor.
Enquanto a página está enviando os dados, o usuário aguarda a sua resposta.
A página anterior pode ainda estar parcialmente visível por algum tempo, e o
navegador pode até permitir que o usuário clique em qualquer um dos links
visíveis, mas fazer isto produzirá resultados imprevisíveis e até destruir a
sessão no lado servidor. O usuário está normalmente aguardando a página ser
30
atualizada que, frequentemente, possui quase que as mesmas informações
removidas segundos antes. Afinal de contas, não é provável que a adição de
um par de calças a cesta de compras modifique as categorias de primeiro nível,
de “moda masculina”, “moda feminina”, “infantil” e “acessórios”.
Fixemos no exemplo do carrinho de compras novamente. Como nosso carrinho
de compras Ajax envia dados assincronamente, os usuários podem adicionar
coisas tão rapidamente quanto eles podem clicar. Se o código do carrinho de
compras for robusto, ele tratará esta carga de trabalho facilmente, e os
usuários poderão continuar com o que estão fazendo.
É claro que não existe nenhum carrinho para colocarmos as coisas, somente
um objeto em sessão no servidor. Os usuários não querem saber sobre objetos
de sessão enquanto estão fazendo compras, e a metáfora do carrinho provê
uma descrição do mundo real mais confortável do que está acontecendo.
Alternar contextos entre a metáfora e o acesso direto ao computador é algo
que distrai os usuários. Aguardar uma página ser atualizada levará o usuário à
realidade de estar à frente de um computador por um curto período de tempo, e
nossa implementação em Ajax evita que isto ocorra. Comprar é uma atividade
transitória, mas se considerarmos um domínio de negócios diferente, por
exemplo, um cenário de assistência e atendimento intensivo ou uma tarefa
complexa de engenharia, então o custo de interromper o fluxo de trabalho a
cada poucos segundos com uma atualização de página, é algo inviável.
A segunda vantagem de Ajax é que podemos associar eventos a um amplo
espectro de ações do usuário. Os conceitos mais sofisticados de interface com
o usuário, assim como “arrastar e soltar”, se tornam realizáveis, trazendo as
experiências dessas interfaces em pé de igualdade com os controles de
aplicações desktop. Da perspectiva de usabilidade, esta liberdade não é
importante somente porque ela permite exercitar nossa imaginação, mas
porque ela nos permite combinar a interação do usuário e as solicitações ao
servidor de maneira mais completa.
Para contatar o servidor em uma aplicação Web clássica, precisamos clicar em
um hyperlink ou submeter um formulário, e então esperar. Isso interrompe o
fluxo de trabalho do usuário. Em contraposição, contatar o servidor em
resposta a um movimento ou arraste do mouse, ou um pressionamento de
tecla, permite que o servidor a trabalhe junto com o usuário. O Google
31
Suggest19 é um exemplo muito simples e efetivo disto: responder às teclas
pressionadas enquanto ele digita dentro da caixa de pesquisa, e então,
comunicar com o servidor para recuperar e exibir uma lista de possíveis
finalizações para as expressões, baseada nas pesquisas feitas por outros
usuários do mecanismo de busca em todo o mundo [3].
3.1.4 Uma codificação real requer disciplina
Aplicações Web clássicas fazem uso de JavaScript já há algum tempo para
adicionar penduricalhos as suas páginas. Esta situação desfavorável fez com
que JavaScript recebesse injustamente, uma reputação como um tipo de
linguagem trivial e de baixo nível, não levada em consideração por
desenvolvedores sérios.
Porém isto vem se modificando ao passo que o termo Ajax, e as técnicas
envolvidas, vêm ganhando credibilidade. Codificar uma aplicação Ajax é algo
completamente diferente. O código que você fornece quando os usuários
iniciam a aplicação deve executar até que eles encerrem-na, sem interrupção,
sem diminuição de velocidade, e sem produção de vazamentos de memória.
Se estivermos mirando no mercado de aplicações soberanas, então temos em
vista muitas horas de intenso uso. Para atingirmos este objetivo, devemos
escrever códigos de alto-desempenho, e de fácil manutenção, usando a
mesma disciplina e entendimento que é aplicado com sucesso às camadas do
servidor.
A base de código será tipicamente mais ampla que qualquer código escrito
para uma aplicação Web clássica. Boas práticas na construção da base de
código se tornam muito importantes. O código deve tornar-se responsabilidade
de uma equipe, em vez de uma única pessoa, expondo questões de
manutenção, separações de interesses e estilos e padrões comuns de
codificação.
Uma aplicação Ajax, é, então, um fragmento funcional complexo do código que
se comunica eficientemente com um servidor enquanto o usuário continua com
seu trabalho. Ela é claramente uma descendência da aplicação Web clássica
19
Disponível em: http://www.google.com/webhp?complete=1&hl=em.
32
baseada em páginas, mas a similaridade não é mais forte do que aquela entre
o hobbyhorse anterior e uma moderna bicicleta. Ter em mente estas diferenças
nos ajudará a criar aplicações Web verdadeiramente atraentes [3].
3.2 Ajax no mundo real
O Ajax já é utilizado para a construção de aplicativos reais, e os benefícios da
abordagem Ajax já podem ser vistos.
A Google fez mais do que qualquer outra empresa para aprimorar o perfil dos
aplicativos Ajax. E o Google, como a maioria dos que adotaram esta
tecnologia, estava fazendo isso antes do nome Ajax ser cunhado.
O Google avançou nisso com muitos recursos interativos, como o GMail, um
serviço de e-mail gratuito com uma UI muito leve e responsiva, o Google
Suggest, que pesquisa no servidor possíveis complementos para os termos de
busca à medida que o usuário digita no campo de pesquisa, e o Google Maps,
um mapa ampliável e interativo utilizado para realizar pesquisas baseadas em
localizações.
Ao mesmo tempo outras empresas começaram a experimentar esta tecnologia.
Outra grande utilizadora da tecnologia Ajax é a Yahoo!20, com a página
principal de seu portal em Ajax, com o seu sistema de compartilhamento de
fotos on-line Flickr21, o Yahoo! Maps22, serviço de mapas semelhante ao
Google Maps, entre outros serviços. A Microsoft também vem se tornando um
grande utilizador do Ajax, com seu portal Live.com23, o Windows Live Local24,
outro serviço de mapas, entre outros. Outras aplicações interessantes são os
ditos Desktops Online ou Webtops que são páginas personalizadas, em que é
possível escolher o conteúdo, bem como definir a ordem e a aparência dos
mesmos. Dentre os Webtops mais conhecidos estão o Netvibes25, Protopage26,
iGoogle27, My Yahoo28 e Windows Live29.
20
Disponível em http://br.yahoo.com
21
Disponível em http://www.flickr.com/
22
Disponível em http://maps.yahoo.com/
23
Disponível em http://www.live.com/
24
Disponível em http://local.live.com/
25
Disponível em http://www.netvibes.com/
33
Estes aplicativos até agora estão testando o mercado. Eles continuam sendo
aplicativos transitórios, projetados para uso ocasional. Há sinais de um
mercado emergente para aplicativos Ajax soberanos, com algumas iniciativas
como o Google Docs30, que é um pacote de aplicativos totalmente on-line que
rodam diretamente no navegador Web e que é atualmente composto de um
processador de texto, um editor de apresentações e um editor de planilhas.
Outro sinal importante é a crescente proliferação de frameworks e bibliotecas
para auxiliar o desenvolvimento Ajax, mas isto, veremos mais adiante.
Examinando o estado da arte atual desta tecnologia podemos ter idéia de onde
está a recompensa do uso do Ajax.
3.2.1 Google Maps
O Googgle Maps é um cruzamento entre um visualizador de mapas e um
sistema de pesquisa. Inicialmente o sistema mostra o mapa dos Estados
unidos. O mapa pode ser consultado utilizando texto livre, permitindo afunilar a
pesquisa para endereços de ruas especificas ou até mesmo para nomes de
hotéis e restaurantes.
26
Disponível em http://www.protopage.com/
27
Disponível em http://www.google.com.br/ig
28
Disponível em http://my.yahoo.com/
29
Disponível em http://home.live.com/
30
Disponível em http://documents.google.com/
34
Figura 4
Página inicial do Google Maps.
Clicar em links individuais a partir do resultado da pesquisa fará com que popups31 adicionais sejam exibidas instantaneamente, possivelmente até rolando o
mapa levemente para acomodá-los. A rolagem do mapa é o recurso mais
interessante do Google Maps. O usuário pode arrastar o mapa inteiro usando o
mouse. O mapa é composto por pequenos pedaços, e se o usuário rolar o
mapa até um ponto suficientemente distante para expor um novo pedaço, este
será carregado assincronamente. As vezes há um retardo notável, com uma
área em branco aparecendo inicialmente, que é preenchida depois que o
pedaço do mapa é carregado, entretanto o usuário pode continuar a rolar,
desencadeando solicitações atualizadas daquele pedaço enquanto é feito o
download. Os pedaços do mapa são armazenados em cache pelo navegador
31
O pop-up é uma janela extra que abre no navegador ao visitar uma página web ou acessar
um hiperlink específico.
35
Web até o final da sessão do usuário, tornando muito mais rápido retornar a
uma parte do mapa já visualizada.
Figura 5
Pop-up aberta ao clicar em um item do resultado da pesquisa.
Em questão a usabilidade, duas coisas importantes são visíveis. Primeiro, a
ação que desencadeia o download dos novos dados do mapa não é um link
especifico informando “buscar mais mapas”, mas algo que o usuário está
fazendo de qualquer jeito, isto é, mover o mapa. O fluxo de trabalho do usuário
não é interrompido pela necessidade de se comunicar com o servidor.
Segundo, as próprias solicitações são assíncronas, significando que os links
contextuais, controle de zoom e outros recursos de página continuarão
acessíveis enquanto o mapa coleta novos dados.
Serviços de mapeamento baseados na Internet não são recentes. Se
examinássemos um típico site de mapeamento anterior ao Ajax, veríamos um
conjunto diferente de padrões de interação. Em geral o mapa é dividido em
pedaços. Um controle de zoom e talvez barras de navegação laterais nas
36
margens do mapa poderiam ser fornecidos. Clicar qualquer um destes,
invocaria a atualização da tela inteira, resultando em uma página semelhante a
anterior somente com um pedaço do mapa diferente. O fluxo de trabalho seria
interrompido e, depois de examinar o Google Maps, o usuário descobriria que o
site é lento e frustrante.
Para serviços on-line como o Google, facilidade de uso é um recurso-chave
para que os usuários visitem este serviço e voltem novamente. E o número de
visualização de páginas é uma parte crucial da tomada de decisão para o
negócio. Introduzindo uma UI melhor, com a flexibilidade que o Ajax oferece, o
Google forneceu claramente aos tradicionais serviços de mapeamento algo
com que se preocupar. Certamente há outros fatores, como a qualidade do
serviço de back-end, mas, sendo outras coisas iguais, o Ajax pode fornecer
uma forte vantagem ao negócio.
3.2.2 Google Mail ou GMail
O serviço GMail teve sua versão beta lançada no começo de 2004. Juntamente
com um espaço extremamente generoso de caixa de e-mail32, o principal
comentário sobre o GMail era a UI, que permitia que os usuários visualizarem
todas as mensagens relacionadas com um assunto específico em uma única
janela, de uma maneira escalonada, isso é, fica uma mensagem "acima" da
outra, conforme a ordem cronológica de envio e a atualização da caixa de
entrada
automaticamente,
mesmo
enquanto
o
usuário
digitava
uma
mensagem. Comparando com a média dos sistemas de Web Mail oferecidos
na época, esse foi um passo a frente importante. Comparando com as
interfaces corporativas de Web Mail como o Microsoft Outlook e Lotus Notes, o
GMail oferecia a maioria das funcionalidades sem recorrer a controles ActiveX
incômodos e pesados ou a mini-aplicativos Java, tornando-o disponível para a
maioria das plataformas e localizações, ao invés de somente máquinas
cuidadosamente pré-configuradas de usuários corporativos.
32
O Gmail oferecia, em seu início, 1GB de espaço de armazenamento. O Yahoo! Mail e MSN
Hotmail, que ofereciam 6MB e 2MB, respectivamente, tiveram de rever a questão de espaço
disponível para continuarem tendo condições de concorrerem comercialmente. O mesmo
ocorreu com provedores pagos e gratuitos por todo o mundo.
37
Entre outras características podemos destacar o uso de marcadores, seguindo
a filosofia “pesquise, não classifique”. Basta "colar" um marcador na
mensagem. Este conceito permite uma organização mais elaborada, uma vez
que uma determinada mensagem pode ter vários marcadores. Isso só seria
possível com pastas se mantivéssemos uma cópia da mensagem em cada
pasta. E a mais recente novidade foi à incorporação do serviço de mensagens
instantâneas Google Talk ao Gmail, denominado de Google Chat. Desta forma,
não é necessária nenhum tipo de instalação adicional na máquina do usuário, o
mesmo pode acessar o serviço de mensagens instantâneas diretamente de
dentro do GMail e o Google Chat inclui ainda uma função que salva os
históricos das conversações automaticamente em uma pasta chamada "Chat".
Figura 6
Interface do GMail com apresentação de mensagens de forma
escalonada, mensagens instantâneas e corretor ortográfico.
38
3.2.3 Desktop Online
Um Desktop Online, Webtop, Web Desktop ou OS Online é uma página Web
personalizada, em que é possível escolher o conteúdo, bem como definir a
ordem e a aparência dos mesmos.
São em geral fornecidos por serviços on-line como Google, Yahoo e Windows
Live e normalmente rodam mini-aplicações próprias, mas podem servir de
plataforma também para mini-aplicações desenvolvidas por terceiros.
Um Desktop Online funciona como um Sistema Operacional, porém utilizando
um navegador Web. Alguns deles têm interfaces que lembram desktops de
sistemas operacionais como o Windows e o Linux (KDE) [5].
Alguns dos serviços mais comuns usados nos desktops on-line são:
Canais de notícias RSS, notificador de e-mail, podcasts33, previsão do tempo,
conversor de moedas, calculadora, agenda, gerenciador de arquivos,
gerenciador de favoritos, gerenciador de fotos, pesquisas e alguns contando
com programas de mensagem instantâneas, editores de sites, editores de
blogs e até tocadores de mp3.
33
Podcasting é uma forma de publicação de programas de áudio, vídeo e/ou fotos pela Internet
que permite aos utilizadores acompanhar a sua atualização.
39
Figura 7
Figura 8
Protopage
Goowy
40
Figura 9
Online Operating System
3.2.4 Google Docs
O Google Docs, é um pacote de aplicativos do Google baseado em Ajax.
Funciona totalmente on-line diretamente no navegador Web. Os aplicativos são
compatíveis com o Microsoft Office e o OpenOffice.org, e atualmente compõese de um processador de texto, um editor de apresentações e um editor de
planilhas. Originalmente, o processador de texto foi desenvolvido à parte, sob o
nome Writely, e comprado pelo Google meses depois. Alguns dos recursos
mais peculiares é a portabilidade de documentos, que permite a edição do
mesmo documento por mais de um usuário, bem como o recurso de publicação
direta em blog. Os aplicativos permitem a compilação em PDF.
41
Figura 10
Figura 11
Página Inicial do Google Docs
Planilha do Google Docs.
42
3.3 Alternativas ao Ajax
Podemos esperar que esta tendência aumente à medida que a exposição
publica das interfaces mais ricas se torne mais predominante. Como uma
tecnologia vendável, o futuro do Ajax parece ser brilhante nos próximos anos.
Entretanto outras tecnologias de clientes ricos também estão procurando
ocupar esse espaço.
3.3.1 Adobe Flash, Adobe Flex e Laszlo
Adobe Flash34 é um sistema para execução de animações interativas usando
um formato comprimido de vetores gráficos. Animações em Flash são
interativas e são programadas com ActionScript35, um parente próximo de
Javascript. Suporte para algumas formas de entrada estão disponíveis, e Flash
pode ser usado para qualquer coisa desde jogos interativos até interfaces de
usuário com regras de negócio complexas. Flash tem um suporte muito bom a
vetores gráficos, algo completamente ausente na base das tecnologias de Ajax.
O Flash está presente há muito tempo e é acessado por meio de um plug-in de
navegador. Como uma regra geral, contar com um plug-in de navegador Web é
uma idéia ruim, mas Flash é um plug-in presente na maioria dos navegadores.
Para os propósitos de criação de clientes ricos com Flash, duas tecnologias
muito interessantes são Adobe Flex36 e a suíte livre Laszlo37, ambas provêm
arquiteturas simplificadas no lado servidor, para geração de interfaces de
usuário baseadas em Flash. Ambas as arquiteturas usam Java (J2EE) na
camada do servidor.
34
Disponível em http://www.adobe.com/products/flashplayer/
35
ActionScript é uma linguagem de programação orientada à objetos baseada em ECMAScript,
é executada em uma máquina virtual que está disponível no Flash Player.
36
Disponível em http://www.adobe.com/products/flex/
37
Disponível em http://www.openlaszlo.org/
43
3.3.2 Java Web Start e Microsoft No Touch Deployment
O Java Web Start38 é uma especificação para a distribuição de aplicativos
baseados em Java em um servidor Web de tal maneira que um processo
desktop possa localizar, carregar e executá-los. Estes aplicativos podem ser
acessados através de hyperlinks, permitindo acesso continuo a partir de um
navegador Web cliente do Web Start. O Java Web Start está presente nas
distribuições Java mais recentes, e o processo de instalação ativará
automaticamente o suporte ao Web Start nos navegadores Internet Explorer e
navegadores baseados no Mozilla.
Depois de carregados os aplicativos Web Start são armazenados em uma
sandbox gerenciável no sistema de arquivos e automaticamente atualizados se
uma nova versão for disponibilizada. Isto permite que eles sejam executados
desconectados da rede e reduz o tráfego de rede na recarga, tornando a
implantação de aplicativos pesados, com vários megabytes, uma possibilidade.
Os aplicativos são assinados digitalmente, e o usuário pode optar por fornecer
acesso total ao sistema de arquivos, as portas de rede e a outros recursos.
Tradicionalmente, as UIs do Web Start são escritas em Java Swing, mas existe
o suporte para o Standart Widget Toolkit (SWT).
A plataforma Microsoft .NET oferece um recurso semelhante chamado No
Touch Deployment39, prometendo um mix semelhante de implementação fácil,
UIs ricas e segurança.
A principal desvantagem das duas tecnologias é ter a necessidade de um
programa executável (runtime) pré-instalado. Naturalmente, qualquer cliente
rico precisa de um programa executável, mas o Flash e o Ajax, que utilizam o
próprio navegador Web como programa executável, e os navegadores Web já
se encontram comumente presentes na maioria dos computadores. Na
distribuição atual os programas executáveis Java e .NET estão muito limitados
e não podemos contar com eles para um serviço Web público.
38
Disponível em http://java.sun.com/products/javawebstart/
39
Disponível em http://msdn.microsoft.com/en-us/library/aa289511.aspx
44
3.4 Os elementos-chave do Ajax
O Ajax não é uma tecnologia única. Em vez disso, é uma coleção de quatro
tecnologias que se complementam. A tabela abaixo resume estas tecnologias e
o papel que cada uma tem que desempenhar.
Tabela 1
Os elementos-chave do Ajax
JavaScript
JavaScript é uma linguagem de criação de scripts de uso geral projetada
para ser embutida dentro dos aplicativos. O interpretador JavaScript em
um navegador Web permite interação programática com muitas das
capacidades predefinidas do navegador. Aplicativos Ajax são escritos em
JavaScript.
Cascading Style
CSS oferecem uma maneira de definir estilos visuais reutilizáveis para
Sheets (CSS)
elementos das páginas Web. Eles oferecem uma maneira simples e
poderosa de definir e aplicar estilização visual consistentemente. Em um
aplicativo Ajax, a estilização de uma interface com o usuário pode ser
modificada interativamente por meio de CSS.
Document Object
O DOM apresenta a estrutura das páginas Web como um conjunto de
Model (DOM)
objetos programáveis que pode ser manipulado com JavaScript. Criar
scripts com o DOM permite que um aplicativo Ajax modifique a interface
com o usuário instantaneamente, redesenhando eficazmente parte da
página.
Objeto
O mal nomeado objeto XMLHTTPRequest permite que programadores
XMLHTTPRequest
Web recuperem dados de um servidor Web como uma atividade em
segundo plano. O formato dos dados geralmente é XML, mas funciona
bem com dados baseados em texto. Enquanto o XMLHTTPRequest é a
ferramenta de uso geral mais flexível para este trabalho, há outras
maneiras de recuperar dados do servidor, como técnicas baseadas em
frames.
Um aplicativo Ajax entrega um aplicativo complexo e funcional por demanda
para os usuários, com o qual eles então interagem. O JavaScript é a “cola”
utilizada para montar estes aplicativos, definindo o fluxo de trabalho do usuário
e a lógica de negócio do aplicativo. A interface com o usuário é manipulada e
atualizada utilizando JavaScript para manipular o Document Object Model
(DOM), redesenhando e reorganizando continuamente os dados apresentados
aos usuários e processando suas interações baseadas no mouse e no teclado.
45
As folhas de estilo em cascata (Cascadind Styles Sheets - CSS) fornecem
aparência e comportamento (look and feel) consistentes para o aplicativo e um
atalho poderoso para a manipulação programática do DOM. O objeto
XMLHTTPRequest (ou algum mecanismo semelhante) é utilizado para
conversar com o servidor assincronamente, confirmando as solicitações do
usuário e buscando dados atualizados enquanto o usuário trabalha. A Figura
12 demonstra como as tecnologias se encaixam no Ajax.
Figura 12
Os quatro componentes principais do Ajax [3].
Três das quatro tecnologias – CSS, JavaScript e DOM – têm sido
coletivamente referidas como Dynamic HTML, ou abreviando, DHTML. Por
volta
de
1997,
a
DHTML,
era
a
grande
promessa,
mas,
não
surpreendentemente nessa indústria, nunca conseguiu passar de uma
promessa inicial. A DHTML oferecia a capacidade de criar interfaces interativas
não-convencionais para páginas Web, mesmo assim nunca superou o
problema da atualização da página inteira. Sem voltar para conversar com o
servidor, havia muito pouco a ser feito. O Ajax utiliza maciçamente o DHTML,
mas, acrescentando as solicitações assíncronas, ele pode estender a
46
longevidade de uma página Web consideravelmente. Em razão de voltar ao
servidor enquanto a interface está fazendo seu trabalho, sem interrupção, o
Ajax faz uma grande diferença no resultado final.
Muito convenientemente, todas estas tecnologias já estão pré-instaladas nos
navegadores Web mais modernos, incluindo o Microsoft Internet Explorer, a
família dos navegadores Mozilla/Gecko, incluindo Firefox, Mozilla Suíte,
Netscape Navigator e Camino, o navegador Opera, o Safári da Apple, e seu
primo próximo Konqueror do UNIX KDE. De modo conveniente, as
implementações dessas tecnologias são frustrantemente diferentes em relação
a alguns detalhes e irão variar de uma versão para outra, mas essa situação foi
amenizada nos últimos anos e há maneiras de lidar de um modo claro com as
incompatibilidades de múltiplos navegadores.
Cada sistema operacional moderno vem com um navegador moderno préinstalado. Portanto, a ampla maioria dos computadores desktop e laptop do
planeta já estão preparados para executar aplicativos Ajax.
3.4.1 Orquestrando a experiência do usuário com JavaScript
O papel central do conjunto de ferramentas Ajax é sem duvida desempenhado
pelo JavaScript. Um aplicativo Ajax carrega um cliente completo na memória,
combinando dados, apresentação e a lógica do programa. O JavaScript é a
ferramenta utilizada para implementar essa lógica. O JavaScript é uma
linguagem de programação de uso geral de descendência hibrida, com uma
leve semelhança com a família das linguagens C.
A grosso modo, o JavaScript pode ser caracterizado como uma linguagem de
criação de scripts de uso geral, interpretada e fracamente tipada.
Fracamente
tipada
significa
que
as
variáveis
não
são
declaradas
especificamente como strings, inteiros ou objetos e que é possível atribuir
valores de diferentes tipos a mesma variável.
Interpretada significa que não é compilada no código executável, mas o códigofonte é executado diretamente.
Uso geral significa que a linguagem é adequada para uso com a maioria dos
algoritmos e tarefas de programação. A linguagem JavaScript básica contém
suporte a números, strings, datas e horas, arrays, expressões regulares para
47
processamento de texto e funções matemáticas como trigonometria e geração
de números aleatórios. É possível definir objetos estruturados utilizando
JavaScript, levando os princípios e a ordem de projeto a um código mais
complexo.
Dentro do ambiente do navegador Web, partes da funcionalidade nativa do
navegador, incluindo CSS, DOM e o objeto XMLHHTRequest são expostos ao
mecanismo JavaScript, permitindo que os autores de páginas controlem as
mesmas programaticamente.
Dentro da tecnologia Ajax, o JavaScript é a cola que agrupa todos os outros
componentes. Ter uma familiaridade básica com JavaScript é um pré-requisito
para escrever aplicativos Ajax.
3.4.2 Definindo a aparência e o comportamento com CSS
As folhas de estilo em cascata (Cascading Style Sheets - CSS) são uma parte
bem estabelecida do design Web e são utilizadas tanto em aplicativos Web
clássicos como em aplicativos Ajax. Uma folha de estilo oferece uma maneira
centralizada de definir categorias de estilos visuais, que então podem ser
aplicadas a elementos individuais em uma página de forma concisa. Além dos
elementos óbvios de estilização como cores, bordas, imagens de fundo,
transparência e tamanho, as folhas de estilo podem definir a maneira como os
elementos são organizados em relação um ao outro, e também a sua
interatividade simples com o usuário, permitindo que efeitos visuais bastante
poderosos sejam alcançados somente por meio de folhas de estilo.
Em um aplicativo Web clássico, as folhas de estilo fornecem uma maneira útil
de definir um estilo em um único lugar que pode ser reutilizado em diferentes
páginas Web. Com Ajax, não mais pensamos em termos de uma sucessão
rápida de páginas, mas as folhas de estilo ainda fornecem um repositório útil de
visuais pré-definidos que podem ser aplicados dinamicamente a elementos
com um mínimo de código.
As CSS estilizam um documento definindo regras, normalmente em um arquivo
separado que é referenciado pela página Web sendo estilizada. Regras de
estilo também podem ser definidas dentro da página Web, mas isto geralmente
é considerado uma prática ruim.
48
Uma regra de estilo consiste em duas partes: o seletor e a declaração de
estilo. O seletor especifica quais elementos serão estilizados, e a declaração
de estilo declara quais propriedades de estilo serão aplicadas. Supondo que
queremos que todos os nossos títulos de nível 1 de um documento, isto é, as
tags <H1>, apareçam em vermelho. Devemos declarar uma regra CSS para
fazer isto, como mostra a Listagem 1.
Listagem 1
Exemplo de seletor e declaração de estilo.
H1 {
color: red
}
O seletor aqui é muito simples, e aplica-se a todas as tags <H1> no documento.
A declaração de estilo também é muito simples e modifica uma única
propriedade de estilo. Na pratica tanto o seletor como a declaração de estilo
podem ser consideravelmente mais complexos.
3.4.2.1 Seletores CSS
Além de definir um tipo de tag HTML ao qual aplicar um estilo, podemos limitar
a regra àqueles dentro de um contexto especifico. Há varias maneiras de
especificar o contexto: por tipo de tag HTML, por um tipo de classe declarada
ou por um ID único de elemento.
Primeiro vamos examinar os seletores por tipo de tag. Por exemplo, para
aplicar a regra da listagem anterior apenas as tags <H1> que estão contidas
dentro de uma tag <DIV>, modificaríamos nossa regra como apresentada na
Listagem 2.
Listagem 2
Seletor por tipo de tag HTML.
DIV H1 {
color: red
}
Estes também são conhecidos por seletores baseados em elementos, pois
decidem se um elemento DOM é ou não estilizado com base no seu tipo de
49
elemento. Também podemos definir classes para estilizar isso sem ter nada a
ver com o tipo de tag HTML. Por exemplo, se definirmos uma classe de estilo
chamada caixaazul, que deve aparecer em uma caixa colorida, definiríamos
uma regra como na Listagem 3.
Listagem 3
Seletor por tipo de classe declarada.
.caixazul {
border: solid blue 1px;
background-color: cyan
}
Para atribuir uma classe de estilo a um elemento, simplesmente declaramos
um atributo class na tag HTML, como na Listagem 4.
Listagem 4
Atribuição de classe de estilo.
<div>Eu vou aparecer como um texto normal</div>
<div class="caixaazul">Eu vou aparecer como uma caixa azul</div>
Os elementos podem ser atribuídos a mais de uma classe. Se definíssemos
uma classe de estilo adicional chamada textolaranja, como na Listagem 5.
Listagem 5
Estilo textolaranja.
.textolaranja {
color: orange
}
Podemos aplicar os dois estilos em um documento, como na Listagem 6.
Listagem 6
Elemento com mais de uma classe de estilo.
<div class="textolaranja">Eu sou um texto laranja</div>
<div class="caixaazul">Eu sou um texto em uma caixa colorida</div>
<div class="caixaazul textolaranja"> Eu sou uma mistura dos dois</div>
O terceiro elemento <DIV> aparecerá em texto laranja em uma caixa em ciano
com uma borda azul.
50
Podemos combinar classes com regras baseadas em elementos para definir
uma classe que só opere em tipos de tags específicos. Por exemplo, a
Listagem 7.
Listagem 7
Combinação de classes com regras baseadas em elementos.
span.highlight {
background-color: yellow
}
Esta definição só será aplicada as tags <span> com um atributo de classe
highlight declarada. Outras tags <span> ou outros tipos de elementos com a
class = "highlight" permanecerão inalterados.
Podemos especificar regras que só se aplicam a um elemento com um dado ID
único, especificado pelo atributo id da HTML. Não mais que um elemento em
um documento HTML deve ter um dado ID atribuído a ele, assim, estes
seletores, são em geral utilizados pare selecionar um único elemento em uma
página. Por exemplo, para atrair a atenção para um botão “Fechar” em uma
página, podemos criar um estilo como o da Listagem 8.
Listagem 8
Seletor por ID único de elemento.
#botaovermelho {
color: red
}
As folhas de estilo também permitem definir estilos com base em pseudoseletores. Alguns pseudo-seletores úteis incluem first-letter, que altera o
comportamento da primeira letra de um elemento, first-line, que altera a
primeira linha de um elemento e hover, que nos permite modificar a aparência
dos hiperlinks quando o ponteiro do mouse passa sobre eles. Por exemplo,
para alterarmos a cor de um link para amarelo quando o ponteiro do mouse
passar sobre ele, podemos definir uma regra como a da Listagem 9.
Listagem 9
Pseudo-seletores.
a:hover {
color: yellow
51
}
3.4.2.2 Propriedades de estilo CSS
Cada elemento em uma página HTML pode ser estilizado de diferentes
maneiras. O texto de um elemento pode ser estilizado em termos de cores,
tamanho de fonte, corpo da fonte e a família da fonte a se utilizar. Múltiplas
opções podem ser especificadas para fontes, a fim de permitir uma degradação
elegante nas situações onde uma fonte desejada não esteja instalada na
máquina do cliente. Por exemplo, a Listagem 10 mostra uma regra para
estilizar um parágrafo com texto de cor cinza, em negrito e fonte Courier New.
Listagem 10
Exemplo de propriedades para estilização de fontes.
.textocinza {
font-size: 14pt;
font-family: courier new, courier, monospace;
font-weight: bold;
folor: gray;
}
As folhas de estilo podem definir o layout e o tamanho de um elemento,
especificando as margens e os elementos de preenchimento, tanto para todos
os quatro lados como para cada um individualmente, como na Listagem 11.
Listagem 11
Exemplo de propriedades para estilização de layout
.paddedtodos {
padding: 4 px;
}
.paddedindividual {
padding-botton: 8px;
padding-top: 2px;
padding-left: 4px;
padding-right: 16px;
margin: 1px;
}
52
As dimensões de um elemento podem ser especificadas pelas propriedades de
largura (width) e altura (height). A posição de um elemento pode ser
especificada como absoluta ou relativa. Elementos posicionados de maneira
absoluta podem ser posicionados na página configurando as propriedades top
e left, enquanto elementos posicionados de uma maneira relativa fluirão com
o restante da página.
As cores de fundo podem ser configuradas utilizando a propriedade
background-color. Além disso, uma imagem de fundo pode ser configurada
utilizando a propriedade background-image, como na Listagem 12.
Listagem 12
Propriedade background-image.
.barratitulo {
background-image: url(imagens/topbar.png);
}
Os
elementos
podem
permanecer
ocultos
da
visão
configurando
visibility:hidden ou display:none. No primeiro caso, o item ainda
ocupará espaço na página, se posicionando relativamente, enquanto no último
caso, ele não ocupará.
3.4.3 Organizando a interface usando DOM
O Document Object Model (DOM) expõe um documento (uma página Web) ao
mecanismo JavaScript. Usando o DOM a estrutura de um documento pode ser
manipulada programaticamente. Esta é uma habilidade particularmente útil
para se ter à disposição ao escrever uma aplicação Ajax. Em uma aplicação
Web clássica, atualizamos regularmente a página inteira com novos fluxos de
HTML a partir do servidor e podemos redefinir boa parte da interface através da
apresentação de novo código HTML. Em uma aplicação Ajax, a maioria das
alterações na interface do usuário será feita usando o DOM.
Os elementos HTML em uma página Web estão organizados em uma estrutura
em forma de árvore. A raiz desta árvore é a tag <HTML>, que representa o
documento. Dentro dela temos a tag <BODY>, a qual representa o corpo do
documento, ela é a raiz da estrutura do documento visível. Dentro do corpo,
53
encontramos tags de tabelas, parágrafos, listas, e outros tipos de tags,
possivelmente com outras tags dentro delas.
Uma representação de uma página Web, através do DOM, é também
estruturada como uma árvore, composta de elementos ou nós, que podem
conter nós filhos dentro deles, e assim por diante recursivamente. O
mecanismo JavaScript expõe o nó raiz da página Web atual através da variável
global document, que serve como ponto de partida para todas as nossas
manipulações DOM. O elemento DOM está bem definido pela especificação da
W3C. Ele tem um único elemento pai, zero ou mais elementos filhos, e
qualquer número de atributos que são armazenados como um array associativo
(isto é, por uma chave textual, como width ou style, em vez de um índice
numérico). A Figura 13 representa a estrutura de uma página Web qualquer,
vista utilizando a ferramenta Mozilla DOM Inspector.
Figura 13
O DOM representa um documento HTML em forma de arvore.
54
O relacionamento é de duas vias. Modificar o DOM irá alterar a marcação
HTML e, consequentemente, a apresentação da página.
3.4.3.1 Trabalhando com DOM utilizando JavaScript
Com o DOM podemos adicionar qualquer elemento em uma página, definindo
seu conteúdo e os seus atributos. Assim, podemos colocar novos parágrafos,
itens em listas, e até mesmo criar uma página inteira somente utilizando o
DOM.
3.4.3.1.1 Localizando um nó DOM
A primeira coisa que precisamos fazer a fim de trabalhar em um nó DOM com
JavaScript é localizar os elementos que queremos alterar. Como mencionado
anteriormente, tudo o que temos de inicio é uma referencia ao nó raiz, na
variável global document. Cada nó no DOM é filho (ou neto, bisneto, e assim
por diante) de document, mas pesquisar a árvore mais a fundo, passo a passo,
poderia ser um processo árduo em um documento grande e complexo.
Felizmente, existem alguns atalhos. O mais comumente utilizado é sinalizar um
elemento com um ID único. Podemos ver um exemplo na Listagem 13, onde
atribuímos um ID de nome divVazio a um elemento do tipo DIV.
Listagem 13
Atribuição de ID a um elemento DOM.
<div id="divVazio"></div>
Qualquer nó DOM pode ter um ID atribuído a ele e o ID pode então ser
utilizado para obter uma referencia programática aquele nó em uma chamada
de função, onde quer que ele esteja no documento. Podemos obter esta
referência
ao
elemento
através
do
método
do
objeto
Document
getElementById(), como na Listagem 14.
Listagem 14
O método getElementById().
var hello = document.getElementById("hello");
Em algumas situações, queremos percorrer a árvore DOM passo a passo.
Como os nós DOM são organizados em forma de árvore, cada nó DOM não
55
possuirá mais que um pai, mas qualquer número de filhos. Estes podem ser
acessados pelas propriedades parentNode e childNodes. A propriedade
parentNode retorna um outro objeto do nó DOM, enquanto childNodes
retorna um array JavaScript dos nós, que podem ser interados, como mostra a
Listagem 15.
Listagem 15
A propriedade childNodes.
var filhos = divVazio.childNodes;
for (var i = 0; i < filhos.length; i++) {
…
}
Nós DOM também podem ser procurados com base nos seus tipos de tags
HTML,
utilizando
getElementsByTagName().
Por
exemplo,
document.getElementsByTagName("UL") retornará um array de todas as tags
<UL> do documento.
Esses métodos são úteis para trabalhar com documentos sobre os quais temos
relativamente pouco controle. Como regra geral, é mais seguro utilizar
getElementById() que getElementsByTagName(), uma vez que este faz
menos suposições sobre a estrutura e o ordenamento do documento, o que
pode mudar independentemente do código.
3.4.3.1.2 Criando um nó DOM
Além de reorganizar os nós DOM existentes, há casos em que queremos criar
nós totalmente novos e adicioná-los ao documento. As implementações
JavaScript do DOM também fornecem métodos para fazer isto.
O método createElement() do objeto Document pode ser utilizado para criar
qualquer elemento HTML, aceitando um tipo de tag como argumento, como
mostra a Listagem 16.
Listagem 16
O método createElement().
var elementoFilho = document.createElement("div");
56
O método createTextNode() cria um nó DOM que representa uma parte do
texto, comumente aninhado dentro do cabeçalho, div, parágrafo, e tags de itens
de lista, como mostra a Listagem 17.
Listagem 17
O método createTextnode().
var nodoTexto = document.createTextNode("Algum texto... ");
O DOM padrão trata os nós de texto separadamente daqueles que
representam elementos HTML. Eles não podem ter estilos aplicados a eles
diretamente e, como conseqüência, consomem bem menos memória. O texto
representado por um nó de texto, porém, pode ser estilizado pelo elemento
DOM que o contém.
Depois de o nó, de qualquer que seja o tipo, ter sido criado, ele precisa ser
anexado ao documento para que seja visível no navegador Web. O método
appendChild() do nó DOM é utilizado para realizar isto, como visto na
Listagem 18.
Listagem 18
O método appendChild().
document.getElementById("divVazio").appendChild(elementoFilho);
3.4.3.1.3 Adicionando estilos ao documento
As CSS oferecem uma maneira concisa de aplicar estilos predefinidos e
reutilizáveis aos documentos. Também podemos estilizar os elementos que
criamos no código tirando proveito das CSS.
A propriedade className de um nó DOM nos permite estilizar um elemento
através com as regras definidas em uma classe de estilo declarada, como na
Listagem 19.
Listagem 19
A propriedade className.
document.getElementById("divVazio").className="textolaranja";
Isto fornece uma maneira fácil e compacta de atribuir muitas regras CSS de
uma só vez em um nó e gerenciar estilizações complexas por meio de folhas
57
de estilo. Em outras situações talvez seja necessário fazer uma alteração mais
refinada no estilo de um elemento em particular, possivelmente suplementando
os estilos já aplicados por meio de CSS.
Nós DOM também contêm um array associativo chamado style que contêm
todos os detalhes do estilo do nó. Atribuir um className ao nó modificará os
valores do array style. O array style pode ser manipulado diretamente, como
pode ser visto na Listagem 20.
Listagem 20
A propriedade style.
document.getElementById("divVazio").style.border="solid Green 2px";
document.getElementById("divVazio").style.width="200px";
3.4.3.1.4 Utilizando a propriedade InnerHTML
Os métodos descritos anteriormente fornecem controle de baixo nível a API
DOM. Mas creteElement() e appendChild() fornecem uma API prolixa para
construir um documento e são mais adequadas para situações onde o
documento a ser criado segue uma estrutura regular que pode ser codificada
como um algoritmo. Elementos DOM de todos os navegadores Web populares
também suportam uma propriedade chamada innerHTML, que permite que
conteúdo arbitrário seja adicionado a um elemento de uma maneira muito
simples.
A propriedade innerHTML é uma string que representa os filhos de um nó como
marcação HTML. Por exemplo, na Listagem 21, adicionamos um elemento DIV
com um texto dentro de outro elemento DIV sem precisarmos utilizar funções
como createElement() e addChild().
Listagem 21
A propriedade innerHTML.
document.getElementById("divVazio").innerHTML=
"<div class='caixazul'> Algum texto… </div>";
3.4.4 Carregando dados assincronamente
Ao trabalhar em um aplicativo, especialmente um soberano, os usuários
estarão interagindo continuamente com o aplicativo como parte do fluxo de
58
trabalho. Já discutimos a importância de manter a aplicação responsiva. Se
toda a aplicação pára enquanto uma tarefa secundária prolongada é
executada, o usuário é interrompido. Discutimos as vantagens da chamada de
métodos assíncronas como uma maneira de melhorar a agilidade de resposta
da interface do usuário ao executar tarefas prolongadas, e notamos que,
devido à latência da rede, todas as chamadas ao servidor devem ser
consideradas como demoradas. E observamos também, que sob o modelo
básico HTTP de solicitação-resposta, isto era quase inviável. Aplicações Web
clássicas baseiam-se em recarregamentos de página inteira a cada chamada
ao servidor levando a freqüentes interrupções para o usuário.
Embora tenhamos que aceitar que uma solicitação de um documento
permanece bloqueada até que o servidor retorne sua resposta, temos algumas
formas de fazer uma solicitação ao servidor parecer assíncrona para os
usuários, permitindo que eles continuem trabalhando. As primeiras tentativas
em prover esta comunicação em segundo plano utilizavam IFrames. Mais
recentemente, o objeto XMLHttpRequest forneceu uma solução mais poderosa
e mais transparente.
3.4.4.1 IFrames
Quando DHTML chegou nas versões 4 do Netscape Navigator e do Microsoft
Internet Explorer, ele introduziu um layout flexível e programável para a página
Web. Uma extensão natural do antigo Frameset do HTML foi o IFrame. O I é
abreviatura de inline, o que significa que o frame é parte do layout de um outro
documento, em vez de se posicionar lado a lado como em um Frameset. Um
IFrame é representado como um elemento na árvore DOM, o que significa que
podermos movê-lo, redimensioná-lo, e até mesmo ocultá-lo completamente
enquanto a página está visível. A inovação fundamental veio quando as
pessoas começaram a perceber que um IFrame poderia ser estilizado para que
seja completamente invisível. Isto permitiu carregar dados em segundo plano,
enquanto
a
experiência
visível
do
usuário
permanecia
inalterada.
Repentinamente, havia um mecanismo para se comunicar com o servidor
assincronamente, embora baseado em uma manipulação de código bastante
exótica. A Figura 14 ilustra a seqüência de eventos por trás desta abordagem.
59
Figura 14
Seqüência de eventos em uma comunicação assíncrona [3].
Assim como ocorre com outros elementos DOM, um IFrame pode ser
declarado em HTML para uma página ou ser programaticamente criado
utilizando document.createElement(). Em um simples caso, no qual
queremos que somente um único IFrame não-visível carregue os dados,
podemos declará-lo como parte do documento e obter uma referência de forma
programática utilizando document.getElementById().
3.4.4.2 Objetos XMLDocument e XMLHttpRequest
Os IFrames podem ser utilizados para solicitar dados nos bastidores, mas é
essencialmente um hack, uma manipulação imprevista do código, dando um
novo propósito para algo originalmente introduzido para exibição de conteúdo
visível dentro de uma página. Versões posteriores dos navegadores Web
populares introduziram objetos apropriados destinados a transferência
assíncrona de dados, os quais, oferecem algumas vantagens convenientes
sobre os IFrames.
Os objetos XmlDocument e XMLHttpRequest são extensões não padronizadas
no DOM dos navegadores Web, que acabaram sendo suportados pela maioria
dos navegadores. Eles simplificam consideravelmente o processo de efetuar
chamadas assíncronas, pois são explicitamente projetados para recuperar
dados em segundo plano. Ambos os objetos se originaram como componentes
60
ActiveX40 específicos da Microsoft, que estavam disponíveis como objetos
JavaScript no navegador Internet Explorer. Desde então, outros navegadores
implementaram objetos nativos com funcionalidade e API semelhantes. Ambos
executam funções similares, mas o XMLHttpRequest provê um controle mais
detalhado sobre a solicitação, sendo este o mais utilizado na implementação de
mecanismos Ajax.
A
Listagem
22
mostra
uma
função
simples
que
cria
um
objeto
XMLHttpRequest.
Listagem 22
Exemplo de função de criação do objeto XMLHttpRequest.
function getXMLHTTPRequest() {
var xRequest = null;
if (window.XMLHttpRequest) {
xRequest = new XMLHttpRequest(); // Mozilla/Safari
} else if (typeof ActiveXObject != "undefined") {
xRequest = new ActiveXObject("Microsoft.XMLHTTP"); // IE
}
return xRequest;
}
Essa função retornará um objeto XMLHttpRequest com uma API idêntica na
maioria dos navegadores modernos. A maneira de criar o objeto difere
consideravelmente.
O código verifica o suporte ao objeto XMLHttpRequest nativo (que ele
localizará nos navegadores Mozilla e Safári recentes), se não houver, ele irá
recorrer ao objeto ActiveX, testando se ele é ou não suportado (o que será
verdade apenas nos navegadores da Microsoft). Em um navegador que não
suporta nenhum deles, retornará o valor null. Portanto, é possível criar um
objeto que enviará solicitações ao servidor automaticamente.
3.4.4.3 Enviando uma solicitação para o servidor
Enviar uma solicitação ao servidor a partir de um objeto XMLHttpRequest é
bem simples e direta. Tudo o que precisamos fazer é fornecer a URL das
40
ActiveX é uma tecnologia da Microsoft para o desenvolvimento de páginas dinâmicas.
61
páginas do servidor que irão gerar os dados. A Listagem 23 mostra um
exemplo de como isto é feito.
Listagem 23
Exemplo de envio de solicitação através do objeto XMLHttpRequest.
function sendRequest(url, parametros, metodoHttp) {
if (!metodoHttp) {
metodoHttp = "POST";
}
var req = getXMLHTTPRequest();
if (req) {
req.onreadystatechange = onReadyState;
req.open(metodoHttp, url, true);
req.setRequestHeader("Content-Type",
"application/x-www-form-
urlencoded");
req.send(parametros);
}
}
O método sendRequest() é construído de maneira que o segundo e terceiro
parâmetro são opcionais, assumindo por padrão o uso de POST caso não seja
informado o método HTTP como parâmetro.
O código nessa listagem configura a solicitação e retornará o controle
imediatamente, enquanto a rede e o servidor esperam. Isso é bom para a
responsividade, mas como saber que a solicitação foi completada?
3.4.4.4 Usando funções de retorno de chamada
A segunda parte da equação para tratar comunicações assíncronas é
configurar um ponto de reentrada no código, a fim de receber os resultados da
chamada depois de concluída. Isso geralmente é implementado atribuindo uma
função de retorno de chamada, isto é, um trecho de código que será invocado
quando os resultados estiverem prontos, em algum ponto não especificado no
futuro.
Funções de retorno de chamada se ajustam a abordagem de programação
baseada em eventos, utilizadas nos conjuntos de ferramentas mais modernos
de UI, pressionamentos de teclado, cliques do mouse e alguns outros também
ocorrerão em pontos não especificados no futuro, e o programador antecipa
62
estes eventos escrevendo uma função para tratá-los quando eles ocorrem. Ao
codificar eventos de UI em JavaScript, atribuímos funções para onkeypress,
onmouseover e outras propriedades com nomes semelhantes de um objeto. Ao
codificar retornos de chamada e uma solicitação de servidor, encontramos
propriedades semelhantes chamadas onload e onreadystatechange.
Tanto o Internet Explorer como o Mozilla suportam o retorno de chamada
onreadystatechange. Uma simples rotina de retorno de chamada é
demonstrada na Listagem 24.
Listagem 24
Exemplo de rotina de retorno de chamada.
var req = null;
var console = null;
var READY_STATE_UNINITIALIZED = 0;
var READY_STATE_LOADING = 1;
var READY_STATE_LOADED = 2;
var READY_STATE_INTERACTIVE = 3;
var READY_STATE_COMPLETE = 4;
function sendRequest(url, parametros, metodoHttp) {
if (!metodoHttp) {
metodoHttp = "GET";
}
req = getXMLHTTPRequest();
if (req) {
req.onreadystatechange = onReadyState;
req.open(metodoHttp, url, true);
req.setRequestHeader("Content-Type",
"application/x-www-form-
urlencoded");
req.send(parametros);
}
}
function onReadyState() {
var ready = req.readyState;
var dados = null;
if (ready == READY_STATE_COMPLETE) {
dados = req.responseText;
} else {
dados = "carregando… [" + ready + "]";
63
}
// Faz algo com os dados
}
Primeiro alteramos a função sendRequest() para informar ao objeto da
solicitação qual é a sua rotina de tratamento de retorno de chamada, antes de
enviá-lo. Segundo, defini-se a função de tratamento que na listagem foi
chamada onReadyState().
A propriedade readyState pode aceitar um intervalo de valores numéricos. Na
listagem foram atribuídas variáveis identificadas descritivamente para cada um
destes valores numéricos. O código da listagem só está interessado em
verificar o valor 4, correspondente a conclusão da solicitação.
3.4.5 Ciclo de vida completo
Agora há informação suficiente para agrupar o ciclo de vida completo da carga
de um documento. Instanciamos o objeto XMLHttpRequest, instruindo-o a
carregar um documento e então monitoramos o processo de carregamento
assincronamente utilizando rotinas de tratamento de retorno de chamada.
Nesse exemplo simples da Listagem 25, definimos um nó DOM chamado
console, para o qual geramos informações sobre status para obter um registro
escrito do processo de carregamento.
Listagem 25
Exemplo de ciclo de vida completo de carga de um documento.
<html>
<head>
<script type="text/javascript">
var req = null;
var console = null;
var READY_STATE_UNINITIALIZED = 0;
var READY_STATE_LOADING = 1;
var READY_STATE_LOADED = 2;
var READY_STATE_INTERACTIVE = 3;
var READY_STATE_COMPLETE = 4;
function sendRequest(url, parametros, metodoHttp) {
64
if (!metodoHttp) {
metodoHttp = "GET";
}
req = getXMLHTTPRequest();
if (req) {
req.onreadystatechange = onReadyState;
req.open(metodoHttp, url, true);
req.setRequestHeader("Content-Type",
"application/x-www-form-
urlencoded");
req.send(parametros);
}
}
function getXMLHTTPRequest() {
var xRequest = null;
if (window.XMLHttpRequest) {
xRequest = new XMLHttpRequest(); // Mozilla/Safari
} else if (typeof ActiveXObject != "undefined") {
xRequest = new ActiveXObject("Microsoft.XMLHTTP"); // IE
}
return xRequest;
}
function onReadyState() {
var ready = req.readyState;
var dados = null;
if (ready == READY_STATE_COMPLETE) {
dados = req.responseText;
} else {
dados = "carregando… [" + ready + "]";
}
toConsole(dados);
}
function toConsole(dados) {
if (console != null) {
var novaLinha = document.createElement("div");
console.appendChild(novaLinha);
var texto = document.createTextNode(dados);
novaLinha.appendChild(texto);
}
65
}
window.onload = function() {
console = document.getElementById("console");
sendRequest("dados.txt");
}
</script>
</head>
<body>
<div id="console"></div>
</body>
</html>
Figura 15
Figura 16
Neste
Resultado da execução da solicitação visualizado no Internet Explorer.
Resultado da execução da solicitação visualizado no Mozilla Firefox.
exemplo foi utilizada
a
propriedade
responseText
do
objeto
XMLHttpRequest para recuperar a resposta como uma string de texto. Isto é
66
útil para dados simples, mas se precisarmos que uma coleção estruturada
maior dos dados seja retornada, então se pode utilizar a propriedade
responseXML. Se tiver sido alocado o tipo MIME text/xml a resposta, então
teremos um documento DOM como resposta, o qual podemos acessar
programaticamente seus atributos e funções como getElementById() e
childNodes.
Como exemplo de resposta no formato XML podemos modificar o código da
Listagem 25. O arquivo de resposta será um documento XML bem simples, que
chamaremos de dados.xml, como na Listagem 26.
Listagem 26
Arquivo XML retornado como resposta no exemplo
<?xml version="1.0" ?>
<root>
Texto de teste da requisicao!
</root>
Modificaremos o método onReadyState para receber uma resposta XML,
através da propriedade responseXML como na Listagem 27.
Listagem 27
Método onReadyState modificado para receber uma resposta em XML
function onReadyState() {
var ready = req.readyState;
var dados = null;
if (ready == READY_STATE_COMPLETE) {
dados = req.responseXML;
toConsole(dados);
}
}
Também alteramos o método toConsole para tratar a resposta agora em XML.
Como vemos na Listagem 28.
Listagem 28
Método toConsole modificado para receber uma resposta em XML
function toConsole(dadosXML) {
if (console != null) {
var novaLinha = document.createElement("div");
67
console.appendChild(novaLinha);
var rootNode = dadosXML.getElementsByTagName("root").item(0);
var texto = document.createTextNode(rootNode.firstChild.data);
novaLinha.appendChild(texto);
}
}
E por fim nosso pedido de requisição ao servidor, pedindo o arquivo
dados.xml, como vemos na Listagem 29.
Listagem 29
Requisição pedindo um arquivo XML
window.onload = function() {
console = document.getElementById("console");
sendRequest("dados.xml");
}
Estes são, então, os blocos de construção do Ajax. Cada um trás algo útil, mas
uma boa parte do poder do Ajax é proveniente da maneira como as partes são
combinadas em um todo.
3.5 JSON
JSON é um outro formato para intercambio de dados, e é visto como uma
alternativa ao XML em aplicações Ajax. Grandes empresas como Google e
Yahoo! adotaram JSON como formato de intercambio de dados em diversas de
suas aplicações.
3.5.1 O Objeto Literal JavaScript
A especificação do ECMA Script (ECMA262, 3rd Edition, December 1999), que
formaliza o JavaScript, define na página 2 (4.2) a sentença:
“An ECMAScript object is an unordered collection of properties each with
zero or more attributes…” [6]
68
Essa definição é o que se chama de objeto literal, que é uma coleção não
ordenada de propriedades com um ou mais elementos, onde esses elementos
podem ser valores primitivos comuns a todas as linguagens como: inteiro,
string ou char; ou outros objetos. A Listagem 30 demonstra um objeto literal
JavaScript.
Listagem 30
Exemplo de objeto literal JavaScript
var produto = {
nome:"Celular Nokia N95",
valor:1999,
frete:50,
getValorTotal:function() {
return (this.valor + this.frete)
}
}
3.5.2 O que é JSON
Douglas Crockford, propôs um formato de troca de dados simples com base no
objeto literal do JavaScript, que denominou de JSON (JavaScript Object
Notation).
“JSON é uma formatação leve de troca de dados. Para seres humanos,
é fácil de ler e escrever. Para máquinas, é fácil de interpretar e gerar.
Está baseado em um subconjunto da linguagem de programação
JavaScript, Standard ECMA-262 (3a Edição - Dezembro - 1999). JSON
é em formato texto e completamente independente de linguagem, pois
usa convenções que são familiares às linguagens C e familiares,
incluindo C++, C#, Java, JavaScript, Perl, Python e muitas outras. Estas
propriedades fazem com que JSON seja um formato ideal de troca de
dados.” [7]
JSON está constituído em duas estruturas:
69

Uma coleção de pares nome/valor. Em várias linguagens, isto é
caracterizado como um object, record, struct, dicionário, hash table,
keyed list, ou arrays associativas.

Uma lista ordenada de valores. Na maioria das linguagens, isto é
caracterizado como uma array, vetor, lista ou sequência.
Estas são estruturas de dados universais. Virtualmente todas as linguagens de
programação modernas as suportam, de uma forma ou de outra. É aceitável
que um formato de troca de dados que seja independente de linguagem de
programação se baseie nestas estruturas.
Em JSON, os dados são apresentados da seguinte forma:
3.5.2.1 Objeto
Um objeto é um conjunto desordenado de pares nome/valor. Um objeto
começa com { (chave de abertura) e termina com } (chave de fechamento).
Cada nome é seguido por : (dois pontos) e os pares nome/valor são seguidos
por , (vírgula). A Figura 17 ilustra a estrutura de um objeto no formato JSON.
Figura 17
Objeto em notação JSON
A Listagem 31 demonstra um exemplo de objeto no formato JSON.
Listagem 31
Exemplo de um objeto em notação JSON
var contato = {
nome:"Ulysses Kuntze",
email:"[email protected]",
aniversário:"30/10/1981"
}
70
3.5.2.2 Array
Um array é uma coleção de valores ordenados. O array começa com [
(colchete de abertura) e termina com ] (colchete de fechamento). Os valores
são separados por , (vírgula). A Figura 18 ilustra a estrutura de um array no
formato JSON.
Figura 18
Array em notação JSON
A Listagem 32 demonstra um exemplo de array no formato JSON.
Listagem 32
Exemplo de um array em notação JSON
var contato = {
nome:"Ulysses Kuntze",
email:"[email protected]",
aniversário:"30/10/1981",
telefones:[
'84028077',
'32487738'
]
}
3.5.2.3 Valor
Um valor pode ser uma cadeia de caracteres (string), ou um número, ou true
ou false, ou null, ou um objeto ou um array. Estas estruturas podem estar
aninhadas. A Figura 19 ilustra a estrutura de um valor no formato JSON.
71
Figura 19
Valor em notação JSON
A Listagem 33 demonstra um exemplo de valores e estruturas aninhadas no
formato JSON.
Listagem 33
Exemplo de valores e estruturas aninhadas em notação JSON
var contato = {
nome:"Ulysses Kuntze",
email:"[email protected]",
aniversário:"30/10/1981",
telefones:[
'84028077',
'32487738'
],
endereco:{
rua:"Irmã Bonavita",
numero:11,
mapa:{
latitude:12.123456,
longitude:65.654321
}
}
}
72
3.5.2.4 String
Uma string é uma coleção de nenhum ou mais caracteres Unicode, envolvido
entre aspas duplas usando barras invertidas como caractere de escape. Um
caractere está representando como um simples caractere de string. Uma
cadeia de caracteres é parecida com uma cadeia de caracteres em C ou Java.
A Figura 20 ilustra a estrutura de uma string no formato JSON.
Figura 20
String em notação JSON
A Listagem 34 demonstra um exemplo de string no formato JSON.
Listagem 34
Exemplo de string em notação JSON
var teste = {
string:"Texto de \"teste\" meramente ilustrativo"
}
73
3.5.2.5 Número
Um número é similar a um número em C ou Java, exceto pelo fato de não se
usar os números octais e hexadecimais. A Figura 21 ilustra a estrutura de um
número no formato JSON.
Figura 21
Número em notação JSON
Espaços em branco podem ser inseridos em qualquer parte dos símbolos.
Exceto por pequenos detalhes, a linguagem foi completamente descrita acima.
3.5.3 Parsers JSON
Existem códigos de processamento JSON prontos em dezenas de linguagens,
praticamente em todas as linguagens modernas. A lista de linguagens
suportadas incluem ActionScript, C/C++, C#, Delphi, ColdFusion, Java,
JavaScript, Objective CAML, Perl, PHP, Python, Rebol, Ruby, e Lua. Uma lista
completa pode ser encontrada no site do projeto ( http://www.json.org ).
Em JavaScript o parser para JSON é extremamente simples, e consiste apenas
em chamar a função eval() que é nativa da especificação da linguagem.
Como exemplo iremos alterar novamente o código apresentado na Listagem
25. O arquivo de resposta será um documento texto bem simples, que
chamaremos de json.txt, este arquivo possui uma string em formato JSON,
como na Listagem 35.
74
Listagem 35
Conteúdo do arquivo json.txt
{[
{nome:"UFSC", endereco:"http://www.ufsc.br" },
{nome:"CTC", endereco:"http://www.ctc.ufsc.br/" },
{nome:"INE", endereco:"http://www.inf.ufsc.br/" }
]}
Modificaremos o método onReadyState para receber uma resposta de texto
em notação JSON, através da propriedade responseText, e então passamos
esta resposta ao método eval() que fará o parser da notação JSON para um
objeto literal JavaScript, como na Listagem 36.
Listagem 36
Método onReadyState modificado para receber uma resposta JSON
function onReadyState() {
var ready = req.readyState;
var dadosJSON = null;
if (ready == READY_STATE_COMPLETE) {
dadosJSON = eval(req.responseText);
toConsole(dadosJSON);
}
}
Também alteramos o método toConsole para tratar a resposta agora em
JSON. Como vemos na Listagem 37.
Listagem 37
Método toConsole modificado para receber um parâmetro JSON
function toConsole(dadosJSON) {
if (console != null) {
for (var i=0; i<dadosJSON.length; i++) {
var novaLinha = document.createElement("div");
console.appendChild(novaLinha);
//recupera o nome
var nome = dadosJSON[i].nome;
//recupera o endereco
var endereco = dadosJSON[i].endereco;
var texto = document.createTextNode(nome + ' - ' + endereco);
novaLinha.appendChild(texto);
}
75
}
}
E por fim nosso pedido de requisição ao servidor, pedindo o arquivo json.txt
que contém uma string em formato JSON. Como vemos na Listagem 38.
Listagem 38
Requisição de resposta em formato JSON
window.onload = function() {
console = document.getElementById("console");
sendRequest("json.txt");
}
3.5.4 JSON vs XML
Normalmente o retorno das requisições Ajax é tratado como XML. Isso implica
que o código JavaScript deverá percorrer toda a estrutura do XML e interpretálo.
Existem duas grandes vantagens na utilização de JSON. A primeira delas é a
redução da quantidade de dados que retornam do servidor. A descrição de um
objeto em JSON é bem mais enxuta que a descrição do mesmo objeto em
XML. As Listagens 39 e 40 demonstram a diferença entre o formato XML e
JSON na descrição de um produto.
Listagem 39
Exemplo em formato XML
<produtos>
<produto id="1">
<nome>Refrigerante da Maroca</nome>
<fornecedor>Maroca Ltda.</fornecedor>
<contato>Mara Regina</contato>
<telefone>011-1111-1111</telefone>
</produto>
</produtos>
Listagem 40
Exemplo em formato JSON
[{
id:1,
76
nome:'Refrigerante da Maroca',
fornecedor:'Maroca Ltda.',
contato:'Mara regina',
telefone:'011-1111-1111'
}]
A descrição do produto em formato XML possui um total de 178 caracteres,
enquanto a descrição do produto em formato JSON possui apenas 107
caracteres, sendo o formato JSON 66% menor que o formato XML para este
caso.
Outra grande vantagem de se utilizar o JSON é que, de posse da string de
descrição do objeto, você precisa apenas chamar o método eval() do
JavaScript, para já ter o objeto pronto para o uso. Não há a necessidade de
percorrer toda a estrutura do arquivo XML, o que diminui a complexidade do
código JavaScript.
3.6 O que diferencia o Ajax
Em uma aplicação Web clássica, a seqüência de trabalho do usuário é definida
pelo código no servidor, e o usuário vai de uma página a outra, pontuado pelo
recarregamento da página inteira. Durante estes recarregamentos, o usuário
não pode continuar com seu trabalho. Em uma aplicação Ajax, o fluxo de
trabalho é pelo menos em parte definida pela aplicação cliente, e a
comunicação com o servidor é feita em segundo plano enquanto o usuário
prossegue com seu trabalho.
O navegador Web é um ambiente flexível e complacente, e funcionalidades
Ajax e não Ajax podem ser misturadas na mesma aplicação.
O que diferencia o Ajax não são as tecnologias que ele emprega, mas o
modelo de interação que ele permite por meio do uso dessas tecnologias. O
modelo de interação baseado na Web como qual estamos acostumados não é
adequado para aplicativos soberanos, e novas possibilidades começam a
surgir à medida que nos afastamos deste modelo de interação.
Existem ao menos dois níveis nos quais Ajax pode ser utilizado, e diversas
posições entre estes à medida que abandonamos a clássica abordagem
77
baseada em páginas. A estratégia mais simples é desenvolver componentes
baseados no Ajax amplamente auto-suficientes e que possam ser adicionados
a uma página Web com algumas instruções e importações de script. Lista de
operações na bolsa de valores, calendários interativos, e janelas de bate-papo
talvez sejam aplicativos típicos deste tipo de componente. Ilhas de
funcionalidade do tipo aplicativo são embutidas em uma página Web do tipo
documento, como ilustrado na Figura 22.
Figura 22
Uma página com componentes Ajax embutidos [3].
A maioria das tentativas iniciais do Google em relação ao Ajax se enquadra
neste modelo. A lista suspensa do Google Suggest e o componente de mapas
no Google Maps são elementos interativos embutidos em uma página.
Se quisermos adotar Ajax de uma maneira mais ousada, podemos virar este
modelo de ponta-cabeça, desenvolvendo uma aplicação em que fragmentos do
tipo aplicativo e do tipo documento possam residir, como ilustra a Figura 23.
78
Figura 23
Uma aplicação Ajax em que ilhas de conteúdo do tipo documento podem
ser carregadas ou declaradas programaticamente.
Esta abordagem é mais parecida com uma aplicação desktop, ou até mesmo
com um gerenciador de janelas ou um ambiente de área de trabalho. O GMail
do Google se encaixa neste modelo, com mensagens individuais exibidas
como documentos dentro de uma superestrutura interativa do tipo aplicativo.
De alguma maneira, aprender as tecnologias é a parte fácil. O desafio
interessante no desenvolvimento com Ajax está em aprender como usá-las em
conjunto. Estamos acostumados a pensar em aplicações Web como
storyboards, e redirecionamos o usuário de uma página para outra seguindo
um roteiro predeterminado. Com funcionalidades do tipo aplicativo em nossa
aplicação Web, podemos fornecer ao usuário um tratamento mais refinado
sobre o negócio, o que pode permitir uma abordagem mais flexível de solução
de problemas para este trabalho.
Para obter os benefícios desta maior flexibilidade, temos que questionar boa
parte dos nossos hábitos de codificação. Um formulário HTML é o único modo
de um usuário entrar com informações? Deveríamos declarar todas as nossas
interfaces com o usuário em HTML? Podemos comunicar com o servidor em
resposta às interações do usuário tal como pressionamento de teclas e
movimentos do mouse, bem como o convencional clique do mouse? No ritmo
79
acelerado do mundo da tecnologia da informação, enfatizamos mais o
aprendizado de novas habilidades, mas devemos desaprender hábitos antigos
pode ser também igualmente importante.
3.7 Vantagens e desvantagens
Como acontece com a maioria das tecnologias, o seu sucesso depende do uso
que as pessoas lhes dão. Indiscutivelmente, usar Ajax levanta algumas
questões, tanto para os desenvolvedores de aplicações Web como para os
usuários das aplicações, que podem por em risco o seu uso, mas quando
usado corretamente, existem diversas vantagens que não podem ser ignoradas
por quem desenvolve aplicações Web, como demonstram os grandes sucessos
que se têm observado nos últimos anos, como é o caso do GMail e Google
Maps da Google.
3.7.1 Vantagens
As principais vantagens decorrentes do uso de Ajax são as observáveis pelos
usuários das aplicações que fazem uso desta abordagem. Do ponto de vista de
quem desenvolve uma aplicação Ajax as vantagens não são tão óbvias, não se
pode dizer que o seu desenvolvimento ou manipulação de dados seja
necessariamente mais simples, contudo estas não deixam de existir,
principalmente se considerar-se que o uso de Ajax pode alterar a forma como
questões de usabilidade serão abordadas no futuro.
3.7.1.1 Vantagens com relação à usabilidade
As vantagens mais visíveis para um usuário de uma aplicação Ajax são as que
dizem respeito a sua interatividade e usabilidade. O ganho na interatividade faz
com que o comportamento das aplicações Web se aproxime do das aplicações
desktop, possibilitando ações como drag and drop e dando no geral uma maior
fluidez a navegação entre diferentes páginas de uma mesma aplicação. Dentre
os aspectos que mais se destacam no nível da interatividade que Ajax
possibilita podemos citar:
80
3.7.1.1.1 Tempos de espera mais curtos
Não sendo necessário carregar toda a página novamente, há uma grande
redução na largura de banda gasta quando se compara uma requisição Ajax
com uma requisição HTTP convencional para carregar uma página.
Menor gasto de largura de banda implica tempos de espera inferiores, o que é
vantajoso para qualquer aplicação Web uma vez que não provoca tantas
quebras no acesso a informação.
3.7.1.1.2 Validações automáticas em formulários
Não é necessário esperar que a submissão do formulário termine para saber se
um dado identificador de usuário está disponível ou é válido. Através de Ajax, é
possível realizar a validação no servidor em tempo real de dados inseridos em
formulários. Identificadores de usuários, números seriais, CEP, CPF, RG e todo
tipo de dados que necessitam validação por parte do servidor, podem ser
validados no formulário antes mesmo do usuário realizar a submissão do
mesmo.
Figura 24
Validação automática no servidor de nome de usuário em formulário
81
3.7.1.1.3 Páginas de confirmação
Podemos utilizar Ajax para eliminarmos páginas de confirmação, que são
essencialmente um desperdício, e existem somente porque um formulário Web
necessita ser submetido a fim de ser processado. O XMLHttpRequest resolve
isto e nos proporciona a opção de confirmarmos uma ação diretamente no
momento em que ela acontece.
3.7.1.1.4 Operações de Mestre-detalhe
Baseado em um evento originado pelo cliente, uma página pode obter
informações mais detalhadas sobre uma informação inicial. Por exemplo, podese obter detalhes de um determinado produto presente em uma lista de
produtos ao se passar o mouse sobre o nome do mesmo.
Figura 25
Exemplo de operação mestre-detalhe
82
3.7.1.1.5 Autocompletar em campos de formulário
Ao preencher campos de texto, é frequente que os dados que o usuário vai
inserir sejam previsíveis, quer seja por outro usuário já os ter inserido, como é
o caso de queries repetidas em sites de busca, quer seja por estarem
diretamente associados ao usuário em questão, como no preenchimento
automático do campo “para:” em um webmail usando a lista de contatos do
usuário. Neste tipo de campos faz sentido usar Ajax para ir buscar
dinamicamente as entradas mais freqüentes que comecem pelas letras que o
usuário está digitando, reduzindo assim o tempo necessário para escrever
entradas de texto longas e eventualmente ajudando o usuário a escrever aquilo
que pretende quando este não sabe exatamente o que escrever (quer seja um
endereço de e-mail ou uma palavra-chave de uma pesquisa).
Figura 26
Exemplo de autocompletar em campo no Google GMail.
3.7.1.1.6 Manipulação de dados mais interativa
Quando se pretende executar ações como reordenar uma lista de resultados
ou realizar qualquer tipo de filtragem, pode valer à pena usar Ajax para não ter
de carregar a página inteira novamente. Este tipo de situação aplica-se a todos
os acessos a dados que dependem fortemente do input do usuário.
3.7.1.1.7 Navegação em estruturas hierárquicas profundas
83
Às vezes é inviável carregar todos os dados relacionados com um assunto em
uma determinada página, tendo que remeter informações adicionais para nós
mais profundos na hierarquia de conteúdo que está sendo apresentada. Um
exemplo desta situação é nos tópicos de alguns fóruns de discussão nos quais
as respostas estão encadeadas, isto é, é possível responder a uma resposta
de outro usuário dentro de um tópico, sendo que não é viável mostrar toda a
árvore de respostas, mostrando-se apenas um nível da árvore de cada vez.
Nestas situações é vantajoso usar Ajax para expandir um nó da árvore, em
oposição a abrir uma página nova com o conteúdo (respostas) deste nó.
3.7.1.1.8 Interação do usuário com a aplicação
Ações como votar em uma enquete e ver imediatamente os totais da votação
ou fazer uma pergunta por meio de um formulário on-line, ganham uma
dimensão completamente diferente quando a resposta do site é imediata. O
uso de Ajax neste tipo de ações encoraja os usuários a darem opinião ao site,
o que promove a aproximação usuário-site e leva os criadores do site a
adequarem-se melhor as necessidades dos seus usuários.
3.7.1.1.9 Rápida interação entre usuários
Em aplicações de postagem de mensagens que criam discussões imediatas
entre usuários, forçar o usuário a dar refresh na página a todo o momento a fim
de verificar a existência de alguma resposta não é uma boa prática. As
respostas deveriam ser imediatas, o usuário não deveria ter que dar refresh na
página obsessivamente. Com Ajax é possível monitorar o servidor em busca de
novas informações e informá-las ao usuário no momento em que ocorrem. O
GMail inovou o antigo “refresh mail box” , presente nas antigas contas de email do Hotmail e Yahoo, notificando a presença de novas mensagens de
forma instantânea.
3.7.1.1.10
Avançados controles e UI Widgets
Controles como os de árvores, menus, e barras de progressão podem ser
providos sem a necessidade de refresh da página.
3.7.1.1.11
Recarregamento de informações
84
Páginas podem obter informações atualizadas do servidor sem a necessidade
de refresh. Informações como: placares de jogos, cotações de ações, previsão
do tempo ou outras informações especificas.
Figura 27
Exemplo de busca de informações atualizadas no servidor.
3.7.1.2 Desempenho e compatibilidade
Os ganhos em usabilidade de Ajax são muitos, mas convém não esquecer que
já era possível ter elevados índices de interatividade recorrendo a outras
tecnologias. O uso de applets Java ou de elementos Flash em sites não é uma
novidade e já era possível através destes melhorar a experiência do usuário ao
visitar um site, porém há dois aspectos a serem levados em consideração
nestes tipos de elementos: por um lado, tratam-se de elementos que
computacionalmente são, muitas vezes, muito pesados para um computador
processar, limitando assim o número de usuários que conseguem tirar proveito
do seu uso; por outro lado, estes elementos frequentemente requerem a
instalação de software adicional (plug-ins) no computador do usuário, que
muitas vezes não é desejável (tempo necessário para download do software e
85
espaço que ocupa, entre outros). Com Ajax estas questões não são tão
importantes, uma vez que a maioria dos sistemas já suportam todos os
elementos necessários para a visualização de um site em Ajax sem qualquer
tipo de software adicional.
3.7.1.3 Dispositivos móveis
Uma outra aplicação de Ajax que já começa a surgir é a que diz respeito ao
seu uso em dispositivos móveis. Além das questões de usabilidade, há de se
considerar nestes dispositivos o ganho em termos de consumo de tráfego, já
que em dispositivos móveis esta questão se coloca em duas vertentes: tempo
de carregamento e custos associados. Recentemente, os desenvolvedores do
navegador Opera lançaram um toolkit que permite lidar com este tipo de
requisições de uma forma mais transparente, de modo que não seja necessário
desenvolver sites específicos para determinados sistemas operacionais, como
é
feito
atualmente.
Este
toolkit
traz
ainda
grandes
benefícios
no
desenvolvimento de interfaces para smart phones e uma vez que a tecnologia
Ajax está apenas agora ganhando notoriedade é provável que venha a surgir
maior suporte para este tipo de dispositivos.
3.7.1.4 Web Standards
Com exceção da linguagem de programação JavaScript, todas as outras
tecnologias associadas ao termo Ajax, como: HTML, XML, CSS, DOM e
XMLHttpRequest são padrões W3C (World Wide Web Consortium).
3.7.1.5 Independência de tecnologia do lado servidor
Pode ser utilizada qualquer tecnologia do lado servidor. A abordagem Ajax se
concentra na camada de apresentação no lado cliente.
3.7.1.6 Inúmeros frameworks de qualidade
Existem inúmeros frameworks Ajax.
86
3.7.1.7 Adoção maciça da indústria
Ajax está sendo amplamente aceito pela indústria. Empresas como Google,
Yahoo! e Microsoft são exemplos de empresas que estão utilizando Ajax em
praticamente todas suas novas aplicações.
3.7.2 Desvantagens
Como em qualquer tecnologia, Ajax não deixa de ter as suas desvantagens. A
maioria destas desvantagens pode ser contornada pelos desenvolvedores.
Parte destas desvantagens deve-se também ao fato de Ajax ser usado em
contextos em que não é adequado. Muitos destes problemas irão desaparecer
assim que o Ajax for ganhando maturidade. Assim que a comunidade de
desenvolvedores for ganhando experiência na construção de aplicações Web
com Ajax, provavelmente serão documentados cada vez mais, melhores
práticas, design patterns e guias sobre o assunto.
3.7.2.1 Desvantagens em relação à usabilidade
3.7.2.1.1 Botão voltar e favoritos
Algumas questões envolvendo a atualização dos dados utilizando Ajax, são os
problemas do não funcionamento correto do botão “Voltar” do navegador em
alguns casos, e a URL na barra de endereços do navegador não refletir o
estado real da aplicação, o que pode ocasionar problemas de bookmarking,
deixando o usuário sem saber em que parte do site ele se encontra somente
visualizando a barra de endereços do navegador Web.
Apesar de haver implementações e frameworks que tratem destas questões, a
maioria das aplicações não tem esse cuidado.
3.7.2.1.2 Feedback ao usuário
Uma questão que se prende com a navegação entre páginas é o fato de não
ser dado feedback ao usuário sobre o estado das suas requisições, isto é, se a
página que o usuário quer acessar está efetivamente a ser aberta. Por
exemplo, é importante para o usuário saber que os dados que ele acabou de
enviar para o sistema estão sendo processados, porque os mecanismos de
feedback convencionais como, uma ampulheta girando ou a barra do
87
navegador sendo preenchida não se aplicam ao XMLHttpRequest. Uma técnica
utilizada é a troca do texto do botão de submissão por um texto do tipo
“Atualizando...”, evitando que o usuário clique no botão de submissão do
formulário repetidas vezes esperando por uma resposta.
Figura 28
Exemplos de feedback ao usuário
3.7.2.1.3 Scrolling
Há a questão do scrolling, numa página longa em que seja necessário rolar o
scroller da página para ver um determinado conteúdo, caso o mecanismo Ajax
retire um parágrafo acima do conteúdo que está sendo visualizado todo o texto
será "puxado" para cima.
3.7.2.1.4 Rompimento das convenções existentes
Ainda
que
existam novas
possibilidades em
nível de
interface,
os
desenvolvedores devem ter o cuidado de não romper completamente com as
convenções existentes uma vez que correm o risco dos usuários não saberem
como utilizar os seus sites.
3.7.2.1.5 Indexação
Ainda deve-se levar em conta o fato de que a indexação dos conteúdos por
parte de motores de busca não é possível nos conteúdos que são acessíveis
através de Ajax. Para estes casos seria necessário disponibilizar uma versão
acessível sem usar Ajax.
3.7.2.1.6 Percepção do usuário
88
Outra questão é a dos usuários não notarem que determinada parte da página
que estão visualizando foi atualizada.
Figura 29
Comparativo entre os modelos de interação
Pode-se aliviar este problema utilizando-se uma variedade de técnicas visuais
que focam nossa percepção a estas áreas atualizadas de forma sutil, somente
para que o usuário perceba que aquela parte da página foi atualizada.
Figura 30
Focando a percepção as áreas atualizadas de forma sutil
3.7.2.1.7 Eliminar aceitação
Não se deve utilizar Ajax para eliminar aceitação. O objeto XMLHttpRequest
pode ser utilizado para salvar automaticamente os dados de um formulário,
sem a necessidade do usuário clicar em um botão de “Confirmar” ou “Salvar”.
89
Isso parece ótimo, mas entra em conflito com um principio muito importante da
usabilidade, que trata do direito do usuário explorar a interface da aplicação
adicionando ou editando informações sem necessariamente atualizar nada
realmente. Ao atualizar os dados automaticamente, não se dá ao usuário a
chance de poder desfazer o que ele fez.
3.7.2.1.8 Quebrar o foco do usuário
Deve-se evitar quebrar o foco do usuário do que ele realmente esta tentando
fazer. Por exemplo, no caso de um site de pesquisa que traz os resultados a
cada caractere digitado pelo usuário. Um usuário está buscando pela palavra
“usabilidade”. Seu primeiro foco de atenção é na escrita da palavra
“usabilidade” e em segundo lugar encontrar um artigo sobre o tema. Se o site
começa a trazer resultados à medida que ele começa a digitar, isto irá quebrar
a sua atenção para o que estava tentando fazer.
Ele digitou “u” e o site trouxe inúmeros resultados que contenham a letra “u” em
alguma parte do texto, se ele tiver sorte o artigo que ele procura aparecerá no
topo da lista, mas o que é mais provável é que apareça um monte de artigos
irrelevantes. Isto não só atrapalhou a tarefa que ele estava executando como
também o fez perder tempo procurando algo que não precisava.
Escrever “usabilidade” leva em torno de uns 2 segundos para uma pessoa
normal, mas com o mecanismo de busca interrompendo, leva em torno de 4 à
10 segundos.
Uma solução seria utilizar um intervalo de tempo, durante um tempo o sistema
não iria fazer nada, usualmente 0.6 segundos. Isto faria com que houvesse
tempo para completar a palavra e extrair os benefícios do XMLHttpRequest.
3.7.2.2 Desvantagens em relação à implementação
Relativo à implementação, existem vários aspectos que sofrem com o uso de
Ajax.
3.7.2.2.1 Aumenta a quantidade dos testes
Uma vez que a execução de parte do código depende da máquina do cliente, é
necessário ter um maior cuidado a nível de testes, para garantir que as
90
aplicações Ajax funcionem em todos os sistemas e navegadores Web a que o
sistema se destina.
3.7.2.2.2 Adiciona complexidade
Em um sistema Web clássico, toda e qualquer ação do usuário implica no
processamento de formulários, no carregamento de novas páginas, sendo algo
bastante linear. O estado dos dados do usuário (informações preenchidas em
formulários e que foram enviadas para validação, nas preferências pessoais ou
no carrinho de compras) é constantemente recuperado no lado servidor,
analisado, colocado no contexto de visualização e então reenviado ao cliente.
Ao colocarmos XMLHttpRequest de forma assíncrona, precisamos achar um
lugar para guardarmos as informações, sendo comum não termos a mão tudo o
que costumamos ter (request, response, session, conexão com o banco, etc.),
já que o processamento é realizado por um caminho diferente de uma
requisição normal.
Desenvolvedores do lado servidor necessitam saber o que a lógica de
apresentação vai necessitar nas páginas HTML no lado cliente, assim como a
lógica do lado servidor.
3.7.2.2.3 Debuging difícil
Encontrar problemas em código JavaScript costuma ser uma tarefa bastante
difícil, pois basicamente o que se é possível fazer, é utilizar a função
alert(mensagem), ou então utilizar document.write(mensagem), para saber
qual valor contém determinada variável.
Os navegadores Web mais modernos, especialmente os da família Mozilla,
contém um relatório de erros relativamente preciso, o que ajuda a encontrar
mais rapidamente o ponto de falha no código. No Internet Explorer, as coisas
complicam um pouco, pois seu JavaScript console muitas vezes não aponta
para o local correto da falha no código.
Atualmente já existem alguns depuradores de JavaScript, ainda não estão no
mesmo nível que os encontrados em outras linguagens de programação, mas
já facilitam em muito a vida dos desenvolvedores. Serão apresentados alguns
mais a diante.
3.7.2.2.4 Código-fonte fácil de pegar
91
Assim como o código HTML, código JavaScript precisa ser enviado ao cliente
para processamento, ficando assim disponível aos olhos do usuário mais
curioso. Dada a natureza do JavaScript isto não acarreta em um problema mais
sério, como segurança, mas algumas empresas podem querer criar problemas
com isso. O fato é que não podemos compilar um código em JavaScript, então
a única solução acaba sendo a ofuscação de código-fonte.
3.7.2.2.5 Disponibilidade do objeto XMLHttpRequest
Um dos maiores desafios diante dos desenvolvedores Ajax é o de como
proceder no caso da ausência do XMLHttpRequest. Enquanto a maioria dos
navegadores modernos suportam o XMLHttpRequest, sempre existe uma
minoria de usuários utilizando navegadores que não suportam tal recurso, ou
que as suas configurações de segurança estão configuradas para bloquear o
XMLHttpRequest. Se estivermos desenvolvendo um sistema que irá rodar
somente em uma intranet corporativa, podemos nos dar ao luxo de
especificarmos quais navegadores irão suportar a aplicação e assumirmos que
o
XMLHttpRequest
sempre
estará
disponível.
Mas
se
estivermos
desenvolvendo uma aplicação para o público em geral, e você presumir que o
XMLHttpRequest estará sempre disponível, você estará bloqueando o acesso
dos usuários que possuam navegadores antigos, navegadores para pessoas
com deficiências, ou navegadores leves com pouca capacidade como os que
rodam em alguns dispositivos portáteis, de acessarem a sua aplicação.
Uma solução é a construção de uma aplicação tolerante a falhas, que mantém
a aplicação funcional mesmo em navegadores que não suportem o
XMLHttpRequest. Um exemplo seria a construção de uma outra versão da
aplicação sem o uso do XMLHttpRequest, então no momento do acesso do
usuário à aplicação, pode-se verificar o suporte ou não do XMLHttpRequest no
navegadores do usuário e direcioná-lo a devida versão.
3.7.2.2.6 Sobrecarga do servidor
Uma pesquisa normal do site de buscas do Google provoca uma requisição ao
servidor, que ocorre quando o usuário submete o formulário de consulta.
Porém, o Google Suggest, que tenta autocompletar o termo de pesquisa à
92
medida que o usuário digita os caracteres, realiza várias requisições ao
servidor, uma para cada caractere digitado no formulário de consulta.
Ao desenvolver-se uma aplicação com Ajax deve-se estar ciente de quantas
requisições serão feitas ao servidor e qual o impacto isto irá causar sobre o
mesmo. Pode-se amenizar o impacto sobre o servidor criando um buffer de
requisições e um cache das respostas do servidor no cliente, quando isto for
possível.
3.7.2.2.7 Lidando com assincronia
É muito importante entender que não existe garantia de que as requisições
feitas através do objeto XMLHttpRequest ao servidor irão se completar na
mesma ordem na qual foram solicitadas. Porém, pode-se assumir que elas não
irão e projetar a aplicação com isto em mente. Por exemplo, em um carrinho de
compras de um site de vendas, pode-se guardar a data da última atualização
do carrinho, evitando assim que dados mais antigos sobrescrevam os mais
atuais.
3.8 Segurança
As aplicações Ajax têm sido cada vez mais desejadas por clientes ávidos por
ver interatividade e funcionalidade em uma ambiente Web, no qual a regra
costuma ser clicar e esperar. O que estes clientes muitas vezes esquecem de
dizer é que os dados que estão por trás das aplicações é imprescindível
independentemente de quão interativa é a aplicação.
Na prática, todas as recomendações de segurança que servem para um
aplicativo Web tradicional, também se aplicam normalmente a um aplicativo
Ajax. A grande diferença é que uma aplicação tradicional acessa o servidor
somente para buscar conteúdo, enquanto uma aplicação Ajax pode também
buscar dados e scripts para a execução. Essa diferença faz com que as
aplicações Ajax estejam mais expostas a atacantes do que outras aplicações
Web tradicionais.
93
3.8.1 Formas de Interação de uma Aplicação Ajax
Uma aplicação Ajax possui varias formas de interagir com o servidor, e
dependendo da forma utilizada, diferentes abordagens de ataque podem ser
utilizadas para quebrar a segurança.
A forma de Interação mais comum é a troca de dados. Neste caso o maior risco
é a superexposição de métodos de negócio que podem ser explorados de
forma maliciosa por atacantes.
Outra forma de interação comum é a troca de conteúdo HTML com o servidor,
em que os riscos são os mesmos de uma aplicação Web tradicional.
A forma menos comum, mas também possível, é a troca de código JavaScript
para
ser
dinamicamente
executado,
sendo
neste
caso,
a
principal
vulnerabilidade a injeção de fragmentos de script nos parâmetros.
A Tabela 2 trás com mais detalhes os possíveis tipos de interação e as
principais vulnerabilidades de cada um.
Tabela 2
Interação
Dados
Conteúdo
Vulnerabilidades por tipo de interação.
Descrição
Possíveis Ataques
A aplicação Ajax busca
O atacante acessa a URL utilizada para obter os
no servidor dados em
dados da aplicação Ajax passando diferentes
formato XML, JSON ou
parâmetros visando obter informações cujo acesso
texto plano e utiliza os
não era autorizado.
mesmos para modificar
O atacante, de posse dos scripts que irão processar
dinamicamente a página
a informação vinda do servidor, envia dados para o
HTML utilizando
servidor que fará o processamento dos dados tenha
JavaScript.
algum efeito malicioso em outros usuários.
A aplicação Ajax acessa
São enviados parâmetros maliciosos de forma a
uma URL que retorna um
interferir no conteúdo que será gerado
fragmento de conteúdo
dinamicamente. Isto pode ser utilizado para roubar a
em formato HTML, e este
sessão de um usuário e passar pela autenticação do
conteúdo é colocado
sistema.
dentro de uma tag <DIV>
Quando o conteúdo vem acompanhado de algum
ou <SPAN>.
script para ser executado dinamicamente, se
aplicam os mesmos ataques de interação por script.
Script
É gerado dinamicamente
Juntamente com os parâmetros, são enviados
um script para ser
fragmentos de script, para que o código possa ser
executado pela aplicação
executado no navegador Web seja gerado de forma
94
Ajax quando esse for
alterada, permitindo a inserção de comandos
recebido do servidor. A
maliciosos visando, por exemplo, roubar a sessão do
execução é feita pela
usuário.
função eval().
Um fator que favorece bastante o atacante é a posse de todo o código que é
executado no cliente. O acesso a todo o código JavaScript da aplicação ajuda
bastante na investigação de falhas que podem vir a ser exploradas para
obtenção de informações não autorizadas. Uma regra interessante é a
utilização de JavaScript apenas para acessar regras de negócio que estão no
servidor “por baixo dos panos”. Qualquer regra de negócio que estiver somente
no cliente pode ser facilmente burlada.
Uma forma de proteger o código em JavaScript contra a leitura é a ofuscação,
porém apesar do código estar embaralhado, o atacante tem acesso a ele. De
qualquer forma, ofuscar é melhor do que deixá-lo aberto.
As aplicações Ajax que trocam dados com o servidor costumam disponibilizar,
através de uma URL, o acesso a uma função que recebe os parâmetros da
requisição HTTP e retorna as informações em um formato especifico,
normalmente XML ou JSON. O grande problema é que essa URL não estará
disponível apenas para a aplicação Ajax, mas também para quem quiser
acessá-la de forma indiscriminada. Se a aplicação não contar com um
mecanismo de controle de acesso robusto, os atacantes podem fazer uso
destas funcionalidades para obterem acesso a informações não autorizadas.
4 A Aplicação UFSC Maps
Como resultado da aplicação dos conhecimentos adquiridos com a realização
deste trabalho e vista a oportunidade de agregar algum valor ao site da UFSC,
foi desenvolvida uma aplicação que visa georeferenciar o campo da UFSC de
uma
maneira
interativa
e
responsiva,
aplicando
a
abordagem
de
desenvolvimento Ajax.
95
4.1 Tecnologias Empregadas
Para o desenvolvimento da aplicação foram empregadas as seguintes
tecnologias:

Google Maps API41 para apresentação do mapa.

ExtJS42 para a camada cliente;

DWR43 para a comunicação do cliente com o servidor através de
chamadas assíncronas.

Java/JEE44 na parte do servidor.

Hibernate45 para persistência dos dados no lado servidor.

Spring46 para injeção de dependências no lado servidor.

Apache Tomcat47 como servidor Web.

MySQL48 como banco de dados.
4.2 Telas
A aplicação pode ser dividida em duas partes: a tela principal e as telas de
cadastro.
4.2.1 Tela Principal
No momento que o usuário entra na aplicação é apresentada a seguinte
interface, como ilustra a Figura 31. Esta tela apresenta um toolbar na região
superior, um menu do tipo Acordeão a esquerda e um mapa na região central.
41
Disponível em http://code.google.com/apis/maps/
42
Disponível em http://extjs.com/
43
Disponível em http://getahead.ltd.uk/dwr/
44
Disponível em http://java.sun.com/
45
Disponível em http://www.hibernate.org/
46
Disponível em http://springframework.org/
47
Disponível em http://tomcat.apache.org/
48
Disponível em http://www.mysql.com/
96
Figura 31
Tela inicial da aplicação.
O mapa da região central vem carregado inicialmente sobre o Campus
Trindade da UFSC com um nível de zoom pré-definido e um polígono de cor
azul-clara delimitando a área do mesmo.
O menu do lado esquerdo, chamado “Mapeamentos”, possui os mapeamentos
dos pontos de interesse referentes a instituição UFSC, como Centros de
Ensino, Fundações, Reitoria e demais pontos pertencentes ao campus. Este
menu é populado assincronamente e ao ser expandido adiciona ao mapa os
pontos de interesse cadastrados para aquele item de menu, como mostra a
Figura 32.
Ao se clicar tanto no ícone do marcador no mapa, quanto no texto do menu
Mapeamentos, é aberta uma janela com informações sobre o ponto mapeado.
Estas informações também são recuperadas de forma assíncrona.
97
Figura 32
Menu de mapeamentos expandido.
O toolbar superior possui diversos botões do tipo Toggle Button, cada botão
representa os mapeamentos para um tipo de área de interesse, os tipos de
área de interesse apresentados neste toolbar são mapeamentos mais
genéricos. Da esquerda para a direita os botões representam os seguintes
tipos de marcadores:

Acessibilidade (Rampas, orelhões para deficientes, etc.);

Alimentação (Restaurantes, lanchonetes, bares, cafés, etc.);

Bancos e Caixas Eletrônicos;

Hospitais e Farmécias;

Fotocópias (Xerox, impressões, etc.);

Pontos de Ônibus;

Pontos de Taxi;

Estacionamentos;

Postos de Combustível;

Mecânicos;

Telefones Públicos;
98

Informações;

Banheiros;

Agencias dos Correios;

Salões de Beleza;

Lojas;

Artes e Cultura;

Moradia Estudantil;

Polícia e Segurança;

Esportes;

Praças, Parques e Bosques.
Ao clicar em um destes botões, o botão fica selecionado e são apresentados
no mapa os mapeamentos referentes aquele tipo de mapeamento, ao se clicar
novamente no mesmo botão, deselecionando o mesmo, são removidos os
mapeamentos referentes aquele tipo de mapeamento, como ilustra a Figura 33.
Figura 33
Toolbar com botões selecionados.
99
4.2.2 Tela de Cadastro
Existem duas telas de cadastro: a de cadastro de Marcadores e a de cadastro
de Polígono.
4.2.2.1 Cadastro de Marcador
A tela de cadastro de marcador possui um botão na parte superior para
exibição, ou não, dos marcadores já cadastrados. Se o botão estiver
selecionado são apresentados os marcadores já cadastrados e é possível
alterar as informações dos mesmos, ao se clicar sobre o marcador, como
ilustra a Figura 34.
Figura 34
Tela de atualização de marcador.
Para cadastrar um novo marcador deve-se clicar com o mouse na área de
interesse no mapa que se deseja cadastrar. O sistema criará automaticamente
100
um novo marcador, de cor amarela para diferenciar dos já cadastrados, e uma
janela de informação com um formulário de cadastro será exibida com os
seguintes campos:

Latitude (Já vem preenchida automaticamente);

Longitude (Já vem preenchida automaticamente);

Tipo de marcador (Caixa de seleção com os tipos previamente
cadastrados);

Website;

Imagem (Mecanismo para o upload de imagem de forma assíncrona);

Descrição (Editor de HTML);
Figura 35
Tela de cadastro de marcador.
Assim que o cadastro é efetuado, de forma assíncrona e com sucesso, o
marcador automaticamente muda para a cor vermelha. Também é possível
arrastar e soltar um marcador pelo mapa, ao se soltar o marcador a janela de
101
atualização será apresentada já com os novos valores de latitude e longitude
para que o usuário confirme, ou não, a alteração.
4.2.2.2 Cadastro de Polígono
A tela de cadastro de polígono apresenta também um botão superior para
visualização dos pontos que integram as delimitações do polígono. Se este
botão estiver selecionado pode-se arrastar e soltar os pontos já cadastrados
ajustando assim as delimitações do polígono. Para criar um novo ponto é
necessário apenas clicar sobre o mapa que o novo ponto será criado
automaticamente. A Figura 36 ilustra a tela de cadastro de polígono.
Figura 36
Tela de cadastro de polígono.
102
5 Conclusão
5.1 Considerações finais
O desenvolvimento de aplicações mais interativas e responsivas se
assemelhando cada vez mais das aplicações desktops deve se intensificar
cada vez mais nos próximos anos. Não como uma promessa futura, mas como
realidade.
Vimos os sistemas desktop sendo migrados para o ambiente Web nos últimos
tempos. Nas intranets das empresas isso foi quase que uma regra geral. Se
por um lado foram facilitadas a manutenção e a disponibilidade das aplicações,
por outro lado se perdeu muito na interatividade e responsividade das mesmas.
Agora é a vez destes aplicativos Web se tornarem mais interativos e
responsivos, está na hora de se pensar em usabilidade. Só o fato de ser um
sistema Web já não é mais suficiente, os usuários buscam a mesma
interatividade que possuíam nos seus aplicativos desktop. E isto e mais um
pouco é possível através do uso de Ajax.
5.2 Sugestões para futuros trabalhos
A disponibilização da aplicação no site da UFSC seria um diferencial para a
universidade perante as outras universidades federais, pois seria a primeira a
possuir tal ferramenta.
Como sugestões para a aplicação de georeferenciamento do campus, pode-se:

Continuar o mapeamento dos pontos de interesse.

Criar uma espécie de pontos temporários, para o mapeamento de
eventos. Por exemplo, quando ocorrer algum evento no campus, seria
apresentada a localização geográfica e outras informações do mesmo
no mapa interativo, auxiliando na localização do mesmo com maior
facilidade. Após o termino do evento este ponto de interesse seria
removido da aplicação.

Criar “visões” do mapa associadas a cada usuário. Por exemplo, com
base nas matérias que o aluno está cursando no semestre, referenciar
103
os pontos de interesse para aquele aluno em especifico, como
localização das salas de aulas para cada matéria.

Criar um mecanismo de busca semântica para a aplicação. Por
exemplo, ao se procurar por “EEL103”, o sistema interpretar tal
informação e apontar no mapa o prédio da engenharia elétrica. Ou se
procurarmos por “INE5641”, o sistema saberia que esta informação é
referente a matéria “Comércio Eletrônico” e nos indicaria o centro de
ensino, o prédio e a sala onde esta matéria é ministrada, a sala do
professor que ministra tal disciplina, etc.
104
Referências Bibliográficas
[1]
OLIVEIRA, Felipe A.. Web 2.0, Ajax e SOA: uma nova perspectiva.
2006. Disponível em: http://scaphe.wordpress.com/2006/08/19/soa/. Acesso
em: 29 de Fevereiro de 2008.
[2]
COOPER,
Alan.
Your
Program's
Posture.
Disponível
em:
http://www.cooper.com/articles/art_your_programs_posture.htm. Acesso em: 29
de Fevereiro de 2008.
[3]
CRANE, Dave; PASCARELLO, Eric; JAMES, Darren. Ajax in Action.
Greenwich: Manning Publications, 2006. ISBN 8576051095
[4]
San
GARRET, Jesse James. Ajax: A New Approach to Web Applications.
Francisco:
Adaptive
Path,
2005.
Disponível
em:
https://www.adaptivepath.com/ideas/essays/archives/000385.php. Acesso em:
29 de Fevereiro de 2008.
[5]
WIKIPEDIA.
Desktop
Online.
Disponível
em:
http://pt.wikipedia.org/wiki/Desktop_online. Acesso em: 02 de Março de 2008.
[6]
ECMAScript Language Specification. Disponível em: http://www.ecma-
international.org/publications/files/ECMA-ST/Ecma-262.pdf. Acesso em: 21 de
Abril de 2008.
[7]
JSON. Disponível em: http://www.json.org. Acesso em: 21 de Abril de
2008.
[8]
O’REILLY, Tim. What Is Web 2.0 : Design Patterns and Business
Models for the Next Generation of Software. 2005. Disponível em:
http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web20.html. Acesso em: 29 de Abril de 2008.
[9]
McLAUGHLIN, Brett. Use a Cabeça! (Head Rush) Ajax. Alta Books,
2006. ISBN 8576081253
[10]
OLSON, Steven Douglas. Ajax com Java. Alta Books, 2007. ISBN
9788576081494
[11]
MAHEMOFF, Michael. Padrões de Projetos Ajax. Alta Books, 2007.
ISBN 9788576081371
105
[12]
SAMPAIO, Cleuton. Web 2.0 e Mashups: Reinventando a Internet.
Brasport, 2007. ISBN 9788574523385
106
Apêndice A
Ferramentas
Nos últimos anos houve grandes evoluções no sentido de tornar o
desenvolvimento de software do lado servidor mais fácil e robusto, enquanto
que o lado cliente foi praticamente ignorado.
A abordagem Ajax força os desenvolvedores de aplicações Web a trabalharem
com grandes quantidades de HTML, JavaScript, DOM e CSS.
Com advento de Ajax essa situação começou a mudar, estão surgindo diversas
ferramentas para auxiliar o trabalho dos desenvolvedores, tornando o
desenvolvimento de aplicações Ajax um pouco mais fáceis.
Este apêndice traz um resumo da linha atual de ofertas, são apresentadas
somente uma breve descrição da ferramenta, uma imagem da aplicação, o
endereço eletrônico oficial e o tipo de licença de uso.
A.1 IDEs e IDEs Plugins
A.1.1 Aptana
Aptana é baseado na IDE Eclipse49 e é focalizada no desenvolvimento Web,
com suporte a HTML, CSS e JavaScript, assim como opcionalmente a outras
tecnologias como PHP, Adobe Air, Ruby on Rails e iPhone. O Aptana Studio
está disponível como uma aplicação independente ou como plug-in para o
Eclipse.
Entre as características principais do Aptana Studio podemos destacar:

Assistente de código para JavaScript, HTML, e CSS.

Visualização de erros de sintaxe à medida que se escreve.

Debug de código JavaScript.

Já vem pré-configurado com diversos frameworks e bibliotecas
Ajax/Javascript.
49
Disponível em http://www.eclipse.org/
107

Possui diversos projetos de exemplo pré-configurados para diversos
frameworks e bibliotecas JavaScript.

Pré-visualização de estilos CSS com o editor CSS.

Extensível a partir de plug-ins.
Figura 37
Aptana Studio IDE
Site Oficial: http://www.aptana.com/
Licença: Possui uma versão comercial (Professional Edition) e uma gratuita
(Community Edition sob licença Eclipse Public License)
A.1.2 JSEclipse
É um plugin para Eclipse focado na edição de JavaScript.
Entre as características principais do JSEclipse podemos destacar:

Assistente de código para JavaScript.

Visualização de erros de sintaxe à medida que se escreve.

Já vem pré-configurado com diversos frameworks e bibliotecas
Ajax/Javascript.
108
Figura 38
JSEclipse
Site Oficial: http://labs.adobe.com/technologies/jseclipse/
Licença: Eclipse Public License
A.1.3 MyEclipse
É uma IDE baseada no Eclipse para desenvolvimento Java, mas possui uma
serie de ferramentas para o desenvolvimento Ajax, na verdade o MyEclipse foi
o pioneiro na adição de recursos para Ajax no ambiente do Eclipse.
Entre
as
características
principais
do
MyEclipse
com
relação
ao
desenvolvimento Ajax podemos destacar:

Assistente de código para JavaScript, HTML, e CSS.

Visualização de erros de sintaxe à medida que se escreve.

Debug de código JavaScript.

Pré-visualização de estilos CSS com o editor CSS.

DOM Inspector.

Extensível a partir de plug-ins.
109
Figura 39
MyEclipse
Site Oficial: http://www.myeclipseide.com/
Licença: Comercial
A.2 DOM Inspectors
A.2.1 Firefox DOM Inspector
Firefox DOM Inspector é uma ferramenta para inspeção de DOM que vem
embutida no navegador Mozilla Firefox e está disponível através do menu
ferramentas.
110
Figura 40
Firefox DOM Inspector
Site Oficial: http://getfirefox.com/
Lisença: Mozilla Public Licence
A.2.2 Internet Explorer Developer Toolbar
O internet Explorer Developer Toolbar é um conjunto de ferramentas que inclui
um inspetor de DOM.
111
Figura 41
Internet Explorer Toolbar
Site
Oficial:
http://www.microsoft.com/downloads/details.aspx?FamilyID=e59c3964-672d4511-bb3e-2d5e1db91038&displaylang=en
Licença: Gratuito através do site da Microsoft.
A.3 Debuggers
A.3.1 Venkman JavaScript Debugger
Venkman é um depurador em JavaScript. Faz parte do Mozilla Application
Suite. Ele também está disponível como uma extensão do Mozilla Firefox.
Venkman recebe este nome pelo Dr. Peter Venkman interpretado por Bill
Murray nos filmes Ghostbusters e Ghostbusters II.
112
Figura 42
Venkman JavaScript Debugger
Site Oficial: http://www.mozilla.org/projects/venkman/
Licença: Mozilla Public Licence
A.3.2 Firebug debug extension for Firefox
O Firebug é uma extensão para o navegador Mozilla Firefox criada por Joe
Hewitt e prove diversas funcionalidades como edição, logging e debugging de
JavaScript, inspeção e edição de HTML, CSS e DOM, monitoramento de
atividade de rede, entre outros.
113
Figura 43
Firebug
Site Oficial: http://www.getfirebug.com/
Licença: Mozilla Public Licence
A.4 Javascript Unit-Testing
A.4.1 Scriptaculous Unit-Testing
Scriptaculous Unit-Testing é um framework de teste unitário incluso no
framework Scriptaculous.
Site Oficial: http://wiki.script.aculo.us/scriptaculous/show/UnitTesting
Licença: MIT
A.4.2 JsUnit (Hieatt)
114
O JsUnit de Edward Hieatt é um framework de testes que segue a arquitetura
xUnit para frameworks de teste. È basicamente uma versão do JUnit50 para
JavaScript.
Site Oficial: http://www.jsunit.net/
Licença: LGPL, GPL e Mozilla Public Licence
A.4.3 JsUnit (Schaible)
O JsUnit de Jörg Schaible é um framework de testes que segue a arquitetura
xUnit para frameworks de teste. É uma versão em JavaScript do JUnit 3.8.1.
Site Oficial: http://jsunit.berlios.de/
Licença: Apache Software License 2.0
50
Disponível em http://www.junit.org/
115
Apêndice B
Frameworks e bibliotecas
Nos últimos tempos houve uma rápida proliferação dos ambientes de
desenvolvimento Ajax e JavaScript, desde pequenos utilitários empacotadores
para compatibilidade com múltiplos navegadores até soluções completas de
ponta a ponta para cliente e servidor.
Este apêndice traz um resumo da linha atual de ofertas, são apresentadas
somente uma breve descrição retirada do site dos autores do framework ou
biblioteca, o endereço eletrônico oficial e o tipo de licença de uso.
B.1 Dojo
“Ajax, events, packaging, CSS-based querying, animations, JSON, language utilities,
and a lot more. All at 24K (gzipped).
Skinnable, template-driven widgets with accessibility and localization built right in—the
way you want it. From accordions to tabs, we have you covered.
Inventive & innovative code and widgets. Visualize your data with grids and charts.
Take your apps offline. Cross-browser vector drawing. And a lot more.”
Site Oficial: http://dojotoolkit.org/
Licença: Academic Free v2.1
B.2 ExtJS
“Documentation. Design. Clean Code. A foundation you can build on”
Site Oficial: http://extjs.com/
Licença: LGPL
B.3 Yahoo! UI
“The Yahoo! User Interface (YUI) Library is a set of utilities and controls, written in
JavaScript, for building richly interactive web applications using techniques such as
DOM scripting, DHTML and AJAX. The YUI Library also includes several core CSS
116
resources. All components in the YUI Library have been released as open source under
a BSD license and are free for all uses.”
Site Oficial: http://developer.yahoo.com/yui/
Licença: BSD
B.4 Prototype
“Prototype is a JavaScript Framework that aims to ease development of dynamic web
applications.
Featuring a unique, easy-to-use toolkit for class-driven development and the nicest Ajax
library around, Prototype is quickly becoming the codebase of choice for web
application developers everywhere.”
Site Oficial: http://www.prototypejs.org/
Licença: MIT (código-fonte) e CC BY-SA (documentação)
B.5 Script.aculo.us
“script.aculo.us provides you with easy-to-use, cross-browser user interface JavaScript
libraries to make your web sites and web applications fly.”
Site Oficial: http://script.aculo.us/
Licença: MIT
B.6 JQuery
“jQuery is a new type of JavaScript library. jQuery is a fast, concise, JavaScript Library
that simplifies how you traverse HTML documents, handle events, perform animations,
and add Ajax interactions to your web pages. jQuery is designed to change the way that
you write JavaScript.”
Site Oficial: http://jquery.com/
Licença: MIT e GPL
B.7 Mochikit
117
“Mochikit makes JavaScript suck less”
Site Oficial: http://mochikit.com/
Licença: MIT e Academic Free v2.1
B.8 OpenRico
“JavaScript for Rich Internet Aplications”
Site Oficial: http://openrico.org/
Licença: Apache Software License 2.0
B.9 Quooxdoo
“qooxdoo is a comprehensive and innovative Ajax application framework. Leveraging
object-oriented JavaScript allows developers to build impressive cross-browser
applications. No HTML, CSS nor DOM knowledge is needed.
It includes a platform-independent development tool chain, a state-of-the-art GUI toolkit
and an advanced client-server communication layer.”
Site Oficial: http://qooxdoo.org/
Licença: LGPL e EPL
B.10
Mootools
“MooTools is a compact, modular, Object-Oriented JavaScript framework designed for
the intermediate to advanced JavaScript developer. It allows you to write powerful,
flexible, and cross-browser code with its elegant, well documented, and coherent API.”
Site Oficial: http://mootools.net/
Licença: MIT
B.11
Ruby on Rails
118
“Ruby on Rails is a open-source web framework that’s optimized for programmer
happiness and sustainable productivity. It lets you write beautiful code by favoring
convention over configuration”
Site Oficial: http://www.rubyonrails.org/
Licença: MIT
B.12
DWR - Direct Web Remoting
“DWR allows Javascript in a browser to interact with Java on a server and helps you
manipulate web pages with the results.
DWR is Easy Ajax for Java”
Site Oficial: http://getahead.org/dwr
Licença: Apache Software License 2.0
B.13
GWT - Google Web Toolkit
“Faster AJAX than you can write by hand.
Google Web Toolkit (GWT) makes it easier to write high-performance AJAX
applications. You write your front end in the Java programming language and GWT
compiles your source into highly optimized JavaScript. Writing web apps today is a
tedious and error-prone process. You spend 90% of your time working around browser
quirks, and JavaScript's lack of modularity makes sharing, testing, and reusing AJAX
components difficult and fragile. It doesn't have to be that way.”
Site Oficial: http://code.google.com/webtoolkit/
Licença: Apache Software License 2.0
119
Anexos
Anexo A – Código Fonte
O
código
fonte
do
projeto
UFSCMaps
se
encontra
no
arquivo
Aplicações_Ricas_com_Ajax_–_Código_Fonte.pdf
Anexo B – Artigo
O artigo referente ao trabalho de conclusão de curso se encontra no arquivo
Aplicações_Ricas_com_Ajax_–_Artigo.pdf
120
Download