Ajax com servlet

pessoal, sou um pouco iniciante em web, talves por isso nao tenha achado o erro.

estou tentando aprender ajax, criei uma pagina com duas caixas de testo, e o meu interesse é pegar o que tem em uma e ir inserindo na outra automaticamente, só ir atualizando em tempo real…

o problema é que simplesmente não esta funcionando, as vezes ao mexer no primeiro aparece interrogações no segundo (no IE) ou uns simbolos com interrogações (no opera), as vezes aparece undefined (ou algo assim), as vezes mexo outras coisas e nem atualiza, o caso é que não consigo fazer funcionar…

alguem ai poderia me dizer aonde esta o erro???

segue meus codigos:

essa classe é o servlet, eu coloquei em todas as pastas e subpastas que encontrei a partir do \webapps\ROOT no tomcat

import javax.swing.JOptionPane;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletAjax extends HttpServlet { 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        String receber = request.getParameter("nome ").trim(); 
        
        System.out.println("recebido" +receber);
                
        response.getWriter().write("recebido"); 
     } 
} 

esse ai é o meu jsp…

<html>
<body>
<script type="text/javascript">


function ajaxFunction(){ 
     var req; 
     var isIE; 
     if (window.XMLHttpRequest) { 
            req = new XMLHttpRequest(); 
     }else if (window.ActiveXObject) { 
            isIE = true; 
            req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     var url= "ajax?receber="flavio";   
     req.onreadystatechange = processRequest; 
     req.open("GET", url, true);  
     req.send(null); 

     var texto;

     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
                 
         } 
     }

	document.formulario.saida.value=texto;

}


</script>
<form name="formulario">
entrada: <input type="text" onkeyup="ajaxFunction();" name="entrada" />
saida: <input type="text" name="saida" />
</form>
</body>
</html>

se alguem puder me ajudar, fico muito grato desde ja.

creio que isto possa lhe ajudar: http://www.w3schools.com/ajax/default.asp

A url está incompleta.
e a função processRequest não foi definida no javascript.

Esta parte código deveria estar dentro da funcao processRequest

 var texto;  
   
     if (req.readyState == 4) {   
          if (req.status == 200) {   
              texto = req.responseText;   
                    
          }   
      }  
   
     document.formulario.saida.value=texto; 

Até.

na verdade não…mais obrigado assim mesmo…

eu tenho problemas com o idioma ingles…

eu to usando esse como base pdf: http://www.cesarkallas.net/arquivos/livros/programacao/web/desmistificando-o-ajax.pdf

ele parece ser mto bom, mais o exemplo que ele uso de como envia uma string e receber um retorno também de string nao ta funcionando…

eu não sei se fiz algo de errado… alguma coisa no tomcat, sei la…

eis o meu \webapps\ROOT\WEB-INF\web.xml caso faça alguma diferença:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!--
 Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

  <display-name>Wel come Tomcat</display-name>
  <description>
     teste
  </description>


<servlet> 
     <servlet-name>ServletAjax</servlet-name> 
     <servlet-class>ServletAjax</servlet-class> 
</servlet> 
<servlet-mapping> 
     <servlet-name>ServletAjax</servlet-name> 
     <url-pattern>/ajax</url-pattern> 
</servlet-mapping>



</web-app>

Como vc mapeou seu Servlet no web.xml? é ajax mesmo?
Confirme para nos , talvez o servlet nao esta sendo encontrado.

Tem um exemplinho bem simples aqui.

http://gujs.com.br/blog/2007/03/tutorial-basico-sobre-ajax/

valeu ai a ajuda pessoal…

euvo testa aki o codigo da pagina que o nbluis mando e retorno o codigo caso funcione, caso alguem precise no futuro…

brigadão a todos

problema ainda…eu atualizei o codigo pelo que eu intendi, masi aparece sempre “undefined”

arrumei a url, mudei para

var url= “ajax?receber=flavio”;

