JSP Ajax

Tenho um código de exmplo usando ajax, atualizando um combo de cidades para estados como segue abaixo:

Minha Dao

[code]import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ClientesDAO {

public static ClientesDAO instance = new ClientesDAO();
private Map bancoDados;
private ClientesDAO() {
    bancoDados = new HashMap();
    bancoDados.put("MG",new String[]
    {"Belo Horizonte", "Uberaba", "Uberlandia"});
    bancoDados.put("RJ",new String[]
    {"Buzios", "Cabo Frio","Rio de Janeiro"});
    bancoDados.put("SP",new String[]
    {"Campinas", "Santos","São Paulo"});
}

public static ClientesDAO getInstance() {
    return instance;
}

public List getCidades(String estado) {
    String[] cidades = (String[]) bancoDados.get(estado);
    return Arrays.asList(cidades);
}

}[/code]

Minha Servlet

[code]import br.com.dao.ClientesDAO;
import java.io.*;
import java.util.Iterator;
import java.util.List;

import javax.servlet.;
import javax.servlet.http.
;

public class CadastrarCliente extends HttpServlet {

protected void processRequest(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    String action = request.getParameter("action");
    if("preencherCidades".equals(action)) {
        String estado = request.getParameter("estado");
        //Leitura da lista de cidades do BD
        List cidades = ClientesDAO.getInstance().getCidades(estado);
        if(cidades.size() > 0) {
            response.setContentType("text/xml");
            PrintWriter out = response.getWriter();
            out.write("<?xml version='1.0' ?>");
            out.write("<cidades>");
            for (Iterator it = cidades.iterator(); it.hasNext();){
                Object elem = (Object) it.next();
                out.write("<cidade>"+elem+"</cidade>");
            }
            out.write("</cidades>");
        }
    } else {
        //Codigo para cadastro de cliente no banco
    }
    System.out.println("Finalizando servlet");
}

protected void doGet(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

protected void doPost(HttpServletRequest request,
        HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

}[/code]

Meu JSP

[code]

Exemplo AJAX

<script type="text/javascript">
      var request;

      function sendRequest() {

      //Determina o estado selecionado
      combo = document.getElementById("estado");
      estado = combo.options[combo.selectedIndex].value;

      //Retorna quando nenhum estado for selecionado
      if(estado == "-1")
          return;

      //Monta a url de requisicao para o servidor
      url = "cadastrarCliente?action=preencherCidades&estado="
            + estado;

      //Inicializa o objeto XMLHttpRequest para o Mozilla
      if ( window.XMLHttpRequest ) {
          request = new XMLHttpRequest();
      }

     //Inicializa o objeto XMLHttpRequest para o Internet Explorer
      else if (window.ActiveXObject) {
          request = new ActiveXObject("Microsoft.XMLHTTP");
      }

      //determina a função para processamento da requisição
      request.onreadystatechange = processRequest;

      //configura a requisição
      request.open("GET",url,true);

      //envia a requisição
      request.send(null);
      }

      function processRequest() {
          //Verifica se a resposta já foi recebida por completo
          if(request.readyState == 4) {
          //Verifica se o status é OK
              if(request.status == 200) {
                  //Faz a leitura do documento XML recebido
                  var response = request.responseXML;
                  var raiz =
                  response.getElementsByTagName("cidades").item(0);
                  var cidades = raiz.getElementsByTagName("cidade");

                  //Seleciona a caixa de selecao de cidades
                  var selectNode = document.getElementById("cidade");

                  //Apaga as opções atuais da caixa de seleção
                  selectNode.options.length = 0;

                  //preenche a caixa de opções com os valores recebidos
                  for(var i = 0; i < cidades.length; i++) {
                      var txtCidade = cidades.item(i).firstChild.data;
                      var option = new Option(txtCidade);
                      selectNode.add(option,null);
                  }
              }
          }
      }
</script>    
   </head>
<body>
    <h1>Cadastro de Clientes</h1>
    <form action='<%=request.getContextPath()+"/cadastrarCliente"%>'
          method='post'>
        <fieldset><legend>Dados do cliente</legend>
            <table>
                <tr>
                    <td><label for='nome'>Nome:</label></td>
                    <td colspan='3'>
                        <input name='nome' id='nome' type='text'
                               size='75' maxlength='255'>
                    </td>
                </tr>
                <tr>
                    <td><label for='telefone'>Telefone: (0000-0000)
                        </label>
                    </td>
                    <td><input name='telefone' id='telefone'
                                   type='text' size='16'>
                    </td>
                    <td><label for='email'>e-mail:</label>
                    </td>
                    <td><input name='email' id='email' type='text'
                                   size='37'>
                    </td>
                </tr>
            </table>
        </fieldset>
        <fieldset>
            <legend></legend>
            <table>
                <tr>
                    <td><label for='endereco'>Rua/Av:</label></td>
                    <td><input name='rua' id='rua' type='text'
                                   size='40' maxlength='255'>
                    </td>
                    <td><label for='numero'>Número:</label></td>
                    <td><input name='numero' id='numero' type='text'
                                   size='8' maxlength='5'>
                    </td>
                </tr>
                <tr>
                    <td><label for='bairro'>Bairro:</label></td>
                    <td><input name='bairro' id='bairro' type='text'>
                        
                    </td>
                    <td><label for='cep'>CEP (00000-000):</label>
                    </td>
                    <td><input name='cep' id='cep' type='text'
                                   size='8'>
                    </td>
                </tr>                    
                <tr>
                    <td><label for='estado'>Estado:</label></td>
                    <td>
                        <select name='estado' id='estado'
                                onchange='sendRequest();'>
                            <option value='-1'>Escolha um estado
                            </option>
                            <option value='MG'>MG</option>
                            <option value='SP'>SP</option>
                            <option value='RJ'>RJ</option>
                        </select>
                    </td>
                    <td>
                        <label for='cidade'>Cidade:</label>
                    </td>
                    <td><select name='cidade' id='cidade'
                                    style="width:200px"></select>
                    </td>
                </tr>
            </table>
        </fieldset>
        <input type='submit' value="Salvar">
    </form>
</body>
[/code]

Meu xml

[code]<?xml version="1.0" encoding="UTF-8"?>




30




index.jsp



CadastrarCliente

br.com.globalcode.servlets.CadastrarCliente



CadastrarCliente
/cadastrarCliente

[/code]

Estou usando netbeans, coloquei pontos de depuração na servelt esta funcionando legal. Mais quando executa o metodo processRequest do javascrpt não funciona. Coloquei alert para verificar se estava passando dentro do codigo request.status = 200. Correto, mais nao estou conseguindo verificar o erro.

Muito Obrigado

Ninguem se habilita. :frowning:

Alguem consegue verificar o erro.