SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
AJAX EM JAVA
Dando vida nova aquelas suas pobres páginas
esquecidas
O QUE É QUE NÓS VAMOS VER?
 JavaScript

 O que é AJAX?

 Fazendo requisições ao servidor com AJAX

 Frameworks JavaScript para facilitar o
 desenvolvimento de aplicações com AJAX;

 AJAX em Java com DWR;
JOÃO É UM FELIZ DESENVOLVEDOR DA
FOO CORP.




                       Olá, eu sou o João!
JOÃO ESTÁ TRABALHANDO EM UM NOVO
PROJETO...
E ESTÁ USANDO TODAS AS TECNOLOGIAS
QUE SEMPRE SONHOU...

                         JTA

                               EJB
                                J
                 JSF
Lucene                 Quatz
UM BELO DIA, O TELEFONE TOCA.....

        Jooooãããããããããããããããããããããããããããoooo!
                     Venha aqui!
E LÁ VAI O POBRE JOÃO...




                           Pois é, dancei...
NO ABATEDOURO....


    Por que o nosso sistema não funciona
       IGUAL ao                  ????????
NÃO TÁ FUNCIONANDO, MAS VOCÊ
ENTENDEU NÉ...
...


      É... Sabe....
      É Sabe Meio que... que
      Eu... Hum... Não... Sei...
          Fazer... Aquilo...
JOÃO SABE DE MUITA COISA, MAS NÃO
SABE O QUE É AJAX...




                        AJAX, o lava roupas
                           do Google!

                          E Tripla Ação!
MAS O JOÃO NÃO FOI O ÚNICO A SER PEGO
DE SURPRESA
UM POUCO DE HISTÓRIA
 Antes do Google Maps e do GMail, poucas
 pessoas conheciam o AJAX;

 Antes de se descobrir o AJAX, não havia um
 modo simples de se atualizar uma página HTML
 sem ter que pedir um novo documento ao
 servidor;

 Antes do AJAX, as pessoas achavam que usar
          AJAX
 <frame>s era lindo;
MAS O QUE É AJAX?



 AJAX é o acrônimo para:
   Assinchronous
   JAvaScript
   JA S i
     &
   XML
PAUSA PRA UM EXEMPLO DE ASSÍNCRONIA
– CORRIDAS DE CARRO SÃO ASSÍNCRONAS?
BEM, A NÃO SER QUE SEJA COM ELES NÉ...
UMA AULINHA BÁSICA DE HISTÓRIA
 A Microsoft precisava de um modo de fazer um
 cliente web para o Outlook;

 O cliente web precisava atualizar a página sem
 ter que fazer um “refresh” a cada atualização;
                   refresh

 Então l
 E tã eles criaram um objeto que fazia
             i         bj t      f i
 exatamente isso;
XMLHTTPREQUEST É A MÁGICA
 É o objeto JavaScript que faz as requisições ao
 servidor web, sem que seja necessário fazer um
 refresh;

 Com ele é possível invocar qualquer um dos
 métodos HTTP em uma URL e passar
 parâmetros para a invocação;

 O resultado da requisição é utilizado para
 atualizar a página automaticamente;
REVISÃO BÁSICA DE JAVASCRIPT
 Linguagem d programação orientada a objetos,
 Li        de           ã  i t d      bj t
 baseada em protótipos;

 Criada pela NetScape (olha a idade...);

 Não parece nem um pouco com Java;

 Tipada dinamicamente;

 Interpretada;

 Roda fora dos browsers;

 Baseada na especificação ECMAScript;
DECLARANDO VARIÁVEIS
var variavel = “Sou Uma Variavel”

variavel = 10
outraVariavel = 20
soma = variavel + outraVariavel
variavel = 5
outraVaravel = 10
soma = variavel + outraVariavel
DECLARANDO VARIÁVEIS
 Variáveis podem ou não ser declaradas com a
 palavra-chave “var”;

 Uma variável pode receber qualquer valor, pois
 ela não tem um tipo específico;

 JavaScript suporta basicamente 5 ti
 J   S i t       t b i         t    tipos,
 números, boolean, String, objetos puros e objetos
 função;
DECLARANDO FUNÇÕES
function somarNumeros( um, dois) {
  return um + dois;
}

alert( somarNumeros( 1, 2 ) );

function inicializar() {
  alert("Inicializado");
}
window.onload = inicializar;
DECLARANDO FUNÇÕES
 Funções são um tipo especial de objeto, eles são
 declarados com a palavra chave “function” e
 podem receber parâmetros e retornar um valor;

 Uma função é invocada através da declaração do
 seu nome seguido de parenteses “()”, com os
 parâmetros que ela deve receber;

 Não é possível fazer sobrecarga de funções em
 JavaScript;
DETALHES DAS FUNÇÕES
 A quantidade d parâmetros passada é sempre
        tid d de      â t            d
 variável, não é possível obrigar o usuário a
 passa
 passar mais ou menos;
           aso     e os;

 Não é possível fazer sobrecarga de funções em
       p                      g        ç
 JavaScript;

 Ao declarar uma função, uma variável com o seu
 nome é automaticamente criada;

 Uma função pode ser atribuída a um “listener”
 através da declaração do seu nome;
                   ç              ;
O QUE É O DOM?
 Document Object Model (DOM) é a estrutura que
 os navegadores criam para todos os documentos
 HTML que eles carregam;

 É possível interagir com o DOM através de
 JavaScript, tanto para leituras quanto para
 alterações;

 (Quase) Qualquer tag HTML pode ser alterada e
 os navegadores costumam se comportar
 corretamente;
ALTERANDO O CONTEÚDO DE UM NÓ
HTML – (JEITO FÁCIL)
<script t
<   i t type="text/javascript">
              "t t/j       i t">
  function alterarTexto() {
      document.getElementById("message")
               g          y         g
           .innerHTML =
      "<span style='color:red;'>Eu sou o
  valor    alterado!</span> ;
           alterado!</span>";
  }
</script>

<body>
<div id="message"></div>
      id= message ></div>
<button onclick="alterarTexto()">Click
  Me</button>
</body>
 /b d