o metodo que faltava, colei ele da apostila que eu to usando, o mesmo codigo que tinha jogado depois de da o open

segue o codigo atual do jsp:

<html>
<body>
<script type="text/javascript">

var texto;

function ajaxFunction(){ 
     var req; 
     var isIE; 
     if (window.XMLHttpRequest) { 
            req = new XMLHttpRequest(); 
     }else if (window.ActiveXObject) { 
            isIE = true; 
            req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     var url= "ajax?receber=flavio";   
     req.onreadystatechange = processRequest; 
     req.open("GET", url, true);  
     req.send(null); 

     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
                 
         } 
     }

	document.formulario.saida.value=texto;

}	

 function processRequest() { 
     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
                  

	     
         } 
     } 
 }




</script>
<form name="formulario">
entrada: <input type="text" onkeyup="ajaxFunction();" name="entrada" />
saida: <input type="text" name="saida" />
</form>
</body>
</html>

nessa parte do codigo:

if (req.readyState == 4) { …

eu tinha jogado na saida do formulario a string recebida de dentro do metodo mais nao funciono (so leigo em ajax, nao sei bem pq se ao q intendi do codigo a variavel texto teria que ter a resposta ), por isso eu voltei ele aonde tava…

ao fazer isso, a saida esta aparecendo sempre “undefined”, tanto no ie quanto no opera

se alguem ainda puder me ajudar…fico muito grato

Cara… a url continua incompleta…
lembrese

http://localhost:8080/aplicacao/pagina.jsp

Vc não pode colocar o código da outra funcao dentro da funcao de requisicao.

Pois este será invocado automaticamente pelo browser a cada mudanca de requisição.

Faça como o exemplo que lhe mostei…

pagina.jsp…

alterei colocando o endereço completo como vc falou… mais no caso, to procurando por ajax, como foi mapeada minha classe no xml…ainda não funciono…

eu so obrigado a cria uma pagina jsp que envie e receba essas informações???

eu uso o param do jsp pra receber???

como que eu envio, com o metodo send do xmlhttp???

<html>
<body>
<script type="text/javascript">

var texto;

function ajaxFunction(){ 
     var req; 
     var isIE; 
     if (window.XMLHttpRequest) { 
            req = new XMLHttpRequest(); 
     }else if (window.ActiveXObject) { 
            isIE = true; 
            req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     var url= "http://127.0.0.1:8080/ajax?receber=flavio";   
     req.onreadystatechange = processRequest; 
     req.open("GET", url, true);  
     req.send(null); 

     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
                 
         } 
     }

	document.formulario.saida.value=texto;

}	

 function processRequest() { 
     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
             //alert("resposta = "+texto);      

	     
         } 
     } 
 }




</script>
<form name="formulario">
entrada: <input type="text" onkeyup="ajaxFunction();" name="entrada" />
saida: <input type="text" name="saida" />
</form>
</body>
</html>

[quote=maior_abandonado]pagina.jsp…
[/quote]
Pode ser um servlet mesmo, mas mesmo um servlet tem um endereco completo… como o descrito acima.

[quote=maior_abandonado]
alterei colocando o endereço completo como vc falou… mais no caso, to procurando por ajax, como foi mapeada minha classe no xml…ainda não funciono…[/quote]
Não muda nada… para o javascript, se é um servlet, um jsp, um php, ou qualquer coisa dá no mesmo… só que o endereco tem que ser válido.

Não, só o servlet funciona,

Exatamente igual…

O send é desnecessário nesse caso…
É utilizado para enviar dados via post.


Cara, olha so…
quer saber se o endereco ta certo ??? faça o seguinte.;…
pegue o valor da variável url e coloca em outra janela do browser…
se funcionar… o endereco ta certo, senão não…
o ajax não faz requisição automaticamente para o mesmo domínio da pagina que ele está (apesar de ajax para domínios externos terem umas artemanhas…)