AGORA NO MODO “HARD”
    function alterarTextoCriandoElemento() {
    f   ti    lt    T t C i d El      t ()

      var span = document.createElement("span");
           p                            ( p     );
      span.setAttribute("style", "color:red;");
      var textNode =
         document.createTextNode("Eu sou o valor
         alterado de baixo");

      span.appendChild( textNode);
      var div =
         document.getElementById("message2");
         d      t   tEl    tB Id("       2")
      div.appendChild(span);
}
MAGIA NEGRA EM JAVASCRIPT (MENTIRA,
ISSO É HTML)

<html>
  <head>
  </head>
  <body>
  <div id="message"></div>
  <button onclick="modifyPage()">Click
  Me</button>
  </body>
</html>
MAGIA NEGRA EM JAVASCRIPT 2 – A
VINGANÇA
<script type="text/javascript">
       var xhr;

       function modifyPage() {

        xhr = new XMLHttpRequest();

        xhr.open("GET", "/message");
         xhr.setRequestHeader("User-Agent", "Eu mesmo");
         xhr.onreadystatechange=
         xhr onreadystatechange= function() {
           if (xhr.readyState != 4) return;
           document.getElementById("message").innerHTML =
                    xhr.responseText;
                    xhr responseText;
         }
         xhr.send(null);
         }
</script>
PAUSA PARA OS COMERCIAIS – VALORES
DA PROPRIEDADE “READYSTATE”
 0: (Nã iniciado)
 0 (Não i i i d ) – O método “send()” ainda não f i
                       ét d “    d()” i d ã foi
 chamado;

 1: (Carregando) – O método foi chamado e a
 requisição está sendo enviada;

 2: (Carregado) – A resposta já foi completamente
 enviada pelo servidor;

 3: (Interativo) – A resposta está sendo tratada;

 4: (Completado) – A resposta foi tratada e está pronta
 pra ser consumida;
E ESSE É UM SERVLET SEM MÁGICA
NENHUMA
public class MessageSer let e tends HttpSer let {
             MessageServlet extends HttpServlet

    private final String message = "Olá Mundo Outra Vêz";

    @Override
    protected void doGet(HttpServletRequest req,
    HttpServletResponse resp)
    H   S    l R             )
    throws ServletException, IOException {

    resp.setContentType("text/plain");
    resp.getWriter().print( this.message );

    }

}
NO FIREFOX É UMA BELEZA, JÁ NA
CONCORRÊNCIA...



                            E eu... Uma pedra...
                                        p
MAGIA NEGRA EM JAVASCRIPT 3 – O
RETORNO
                                              IE < 5
function getXmlHttpObject() {
   try {
          xhr = new ActiveXObject("Msxml2.XMLHTTP");          IE >= 5
          } catch (e) {
             try {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
             } catch (E) {
                xhr = false;
             }                Firefox – Mozilla – Safari - Opera
          }

         if (!xhr && typeof XMLHttpRequest != 'undefined') {
              xhr = new XMLHttpRequest();
         }

    return xhr;
}
PRIMEIROS PROBLEMAS?
 Incompatibilidade entre browsers (a guerra está
 de volta?);

 Comportamentos diferentes entre os browsers;

 O MUNDO usa o Internet Explorer, VOCÊ não
 vai mudar isso (armas podem ajudar, mas...);
   i   d i      (        d    j d          )
AGORA PASSEMOS PRA ALGO MAIS ÚTIL
 João precisa facilitar a vida dos usuários, no
 formulário de cadastro de clientes ele tem que
 carregar a rua a cidade e o estado pelo CEP;
            rua,

 Ele deve ter uma lista disso no servidor;

 A página precisa se atualizar automaticamente
    á i       i       t li       t   ti       t
 na hora que o usuário terminar de digitar o CEP;
OLHEM SÓ, ORIENTADO A OBJETOS!
public class Address {

    private String street;

    private String city;

    private String state;

}
INDO PARA O SERVLET
protected void doGet(HttpServletRequest req HttpServletResponse resp)
                                        req,
throws ServletException, IOException {

Address address = null;
String zip = req.getParameter( "zip" );

if ( zip != null ) {
   address = this.addresses.get( zip );
                            g (    p )
}

if ( address == null ) {
   address = this addresses values() iterator() next();
             this.addresses.values().iterator().next();
}

req.setAttribute("address", address);
req.getRequestDispatcher("/jsp/addressCsv.jsp").forward(req, resp);

}
O HTML
 <tr>
  <th>Zip:</th>
      <td><input onblur="getZipData(this.value)"
              type="text" name="zip"/></td>
               yp                 p / /
    <td id="zipError" style="color: red"></td>
  </tr>
  <tr>
      <th>Street:</th>
      <td><input id="street" type="text" name="street"/></td>
  </tr>
  <tr>
  <t >
      <th>City:</th>
      <td><input id="city" type="text" name="city"/></td>
  </tr>
   /tr
  <tr>
      <th>State:</th>
     <td><input id="state" type="text" name="state"/></td>
  </tr>
E COM VOCÊS, O JAVASCRIPT!
     function getZipData(zipCode) {
            xhr = createXHR();
            xhr.onreadystatechange=processZipData;
                 p (      ,
            xhr.open("GET",
                     "/zipService?zip=" + zipCode);
            xhr.send(null);
     }


     function processZipData() {
            if (xhr.readyState == 4) {
                if (xhr.status == 200) {
                    var data = xhr.responseText;
                    var cityState = data.split(',');
                    document.getElementById("street").value = cityState[0];
                    document.getElementById("city").value = cityState[1];
                    document.getElementById("state").value = cityState[2];
                    document.getElementById("zipError").innerHTML = "";
                } else {
         document.getElementById("zipError").innerHTML = "Error - " + hhr.status;
                }
            }
     }
O QUE É QUE ACONTECEU?
 Quando o usuário terminou de digitar e saiu do
 campo, um evento foi enviado (“onblur”);

 Respondendo ao evento, nós enviamos uma
 chamada assíncrona ao servidor com as
 informações do usuário para atualizar a página;

 Quando a requisição foi respondida, nós pegamos
 os seus dados e atualizamos a interface (ou
 mostramos um erro);
AGORA TEMOS UM NOVO PROBLEMA...


                               Eu ainda
                                estava
                              digitando
                               o nome!
EXPECTATIVAS
 Os usuários web tem expectativas sobre o
 funcionamento das páginas;

 Uma coisa só está carregando, se ele tiver clicado
 em algum lugar pra fazer isso;

 As á i
 A páginas só se atualizam se ele mandar elas se
             ó    t li         l     d    l
 atualizarem;

 Quebrar expectativas não é bom;
FRAMEWORKS AJAX
FRAMEWORK PROTOTYPE
 Biblioteca para facilitar o uso de AJAX;

 Desenvolvida por desenvolvedores do Ruby on
 Rails (muito influenciada por Ruby);

 Simples e direta, mas com poucas
 funcionalidades avançadas;
 f   i   lid d          d
FUNÇÕES ATALHO - $(“IDDOELEMENTO”)
<script>
function teste1() {
 var d = $('myDiv');
 alert(d.innerHTML);
}
function teste2(){
 var divs = $('myDiv','myOtherDiv');
 for(i=0; i<divs.length; i++) {
                    g
  alert(divs[i].innerHTML);
  }
}
</script>
<div id="myDiv">
<p>Este é um parágrafo</p>
</div>
<div id="myOtherDiv">
<p>Outro parágrafo</p>
</div>
<input type="button" value=Teste1 onclick="teste1();"><br/>
    p   yp                                       ();
<input type="button" value=Teste2 onclick="teste2();"><br/>
FUNÇÕES ATALHO - $F(“IDDOELEMENTO”)
<script>
function teste3(){
  alert( $F('nomeUsuario')   );
}
</script>

<input type="text" id="nomeUsuario"
  value="João da Silva"><br>
<input type="button" value=Teste3
  onclick="teste3();"><br>
FUNÇÕES ATALHO - $A(OBJETO)
<script>

function mostraOpcoes(){
   var minhaNodeList = $('lstEmpregados').getElementsByTagName('option');
   var nodes = $A(minhaNodeList);
   nodes.each(function(node){
          alert(node.nodeName + ': ' + node.innerHTML);
   });
}
</script>

<select id="lstEmpregados" size="10" >
<option value="5">Buchanan, Steven</option>
<option value="8">Callahan, Laura</option>
<option value="1">Davolio, Nancy</option>
</select>

<input type="button" value="Mostre items da lista"
   onclick="mostraOpcoes();" >
FUNÇÕES ATALHO - $H(OBJETO)
<script>
function testarHash(){
//criando o objeto
var a = {
primeiro: 10,
segundo: 20,
    g      ,
terceiro: 30
};
//transformando-o
//transformando o em um hash
var h = $H(a);
alert(h.toQueryString());
//mostra: primeiro=10&segundo=20&terceiro=30
}
  /   p
</script>
AJAX.REQUEST
    function getZipData(zipCode) {
     var myAjax = new Ajax.Request(
                 "/zipService",
                        {
                        method: 'get',
                        parameters: "zip=" + zipCode,
                        onComplete: mostraResposta
          });
}
    function mostraResposta( xhr ) {
      if (xhr.readyState == 4) {
        if (xhr.status == 200) {
           var data = xhr responseText;
                      xhr.responseText;
                 //mesmo código internamente
        }
    }
AJAX.UPDATER
<script>
function buscaHTML(){
  var url = 'http://servidor/app/buscaHTML';
  var pars = 'algumParametro=ABC';

  var myAjax =
       new Ajax Updater( 'resposta aqui' url
           Ajax.Updater( 'resposta_aqui', url,
              {
                     method: 'get',
                     parameters: pars
});
}
</script>

<input type=button value="Busca HTML"
  onclick="buscaHTML()">
<div id="resposta_aqui"></div>
IMPLEMENTANDO UM “AUTOCOMPLETE”
PARA O CEP

 Implementar a lógica de um autocompletador
 para o campo CEP (ZIP);

 Conforme o usuário clica, ele deve mostrar os
 resultados;

 O resultado selecionado pelo usuário d
        lt d   l i    d     l    á i deve ser o
 resultado que vai estar no campo;

 Isso não vai ser simples de se fazer no braço...
MAS NÓS NÃO VAMOS FAZER NO BRAÇO!
<input
  id="zip"
  onblur="getZipData(this.value)"
  type="text"
  name="zip"
  autocomplete="off"
/>
<div
  class="auto_complete"
  id="zip_values"></div>
CÓDIGO DO AUTOCOMPLETADOR


new Ajax.Autocompleter(
  "zip",
  'zip_values',
  '/autoComplete',
  {}
  )
SERVLET AUTOCOMPLETADOR (AQUI TEM
                          Q
CÓDIGO, FINALMENTE...)
String[] zips = new String[] { "1001000" "1103500" "0000004"
                               "1001000", "1103500",
  };

List results = new ArrayList();
String val = request.getParameter("zip");
for (int i = 0; i < zips.length; i++) {
  if (zips[i].startsWith(val))
        results.add(zips[i]);
             lt  dd( i [i])
}
String message = "<ul>";
Iterator iter = results.iterator();
while (iter.hasNext()) {
message += "<li>" + (String) iter.next() + "</li>";
}
message += "</ul>";
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println(message);
  t   i tl (        )
MAS AINDA NÃO É O SUFICIENTE...
 O usuário ainda não sabe que a requisição está
 acontecendo;

 Alguma coisa tem que avisar a ele que a
 requisição está acontecendo;

 Ele também deve ser avisado quando a requisição
 El t bé d             i d       d        i i ã
 terminar;
PREPARANDO O LUGAR...
<input
 i    t
  id="zip"
  onblur="getZipData(this.value)"
  onblur "getZipData(this value)"
  type="text"
  name= zip
  name="zip"
 autocomplete="off"
/>
<span id="zipProgress"
  style="display:none;"><img
  src="../progress.gif"/></span>
<div class="auto_complete"
  id="zip_values">
  id "zip values">
CHAMANDO OS EFEITOS...

var myAjax = new Ajax.Request(
  "/zipService",
      {
           method: 'get',
           parameters: "zip=" + zipCode,
           onComplete: mostraResposta,
           onLoading: mostrarAnimacao
});             }
IMPLEMENTANDO OS EFEITOS
 function mostraResposta( xhr ) {
  Element.hide('zipProgress');
   if (xhr.status == 200) {
        var data = xhr.responseText;
                          p        ;
        var cityState = data.split(',');
        document.getElementById("street").value = cityState[0];
        document.getElementById("city").value = cityState[1];
        document.getElementById("state").value = cityState[2];
        document.getElementById("zipError").innerHTML = "";
        new Effect.Highlight('tableForm', { duration: 3.0 } );
   } else {
       document.getElementById("zipError").innerHTML = "Error -
  " + hhr.status;
   }
}

function mostrarAnimacao() {
  Element.show('zipProgress');
  El    t h (' i P         ')
}
AJAX EM JAVA COM DWR
 Direct Web Remoting (DWR) é uma biblioteca de
 AJAX que integra JavaScript com Java;

 É possível invocar objetos Java de dentro de
 páginas JavaScript alterando o estado de objetos
         JavaScript,
 no servidor;

 Não depende de nenhum outro framework;

 Tem integrações para o framework Spring e
 Struts;
CONFIGURANDO O SERVLET DO DWR
<servlet>
<ser let>
  <servlet-name>dwr-invoker</servlet-name>
  <servlet-class>
org.directwebremoting.servlet.DwrServlet
  </servlet-class>
  <init-param>
        p
      <param-name>debug</param-name>
      <param-value>true</param-value>
  </init-param>
  </init param>
</servlet>

<servlet-mapping>
  <servlet-name>dwr-invoker</servlet-name>
  <url-pattern>/dwr/*</url-pattern>
       p       /   / /     p
</servlet-mapping>
CRIANDO O ARQUIVO DE CONFIGURAÇÃO
            Q                 Ç
DO DWR – DWR.XML
<?xml version="1 0" encoding="UTF 8"?>
      version="1.0" encoding="UTF-8"?>
<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web
  Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd">

<dwr>
  <allow>

        <convert match="org.maujr.aulas.ajax.*"
        <      t   t h "       j    l    j   *"
  converter="bean"/>

        <create javascript="CustomerManager" creator="new"
  scope="application">
            li    i
                <param name="class"
  value="org.maujr.aulas.ajax.CustomerManager"/>
        </create>

  </allow>
</dwr>
DECLARANDO A DEPENDÊNCIA DO DWR
NO CÓDIGO
<script
     i t
  type="text/javascript"
  src /dwr/interface/CustomerManager.js
  src="/dwr/interface/CustomerManager js
  “/>

<script
  type="text/javascript"
  src="/dwr/engine.js"></script>

<script
<    i t
  type='text/javascript'
  src /dwr/util.js >
  src='/dwr/util js'> </script>
FORMULÁRIO DE ADIÇÃO
<input type="button" value="Add
  Customer" onclick="addCustomer()"/>

<input type="button" value="Show
  Customers"
  onclick="CustomerManager.getCustomers(
  fillList )"/>
           ) /
IMPLEMENTAÇÃO DA ADIÇÃO
function addCustomer(){
  var customer = { number:null, name:null, email:null };
  dwr.util.getValues( customer );

    CustomerManager.addCustomer( customer );
    CustomerManager.getCustomers( fillList );
}

function fillList( customers ) {

    $("customers").innerHTML = ""
    $("   t     ") i    HTML   "";

    for ( var x = 0; x < customers.size() ; x++ ) {
          $( customers ).innerHTML
          $("customers").innerHTML += customers[x].name + ", ";
                                                           , ;
    }

    return false;
}
ALÉM DO AJAX – CLIENTES RICOS PARA A
WEB

 Flex - Air

 Silverlight

 Google Gears

 XUL

 JavaFX
REFERÊNCIAS

 Livros
   Pragmatic AJAX
   AJAX In Action


 Sites
   Prototype - htt //
   P t t       http://www.prototypejs.org/
                                t t   j      /
   Scrip.taculo.us - http://script.aculo.us/
   DWR - http://getahead org/dwr
           http://getahead.org/dwr
DÚVIDAS?

Más contenido relacionado

La actualidad más candente

Apostila de ext js com php e postgresql v1.2
Apostila de ext js com php e postgresql v1.2Apostila de ext js com php e postgresql v1.2
Apostila de ext js com php e postgresql v1.2Luciano Marwell
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - BrazilStephen Chin
 
Ajax O Objeto Xml Http Request Parte 3
Ajax   O Objeto Xml Http Request   Parte 3Ajax   O Objeto Xml Http Request   Parte 3
Ajax O Objeto Xml Http Request Parte 3infinitopublicidade
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascriptLucas Aquiles
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersHarlley Oliveira
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryHarlley Oliveira
 
Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosWesley Lemos
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Douglas Mendes
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3David Ruiz
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Eduardo Mendes
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-androidAlberto Souza
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Eduardo Mendes
 

La actualidad más candente (20)

Java script aula 05 - funções
Java script   aula 05 - funçõesJava script   aula 05 - funções
Java script aula 05 - funções
 
Apostila de ext js com php e postgresql v1.2
Apostila de ext js com php e postgresql v1.2Apostila de ext js com php e postgresql v1.2
Apostila de ext js com php e postgresql v1.2
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil55 New Things in Java 7 - Brazil
55 New Things in Java 7 - Brazil
 
Java script2
Java script2Java script2
Java script2
 
Ajax O Objeto Xml Http Request Parte 3
Ajax   O Objeto Xml Http Request   Parte 3Ajax   O Objeto Xml Http Request   Parte 3
Ajax O Objeto Xml Http Request Parte 3
 
Minicurso javascript
Minicurso javascriptMinicurso javascript
Minicurso javascript
 
Java script - funções
Java script - funçõesJava script - funções
Java script - funções
 
JavaScript e JQuery para Webdesigners
JavaScript e JQuery para WebdesignersJavaScript e JQuery para Webdesigners
JavaScript e JQuery para Webdesigners
 
Melhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQueryMelhorando a Experiência do Usuário com JavaScript e jQuery
Melhorando a Experiência do Usuário com JavaScript e jQuery
 
Boas Práticas em jQuery
Boas Práticas em jQueryBoas Práticas em jQuery
Boas Práticas em jQuery
 
Javascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - ConceitosJavascript para CSharpers 3 - Conceitos
Javascript para CSharpers 3 - Conceitos
 
Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)Grails - Destaques (para quem já sabe Java)
Grails - Destaques (para quem já sabe Java)
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 
8159540 Tutorial De Ajax
8159540 Tutorial De Ajax8159540 Tutorial De Ajax
8159540 Tutorial De Ajax
 
Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3Web 2.0 e AJAX - Parte 2 / 3
Web 2.0 e AJAX - Parte 2 / 3
 
Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2Java Web 4 - Servlets e JSP 2
Java Web 4 - Servlets e JSP 2
 
Mobileconf dicas-android
Mobileconf dicas-androidMobileconf dicas-android
Mobileconf dicas-android
 
jQuery Simplificando o JavaScript
jQuery Simplificando o JavaScriptjQuery Simplificando o JavaScript
jQuery Simplificando o JavaScript
 
Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2Java web 6 JSP Expression Language Taglib parte 2
Java web 6 JSP Expression Language Taglib parte 2
 

Similar a AJAX em Java com DWR

AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!Lucas Brasilino
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com AjaxAdler Medrado
 
PHP e Ajax com XAJAX
PHP e Ajax com XAJAXPHP e Ajax com XAJAX
PHP e Ajax com XAJAXRafael Dohms
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMCAlisson Agiani
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkRafael Dohms
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojscodebits
 
Ajax O Objeto Xml Http Request Parte 1
Ajax   O Objeto Xml Http Request   Parte 1Ajax   O Objeto Xml Http Request   Parte 1
Ajax O Objeto Xml Http Request Parte 1infinitopublicidade
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáZarathon Maia
 
LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09Carlos Santos
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EELoiane Groner
 
Criando plugins jQuery
Criando plugins jQueryCriando plugins jQuery
Criando plugins jQueryRicardo Coelho
 

Similar a AJAX em Java com DWR (20)

AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!AJAX?? Não!! Asynchronous Javascript and... JSON!!
AJAX?? Não!! Asynchronous Javascript and... JSON!!
 
Aula javascript
Aula  javascriptAula  javascript
Aula javascript
 
Artigoajax
ArtigoajaxArtigoajax
Artigoajax
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Minicurso de PHP Com Ajax
Minicurso de PHP Com AjaxMinicurso de PHP Com Ajax
Minicurso de PHP Com Ajax
 
PHP e Ajax com XAJAX
PHP e Ajax com XAJAXPHP e Ajax com XAJAX
PHP e Ajax com XAJAX
 
Apresentação sobre MVVMC
Apresentação sobre MVVMCApresentação sobre MVVMC
Apresentação sobre MVVMC
 
PHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao FrameworkPHP e AJAX: do Request ao Framework
PHP e AJAX: do Request ao Framework
 
Javascript no SAPO e libsapojs
Javascript no SAPO e libsapojsJavascript no SAPO e libsapojs
Javascript no SAPO e libsapojs
 
JQuery
JQuery JQuery
JQuery
 
Apostila ajax
Apostila ajaxApostila ajax
Apostila ajax
 
Ajax O Objeto Xml Http Request Parte 1
Ajax   O Objeto Xml Http Request   Parte 1Ajax   O Objeto Xml Http Request   Parte 1
Ajax O Objeto Xml Http Request Parte 1
 
Apresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc QuixadáApresentação Java Web Si Ufc Quixadá
Apresentação Java Web Si Ufc Quixadá
 
04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf04_Introducao_JavaScript.pdf
04_Introducao_JavaScript.pdf
 
Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)Mashups: Criando Valor na Web 2.0 (BandTec)
Mashups: Criando Valor na Web 2.0 (BandTec)
 
LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09LabMM3 - Aula teórica 09
LabMM3 - Aula teórica 09
 
Tutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e UsoTutorial Dwr - Configuração e Uso
Tutorial Dwr - Configuração e Uso
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EEJavaone Brazil 2012: Integrando Ext JS 4 com Java EE
Javaone Brazil 2012: Integrando Ext JS 4 com Java EE
 
Criando plugins jQuery
Criando plugins jQueryCriando plugins jQuery
Criando plugins jQuery
 

Más de Maurício Linhares

Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropMaurício Linhares
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMaurício Linhares
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleçõesMaurício Linhares
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismoMaurício Linhares
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratosMaurício Linhares
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecasMaurício Linhares
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com javaMaurício Linhares
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetrosMaurício Linhares
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemMaurício Linhares
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Maurício Linhares
 

Más de Maurício Linhares (20)

Mercado de TI
Mercado de TIMercado de TI
Mercado de TI
 
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDropUnindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
Unindo Ruby e Java através de uma arquitetura orientada a serviços na OfficeDrop
 
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDropMixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
Mixing Ruby and Java in a Service Oriented Architecture at OfficeDrop
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Curso java 07 - exceções
Curso java   07 - exceçõesCurso java   07 - exceções
Curso java 07 - exceções
 
Curso java 08 - mais sobre coleções
Curso java   08 - mais sobre coleçõesCurso java   08 - mais sobre coleções
Curso java 08 - mais sobre coleções
 
Curso java 06 - mais construtores, interfaces e polimorfismo
Curso java   06 - mais construtores, interfaces e polimorfismoCurso java   06 - mais construtores, interfaces e polimorfismo
Curso java 06 - mais construtores, interfaces e polimorfismo
 
Curso java 05 - herança, classes e métodos abstratos
Curso java   05 - herança, classes e métodos abstratosCurso java   05 - herança, classes e métodos abstratos
Curso java 05 - herança, classes e métodos abstratos
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Curso java 01 - molhando os pés com java
Curso java   01 - molhando os pés com javaCurso java   01 - molhando os pés com java
Curso java 01 - molhando os pés com java
 
Curso java 02 - variáveis
Curso java   02 - variáveisCurso java   02 - variáveis
Curso java 02 - variáveis
 
Curso java 03 - métodos e parâmetros
Curso java   03 - métodos e parâmetrosCurso java   03 - métodos e parâmetros
Curso java 03 - métodos e parâmetros
 
Extreme programming
Extreme programmingExtreme programming
Extreme programming
 
Feature Driven Development
Feature Driven DevelopmentFeature Driven Development
Feature Driven Development
 
Migrando pra Scala
Migrando pra ScalaMigrando pra Scala
Migrando pra Scala
 
Outsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvemOutsourcing e trabalho remoto para a nuvem
Outsourcing e trabalho remoto para a nuvem
 
Mercado hoje
Mercado hojeMercado hoje
Mercado hoje
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Revisão html e java script
Revisão html e java scriptRevisão html e java script
Revisão html e java script
 
Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010Aulas de Java Avançado 2- Faculdade iDez 2010
Aulas de Java Avançado 2- Faculdade iDez 2010
 

AJAX em Java com DWR

  • 1. AJAX EM JAVA Dando vida nova aquelas suas pobres páginas esquecidas
  • 2. O QUE É QUE NÓS VAMOS VER? JavaScript O que é AJAX? Fazendo requisições ao servidor com AJAX Frameworks JavaScript para facilitar o desenvolvimento de aplicações com AJAX; AJAX em Java com DWR;
  • 3. JOÃO É UM FELIZ DESENVOLVEDOR DA FOO CORP. Olá, eu sou o João!
  • 4. JOÃO ESTÁ TRABALHANDO EM UM NOVO PROJETO...
  • 5. E ESTÁ USANDO TODAS AS TECNOLOGIAS QUE SEMPRE SONHOU... JTA EJB J JSF Lucene Quatz
  • 6. UM BELO DIA, O TELEFONE TOCA..... Jooooãããããããããããããããããããããããããããoooo! Venha aqui!
  • 7. E LÁ VAI O POBRE JOÃO... Pois é, dancei...
  • 8. NO ABATEDOURO.... Por que o nosso sistema não funciona IGUAL ao ????????
  • 9. NÃO TÁ FUNCIONANDO, MAS VOCÊ ENTENDEU NÉ...
  • 10. ... É... Sabe.... É Sabe Meio que... que Eu... Hum... Não... Sei... Fazer... Aquilo...
  • 11. JOÃO SABE DE MUITA COISA, MAS NÃO SABE O QUE É AJAX... AJAX, o lava roupas do Google! E Tripla Ação!
  • 12. MAS O JOÃO NÃO FOI O ÚNICO A SER PEGO DE SURPRESA
  • 13. UM POUCO DE HISTÓRIA Antes do Google Maps e do GMail, poucas pessoas conheciam o AJAX; Antes de se descobrir o AJAX, não havia um modo simples de se atualizar uma página HTML sem ter que pedir um novo documento ao servidor; Antes do AJAX, as pessoas achavam que usar AJAX <frame>s era lindo;
  • 14. MAS O QUE É AJAX? AJAX é o acrônimo para: Assinchronous JAvaScript JA S i & XML
  • 15. PAUSA PRA UM EXEMPLO DE ASSÍNCRONIA – CORRIDAS DE CARRO SÃO ASSÍNCRONAS?
  • 16. BEM, A NÃO SER QUE SEJA COM ELES NÉ...
  • 17. UMA AULINHA BÁSICA DE HISTÓRIA A Microsoft precisava de um modo de fazer um cliente web para o Outlook; O cliente web precisava atualizar a página sem ter que fazer um “refresh” a cada atualização; refresh Então l E tã eles criaram um objeto que fazia i bj t f i exatamente isso;
  • 18. XMLHTTPREQUEST É A MÁGICA É o objeto JavaScript que faz as requisições ao servidor web, sem que seja necessário fazer um refresh; Com ele é possível invocar qualquer um dos métodos HTTP em uma URL e passar parâmetros para a invocação; O resultado da requisição é utilizado para atualizar a página automaticamente;
  • 19. REVISÃO BÁSICA DE JAVASCRIPT Linguagem d programação orientada a objetos, Li de ã i t d bj t baseada em protótipos; Criada pela NetScape (olha a idade...); Não parece nem um pouco com Java; Tipada dinamicamente; Interpretada; Roda fora dos browsers; Baseada na especificação ECMAScript;
  • 20. DECLARANDO VARIÁVEIS var variavel = “Sou Uma Variavel” variavel = 10 outraVariavel = 20 soma = variavel + outraVariavel variavel = 5 outraVaravel = 10 soma = variavel + outraVariavel
  • 21. DECLARANDO VARIÁVEIS Variáveis podem ou não ser declaradas com a palavra-chave “var”; Uma variável pode receber qualquer valor, pois ela não tem um tipo específico; JavaScript suporta basicamente 5 ti J S i t t b i t tipos, números, boolean, String, objetos puros e objetos função;
  • 22. DECLARANDO FUNÇÕES function somarNumeros( um, dois) { return um + dois; } alert( somarNumeros( 1, 2 ) ); function inicializar() { alert("Inicializado"); } window.onload = inicializar;
  • 23. DECLARANDO FUNÇÕES Funções são um tipo especial de objeto, eles são declarados com a palavra chave “function” e podem receber parâmetros e retornar um valor; Uma função é invocada através da declaração do seu nome seguido de parenteses “()”, com os parâmetros que ela deve receber; Não é possível fazer sobrecarga de funções em JavaScript;
  • 24. DETALHES DAS FUNÇÕES A quantidade d parâmetros passada é sempre tid d de â t d variável, não é possível obrigar o usuário a passa passar mais ou menos; aso e os; Não é possível fazer sobrecarga de funções em p g ç JavaScript; Ao declarar uma função, uma variável com o seu nome é automaticamente criada; Uma função pode ser atribuída a um “listener” através da declaração do seu nome; ç ;
  • 25. O QUE É O DOM? Document Object Model (DOM) é a estrutura que os navegadores criam para todos os documentos HTML que eles carregam; É possível interagir com o DOM através de JavaScript, tanto para leituras quanto para alterações; (Quase) Qualquer tag HTML pode ser alterada e os navegadores costumam se comportar corretamente;
  • 26. ALTERANDO O CONTEÚDO DE UM NÓ HTML – (JEITO FÁCIL) <script t < i t type="text/javascript"> "t t/j i t"> function alterarTexto() { document.getElementById("message") g y g .innerHTML = "<span style='color:red;'>Eu sou o valor alterado!</span> ; alterado!</span>"; } </script> <body> <div id="message"></div> id= message ></div> <button onclick="alterarTexto()">Click Me</button> </body> /b d
  • 27. AGORA NO MODO “HARD” function alterarTextoCriandoElemento() { f ti lt T t C i d El t () var span = document.createElement("span"); p ( p ); span.setAttribute("style", "color:red;"); var textNode = document.createTextNode("Eu sou o valor alterado de baixo"); span.appendChild( textNode); var div = document.getElementById("message2"); d t tEl tB Id(" 2") div.appendChild(span); }
  • 28. MAGIA NEGRA EM JAVASCRIPT (MENTIRA, ISSO É HTML) <html> <head> </head> <body> <div id="message"></div> <button onclick="modifyPage()">Click Me</button> </body> </html>
  • 29. MAGIA NEGRA EM JAVASCRIPT 2 – A VINGANÇA <script type="text/javascript"> var xhr; function modifyPage() { xhr = new XMLHttpRequest(); xhr.open("GET", "/message"); xhr.setRequestHeader("User-Agent", "Eu mesmo"); xhr.onreadystatechange= xhr onreadystatechange= function() { if (xhr.readyState != 4) return; document.getElementById("message").innerHTML = xhr.responseText; xhr responseText; } xhr.send(null); } </script>
  • 30. PAUSA PARA OS COMERCIAIS – VALORES DA PROPRIEDADE “READYSTATE” 0: (Nã iniciado) 0 (Não i i i d ) – O método “send()” ainda não f i ét d “ d()” i d ã foi chamado; 1: (Carregando) – O método foi chamado e a requisição está sendo enviada; 2: (Carregado) – A resposta já foi completamente enviada pelo servidor; 3: (Interativo) – A resposta está sendo tratada; 4: (Completado) – A resposta foi tratada e está pronta pra ser consumida;
  • 31. E ESSE É UM SERVLET SEM MÁGICA NENHUMA public class MessageSer let e tends HttpSer let { MessageServlet extends HttpServlet private final String message = "Olá Mundo Outra Vêz"; @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) H S l R ) throws ServletException, IOException { resp.setContentType("text/plain"); resp.getWriter().print( this.message ); } }
  • 32. NO FIREFOX É UMA BELEZA, JÁ NA CONCORRÊNCIA... E eu... Uma pedra... p
  • 33. MAGIA NEGRA EM JAVASCRIPT 3 – O RETORNO IE < 5 function getXmlHttpObject() { try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); IE >= 5 } catch (e) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xhr = false; } Firefox – Mozilla – Safari - Opera } if (!xhr && typeof XMLHttpRequest != 'undefined') { xhr = new XMLHttpRequest(); } return xhr; }
  • 34. PRIMEIROS PROBLEMAS? Incompatibilidade entre browsers (a guerra está de volta?); Comportamentos diferentes entre os browsers; O MUNDO usa o Internet Explorer, VOCÊ não vai mudar isso (armas podem ajudar, mas...); i d i ( d j d )
  • 35. AGORA PASSEMOS PRA ALGO MAIS ÚTIL João precisa facilitar a vida dos usuários, no formulário de cadastro de clientes ele tem que carregar a rua a cidade e o estado pelo CEP; rua, Ele deve ter uma lista disso no servidor; A página precisa se atualizar automaticamente á i i t li t ti t na hora que o usuário terminar de digitar o CEP;
  • 36. OLHEM SÓ, ORIENTADO A OBJETOS! public class Address { private String street; private String city; private String state; }
  • 37. INDO PARA O SERVLET protected void doGet(HttpServletRequest req HttpServletResponse resp) req, throws ServletException, IOException { Address address = null; String zip = req.getParameter( "zip" ); if ( zip != null ) { address = this.addresses.get( zip ); g ( p ) } if ( address == null ) { address = this addresses values() iterator() next(); this.addresses.values().iterator().next(); } req.setAttribute("address", address); req.getRequestDispatcher("/jsp/addressCsv.jsp").forward(req, resp); }
  • 38. O HTML <tr> <th>Zip:</th> <td><input onblur="getZipData(this.value)" type="text" name="zip"/></td> yp p / / <td id="zipError" style="color: red"></td> </tr> <tr> <th>Street:</th> <td><input id="street" type="text" name="street"/></td> </tr> <tr> <t > <th>City:</th> <td><input id="city" type="text" name="city"/></td> </tr> /tr <tr> <th>State:</th> <td><input id="state" type="text" name="state"/></td> </tr>
  • 39. E COM VOCÊS, O JAVASCRIPT! function getZipData(zipCode) { xhr = createXHR(); xhr.onreadystatechange=processZipData; p ( , xhr.open("GET", "/zipService?zip=" + zipCode); xhr.send(null); } function processZipData() { if (xhr.readyState == 4) { if (xhr.status == 200) { var data = xhr.responseText; var cityState = data.split(','); document.getElementById("street").value = cityState[0]; document.getElementById("city").value = cityState[1]; document.getElementById("state").value = cityState[2]; document.getElementById("zipError").innerHTML = ""; } else { document.getElementById("zipError").innerHTML = "Error - " + hhr.status; } } }
  • 40. O QUE É QUE ACONTECEU? Quando o usuário terminou de digitar e saiu do campo, um evento foi enviado (“onblur”); Respondendo ao evento, nós enviamos uma chamada assíncrona ao servidor com as informações do usuário para atualizar a página; Quando a requisição foi respondida, nós pegamos os seus dados e atualizamos a interface (ou mostramos um erro);
  • 41. AGORA TEMOS UM NOVO PROBLEMA... Eu ainda estava digitando o nome!
  • 42. EXPECTATIVAS Os usuários web tem expectativas sobre o funcionamento das páginas; Uma coisa só está carregando, se ele tiver clicado em algum lugar pra fazer isso; As á i A páginas só se atualizam se ele mandar elas se ó t li l d l atualizarem; Quebrar expectativas não é bom;
  • 44. FRAMEWORK PROTOTYPE Biblioteca para facilitar o uso de AJAX; Desenvolvida por desenvolvedores do Ruby on Rails (muito influenciada por Ruby); Simples e direta, mas com poucas funcionalidades avançadas; f i lid d d
  • 45. FUNÇÕES ATALHO - $(“IDDOELEMENTO”) <script> function teste1() { var d = $('myDiv'); alert(d.innerHTML); } function teste2(){ var divs = $('myDiv','myOtherDiv'); for(i=0; i<divs.length; i++) { g alert(divs[i].innerHTML); } } </script> <div id="myDiv"> <p>Este é um parágrafo</p> </div> <div id="myOtherDiv"> <p>Outro parágrafo</p> </div> <input type="button" value=Teste1 onclick="teste1();"><br/> p yp (); <input type="button" value=Teste2 onclick="teste2();"><br/>
  • 46. FUNÇÕES ATALHO - $F(“IDDOELEMENTO”) <script> function teste3(){ alert( $F('nomeUsuario') ); } </script> <input type="text" id="nomeUsuario" value="João da Silva"><br> <input type="button" value=Teste3 onclick="teste3();"><br>
  • 47. FUNÇÕES ATALHO - $A(OBJETO) <script> function mostraOpcoes(){ var minhaNodeList = $('lstEmpregados').getElementsByTagName('option'); var nodes = $A(minhaNodeList); nodes.each(function(node){ alert(node.nodeName + ': ' + node.innerHTML); }); } </script> <select id="lstEmpregados" size="10" > <option value="5">Buchanan, Steven</option> <option value="8">Callahan, Laura</option> <option value="1">Davolio, Nancy</option> </select> <input type="button" value="Mostre items da lista" onclick="mostraOpcoes();" >
  • 48. FUNÇÕES ATALHO - $H(OBJETO) <script> function testarHash(){ //criando o objeto var a = { primeiro: 10, segundo: 20, g , terceiro: 30 }; //transformando-o //transformando o em um hash var h = $H(a); alert(h.toQueryString()); //mostra: primeiro=10&segundo=20&terceiro=30 } / p </script>
  • 49. AJAX.REQUEST function getZipData(zipCode) { var myAjax = new Ajax.Request( "/zipService", { method: 'get', parameters: "zip=" + zipCode, onComplete: mostraResposta }); } function mostraResposta( xhr ) { if (xhr.readyState == 4) { if (xhr.status == 200) { var data = xhr responseText; xhr.responseText; //mesmo código internamente } }
  • 50. AJAX.UPDATER <script> function buscaHTML(){ var url = 'http://servidor/app/buscaHTML'; var pars = 'algumParametro=ABC'; var myAjax = new Ajax Updater( 'resposta aqui' url Ajax.Updater( 'resposta_aqui', url, { method: 'get', parameters: pars }); } </script> <input type=button value="Busca HTML" onclick="buscaHTML()"> <div id="resposta_aqui"></div>
  • 51. IMPLEMENTANDO UM “AUTOCOMPLETE” PARA O CEP Implementar a lógica de um autocompletador para o campo CEP (ZIP); Conforme o usuário clica, ele deve mostrar os resultados; O resultado selecionado pelo usuário d lt d l i d l á i deve ser o resultado que vai estar no campo; Isso não vai ser simples de se fazer no braço...
  • 52. MAS NÓS NÃO VAMOS FAZER NO BRAÇO! <input id="zip" onblur="getZipData(this.value)" type="text" name="zip" autocomplete="off" /> <div class="auto_complete" id="zip_values"></div>
  • 53. CÓDIGO DO AUTOCOMPLETADOR new Ajax.Autocompleter( "zip", 'zip_values', '/autoComplete', {} )
  • 54. SERVLET AUTOCOMPLETADOR (AQUI TEM Q CÓDIGO, FINALMENTE...) String[] zips = new String[] { "1001000" "1103500" "0000004" "1001000", "1103500", }; List results = new ArrayList(); String val = request.getParameter("zip"); for (int i = 0; i < zips.length; i++) { if (zips[i].startsWith(val)) results.add(zips[i]); lt dd( i [i]) } String message = "<ul>"; Iterator iter = results.iterator(); while (iter.hasNext()) { message += "<li>" + (String) iter.next() + "</li>"; } message += "</ul>"; response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(message); t i tl ( )
  • 55. MAS AINDA NÃO É O SUFICIENTE... O usuário ainda não sabe que a requisição está acontecendo; Alguma coisa tem que avisar a ele que a requisição está acontecendo; Ele também deve ser avisado quando a requisição El t bé d i d d i i ã terminar;
  • 56. PREPARANDO O LUGAR... <input i t id="zip" onblur="getZipData(this.value)" onblur "getZipData(this value)" type="text" name= zip name="zip" autocomplete="off" /> <span id="zipProgress" style="display:none;"><img src="../progress.gif"/></span> <div class="auto_complete" id="zip_values"> id "zip values">
  • 57. CHAMANDO OS EFEITOS... var myAjax = new Ajax.Request( "/zipService", { method: 'get', parameters: "zip=" + zipCode, onComplete: mostraResposta, onLoading: mostrarAnimacao }); }
  • 58. IMPLEMENTANDO OS EFEITOS function mostraResposta( xhr ) { Element.hide('zipProgress'); if (xhr.status == 200) { var data = xhr.responseText; p ; var cityState = data.split(','); document.getElementById("street").value = cityState[0]; document.getElementById("city").value = cityState[1]; document.getElementById("state").value = cityState[2]; document.getElementById("zipError").innerHTML = ""; new Effect.Highlight('tableForm', { duration: 3.0 } ); } else { document.getElementById("zipError").innerHTML = "Error - " + hhr.status; } } function mostrarAnimacao() { Element.show('zipProgress'); El t h (' i P ') }
  • 59. AJAX EM JAVA COM DWR Direct Web Remoting (DWR) é uma biblioteca de AJAX que integra JavaScript com Java; É possível invocar objetos Java de dentro de páginas JavaScript alterando o estado de objetos JavaScript, no servidor; Não depende de nenhum outro framework; Tem integrações para o framework Spring e Struts;
  • 60. CONFIGURANDO O SERVLET DO DWR <servlet> <ser let> <servlet-name>dwr-invoker</servlet-name> <servlet-class> org.directwebremoting.servlet.DwrServlet </servlet-class> <init-param> p <param-name>debug</param-name> <param-value>true</param-value> </init-param> </init param> </servlet> <servlet-mapping> <servlet-name>dwr-invoker</servlet-name> <url-pattern>/dwr/*</url-pattern> p / / / p </servlet-mapping>
  • 61. CRIANDO O ARQUIVO DE CONFIGURAÇÃO Q Ç DO DWR – DWR.XML <?xml version="1 0" encoding="UTF 8"?> version="1.0" encoding="UTF-8"?> <!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://getahead.org/dwr/dwr20.dtd"> <dwr> <allow> <convert match="org.maujr.aulas.ajax.*" < t t h " j l j *" converter="bean"/> <create javascript="CustomerManager" creator="new" scope="application"> li i <param name="class" value="org.maujr.aulas.ajax.CustomerManager"/> </create> </allow> </dwr>
  • 62. DECLARANDO A DEPENDÊNCIA DO DWR NO CÓDIGO <script i t type="text/javascript" src /dwr/interface/CustomerManager.js src="/dwr/interface/CustomerManager js “/> <script type="text/javascript" src="/dwr/engine.js"></script> <script < i t type='text/javascript' src /dwr/util.js > src='/dwr/util js'> </script>
  • 63. FORMULÁRIO DE ADIÇÃO <input type="button" value="Add Customer" onclick="addCustomer()"/> <input type="button" value="Show Customers" onclick="CustomerManager.getCustomers( fillList )"/> ) /
  • 64. IMPLEMENTAÇÃO DA ADIÇÃO function addCustomer(){ var customer = { number:null, name:null, email:null }; dwr.util.getValues( customer ); CustomerManager.addCustomer( customer ); CustomerManager.getCustomers( fillList ); } function fillList( customers ) { $("customers").innerHTML = "" $(" t ") i HTML ""; for ( var x = 0; x < customers.size() ; x++ ) { $( customers ).innerHTML $("customers").innerHTML += customers[x].name + ", "; , ; } return false; }
  • 65. ALÉM DO AJAX – CLIENTES RICOS PARA A WEB Flex - Air Silverlight Google Gears XUL JavaFX
  • 66. REFERÊNCIAS Livros Pragmatic AJAX AJAX In Action Sites Prototype - htt // P t t http://www.prototypejs.org/ t t j / Scrip.taculo.us - http://script.aculo.us/ DWR - http://getahead org/dwr http://getahead.org/dwr