Quanto ao javascript…
Siga as instruções do link que te passei…
Esse seu código não vai funcionar…

Agora ta quase…
sobre seu javascript…
faça isso…


 function processRequest() {   
      if (req.readyState == 4) {   
          if (req.status == 200) {   
              texto = req.responseText;   
              document.formulario.saida.value=texto;  
   
            
          }   
      }   
 }  

Agopra veja se sua url está correta…

então…eu tinha tentado fazer isso e não funciono… foi por isso que eu voltei essa linha aonde escreve na saida do formulario dentro da outra função e deixei a variavel global pra todo mundo encherga… ai mesmo que seja um “undefined”, eu ja tinha um sinal de vida, o que é um sinal melhor…

eu não tenho muita certeza, mais o que acho que ta faltando, é justamente esse endereço mesmo

o meu servlet ta no arquivo ServletAjax.class

o codigo dele é:

import javax.swing.JOptionPane;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletAjax extends HttpServlet { 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        String receber = request.getParameter("nome ").trim(); 
        
        System.out.println("recebido" +receber);
        
        //LÓGICAS NECESSÁRIAS A SEREM IMPLEMENTADAS DEPOIS

        response.getWriter().write("recebido"); 
     } 
} 

eu coloquei ele no diretorio root e em todos os seus subdiretorios, pra ver se algo funcionava, creio eu que o web.xml redireciona a requisição pra ele e o retorno dele para o cliente…mais algo esta dando errado…

segue a parte do meu xml que mapeia (eu acho):

<servlet> 
     <servlet-name>ServletAjax</servlet-name> 
     <servlet-class>ServletAjax</servlet-class> 
</servlet> 
<servlet-mapping> 
     <servlet-name>ServletAjax</servlet-name> 
     <url-pattern>/ajax</url-pattern> 
</servlet-mapping>

tem como me da um exemplo de como que tem que fica a url de la do meu jsp??

Ele chega a chamar seu servlet ??
Você consegue acessar? Dá o print no log ?

o log de hj, arquivo manager.2008-01-08.log esta em branco… nao sei se alguma coisa ta configurada errada… eu dei akele println tb no servlet pra ver se aparece no console do tomcat, o bat de iniciar ele

eu to testando do browser, tanto do IE 7 quanto do opera 9.25…tudo o q eu consigo é um monte de undefined

tem como vc me adiciona no msn??? maior_abandonado@hotmail.com

posso adiciona vc???

Não tenho msn aqui…
Cara… resolva primeiro seu problema com o servlet… teste com o browser mesmo…
depois disso, vá para o ajax, ver o que acontece…

ok…eu vo da uma estudada e vo ver o que que pode estar errado com o servlet… afinal de contas to começando com web a ± 1 semana…

to tentando fazer funciona um codigo em ajax pq tava querendo coloca em web, uma aplicação que desenvolvi em swing, eu preciso de ajax pq tem varias label nela que ficam se atualizando segundo a segundo… talves seja mais facil fazer o que eu quero com jsp…

bom…muito obrigado pela ajuda, pelas respostas que foram objetivas…vlw mesmo

editando, nesse “o que eu quero”, eu quis dizer só envia e receber uma string do cliente e ir atualizando de forma rapida e automatica, a regra de negocio ja esta pronta, na classe que a swing chama…

bom, obrigadão kra…

olhei o log errado…

eu tinha olhado o arquivo manager.2008-01-08.log, enquanto depois vi que tinha outro com a emsma data no nome e vendo o nome intendi a diferença, esse otro é o localhost.2008-01-08.log

no log de hoje, o localhost.2008-01-09.log, eu vi q ta dando null pointer… to colando o final dele:

SEVERE: Servlet.service() for servlet ServletAjax threw exception
java.lang.NullPointerException
	at ServletAjax.service(ServletAjax.java:11)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:263)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:584)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Thread.java:619)

no codigo da servlet, no metodo que recebe o parametro, notei que tava nome, e eu to enviando receber, por isso alterei tb mais nao mudo nada… continua dando null pointer…
segue o codigo da servlet:

import javax.swing.JOptionPane;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class ServletAjax extends HttpServlet { 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        String receber = request.getParameter("receber").trim(); 
        
        System.out.println("recebido" +receber);
        
        response.getWriter().write("recebido"); 
     } 
} 

segue o jsp:

<html>
<body>
<script type="text/javascript">

var texto;

function ajaxFunction(){ 
     var req; 
     var isIE; 
     if (window.XMLHttpRequest) { 
            req = new XMLHttpRequest(); 
     }else if (window.ActiveXObject) { 
            isIE = true; 
            req = new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
     var url= "http://127.0.0.1:8080/ajax?receber=flavio";   
     req.onreadystatechange = processRequest; 
     req.open("GET", url, true);  
     req.send(null); 


     document.formulario.saida.value=texto;

}	

 function processRequest() { 
     if (req.readyState == 4) { 
         if (req.status == 200) { 
             texto = req.responseText; 
             //quando tentei coloca o saida.value=texto aqui nao tava atualizando
         } 
     } 
 }
</script>
<form name="formulario">
entrada: <input type="text" onkeyup="ajaxFunction();" name="entrada" />
saida: <input type="text" name="saida" />
</form>
</body>
</html>

alguem ai poderia me ajdua a resolver esse null pointer??? brigado galera pela força

depois das mudanças que fiz, no servlet, não via diferença, mais percebi que elas aconteceram depois de reinicia o tomcat…

agora nao ta dando mais o null pointer, porem ainda nao ta chegando o valor correto no jsp…

não sei bem por que, mais continua aparecendo o undefined…

os codigos são esses aqui:

public class ServletAjax extends HttpServlet { 
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
        
        //System.out.println("\n linha antes do request ");

        
        String entrada = request.getParameter("receber").trim(); 
        
        
        System.out.println("recebido " +entrada+" com sucesso");
        
        response.getWriter().write("recebido ok"); 
        
        System.out.println("\n\n linha depois do retorno ");
     } 
} 

e o jsp:

<html>   
<body>   
<script type="text/javascript">   
  
var texto;   
  
function ajaxFunction(){   
     var req;   
     var isIE;   
     if (window.XMLHttpRequest) {   
            req = new XMLHttpRequest();   
     }else if (window.ActiveXObject) {   
            isIE = true;   
            req = new ActiveXObject("Microsoft.XMLHTTP");   
     }   
     var url= "http://127.0.0.1:8080/ajax?receber=flavio";     
     req.onreadystatechange = processRequest;   
     req.open("GET", url, true);     
     req.send(null);   
  
  
     document.formulario.saida.value=texto;   
  
}     
  
function processRequest() {   
     if (req.readyState == 4) {   
         if (req.status == 200) {   
             texto = req.responseText;   
         }   
     }   
}   
</script>   
<form name="formulario">   
entrada: <input type="text" onkeyup="ajaxFunction();" name="entrada" />   
saida: <input type="text" name="saida" />   
</form>   
</body>   
</html>

no console do tomcat a saida esta aparecendo assim:

recebido flavio com sucesso

linha depois do retorno
recebido flavio com sucesso

linha depois do retorno
recebido flavio com sucesso

linha depois do retorno

… e isso vai se repetindo a cada caractere digitado na pagina jsp, o log do tomcat nao apresenta mais erros, seguem as ultimas linhas dele caso ajude:

09/01/2008 16:43:52 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextDestroyed()
09/01/2008 16:48:04 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
09/01/2008 16:48:04 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()

alguem ai poderia me ajuda???

agora tu faz isso.

 function processRequest() {     
      if (req.readyState == 4) {     
          if (req.status == 200) {                 
            document.formulario.saida.value=req.responseText;    
          }     
      }     
 }