Problema con jsp

Publicado en 'Programación' por Raise, 4 May 2015.





  1. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1




    Buenas tardes.

    Estoy con un ejercicio sencillo, tengo un <select> para categorias y según la opción que marque muestre una tabla que pertenecen a dicha categoría, pues eso, selecciono y no pasa nada.

    Funciona de la siguiente forma, al cambiar la selección se activa el onchange que activa una función en javascript, la cual manda el parámetro a un servlet con un get y de ahí ejecuta el método de la clase.

    Aquí el código:

    Código:
    <html>
        <head>
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
            <title>JSP Page</title>
            <script type="text/javascript"></script>
            <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.2/jquery.min.js"></script>
        </head>
        <script type="text/javascript">
           [B] function gen(){
                var documento = null;
                documento = new XMLHttpRequest();
                var destino = document.getElementById("mmm");
                if(documento){
                    var cat = document.getElementById("s1").value;
                    
                    var url = "doClasificar?cat="+cat;
                    
                    documento.open("GET",url,true);
                    documento.send();
                    destino.innerHTML = documento.responseText;
                }
            }[/B]
        </script>
        <body>
            <h1>Hello World!</h1>
            <form id="f1" name="f1" method="post">
                <select id="s1" name="s1" onchange="gen()">
                    <%
                        ArrayList lista = new ArrayList();
                        Funciones objF = new Funciones();
                       
                        lista = objF.listarCat();
                       
                        for (int i=0; i<lista.size();i++){
                            Categoria objA = (Categoria)lista.get(i);
                            int x = i+1;
                            out.print("<option value='00"+x+"'>"+objA.getNomcat()+"</option>");
                        }
                    %>
                </select>
                <div id="mmm">
                                   
                </div>
               
            </form>
        </body>
    </html>

    Código:
    public ArrayList clasificarArt(String cat){
            ArrayList lista = new ArrayList();
            Articulo objA = new Articulo();
            PreparedStatement stm = null;
            try {
                stm = objC.conectar().prepareCall("SELECT * FROM articulos WHERE CDGRUPO03='"+cat+"'");
                          
                while(stm.executeQuery().next()){               
                    objA.setCodart(stm.executeQuery().getString(1));
                    objA.setNomart(stm.executeQuery().getString(2));
                    objA.setTipo(stm.executeQuery().getString(3));
                    lista.add(objA);
                }
               
            } catch (Exception e) {
                System.err.println("Error de procedimiento: " +e.getMessage());
            }
           
            return lista;
        }

    Código:
    @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //processRequest(request, response);
            PrintWriter out = response.getWriter();
            Articulo objA = new Articulo();
            Funciones objF = new Funciones();
            ArrayList lista3 = new ArrayList();
           
            if(request.getParameter("cat")==null){
                out.print("Falta");
            }
            else{
                String t = request.getParameter("cat");
          
                lista3 = objF.clasificarArt(t);
           
                out.println("<table>");
                for(int i=0;i<lista3.size();i++){
                    objA = (Articulo)lista3.get(i);
                    out.println("<tr>");
                    out.println("<td>"+objA.getCodart()+"</td>");
                    out.println("<td>"+objA.getNomart()+"</td>");
                    out.println("<td>"+objA.getTipo()+"</td>");
                    out.println("</tr>");
                }       
                out.println("</table>");
            }
        }

    Gracias anticipadas.
     


  2. FulioMG

    FulioMG Miembro de plata

    Registro:
    15 Dic 2014
    Mensajes:
    3,555
    Likes:
    970
    Porque usas servlet pasate a un framework mejor, JSF con primefaces y listo.
     
  3. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    ¿Y eso como sería? Por curiosidad.

    Me gustaría mantener el plan original.
     
  4. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    y realmente funciona la url ?
    Código:
    http://tuwebserver:puerto/doClasificar?cat=001
    
    pon un alert , en la función para saber si esta siendo llamado
    Código:
    function gen(){
      alert("ini func:gen")
      var documento = null;
    ......
    
    Ejemplo : https://jsfiddle.net/2080vyow/
     
  5. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    No lo creo, probé con un out.print desde el servlet a un div para ver si recoge el parámetro "cat" pero nada.
     
  6. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Pon la url en tu navegador : chrome/firefox directo para saber si funciona
    http://tuwebserver:puerto/doClasificar?cat=001

    Si no devuelve nada no funciona tu servlet (revisa tu web.xml), si devuelve algo entonces el error va del lado de javascript , y vas a la consola de javascript de tu navegador para que veas que error es .
     
    Última edición: 5 May 2015
  7. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    Ya revise, si responde, pero solo si lo ejecuto desde el mismo servlet (si pongo cat=001 el resultado es 001<table></table>, lo que significa que el método está mal, aunque no le veo error, tal vez tú si puedas verlo), si lo ejecuto desde la página jsp no hace nada y en la consola no salta error.

    Gracias.
     
  8. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    pues yo puse 001 como ejemplo tu tienes que probar con tu data de categoria.

    este método te tiene que devolver algo
    Código:
    String t = request.getParameter("cat");
    lista3 = objF.clasificarArt(t);
    
    sino revisa tu clase Funciones .
     
  9. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    Bueno, lo logré, en parte, ya ejecuta la consulta pero el evento sigue sin funcionar (cuando seleccione una categoría el servlet debería mandar un response a un div para que muestre la lista pero nada).

    Pongo el cambio que he hecho.

    Código:
    public ArrayList clasificarArt(String cat){
            ArrayList lista = new ArrayList();       
            PreparedStatement stm = null;
            ResultSet rs = null;
           
            try {
                stm = objC.conectar().prepareCall("SELECT CDARTICULO, DSARTICUL1, CDGRUPO03 FROM articulos WHERE CDGRUPO03=?");
                stm.setString(1, cat);
                rs = stm.executeQuery();
                while(rs.next()){    
                    Articulo objAr=new Articulo();
                    objAr.setCodart(rs.getString(1));
                    objAr.setNomart(rs.getString(2));
                    objAr.setTipo(rs.getString(3));
                    lista.add(objAr);
                }
               
            } catch (Exception e) {
                System.err.println("Error de procedimiento: " +e.getMessage());
            }
           
            return lista;
        }
     
  10. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Trata de separar en partes tu problema, especifica que es lo que no funciona :

    - No funciona cuando ejecutas la url del servlet desde un navegador.?
    - la funcion javascript es llamada pero no actualiza el div.?
    - la funcion no es llamada cuando usas el select en la pag html.?
     
  11. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    Si funciona.
    Exacto, a ver, hago click en una opción del select, se activa el evento, el evento recoge el valor de la opción y manda un request junto con el parámetro de la opción al servlet. El detalle está en que o no hace el request o sí lo hace pero no hace response al div para que me muestre la lista, la consola no reconoce ningún error.
    Sí, sí llama, ya probé con el alert.

    _____________________________________________________________________________

    Edit: En internet explorer si funciona, en chrome (que era donde estoy trabajando) no.
     
    Última edición: 5 May 2015
  12. gnox

    gnox Miembro maestro

    Registro:
    3 Ene 2013
    Mensajes:
    794
    Likes:
    252
    Ok tons ya esta mas ubicable la causa del problema.

    Y la explicación ahora es un poco de teoria: javascript cuando se ejecuta en el motor implementado de los browsers normalmente se ejecuta en forma asincrona.

    Cuando es asincrona el motor se sopla todas las lineas de codigo 1 a 1 , hayan terminado o no internamente. Si fuera sincrona como Java espera por la culminación de la sentencia anterior, por lo que tu send no ha terminado o sigue ejecutandose y el browser ya ejecuto la linea de innerhtml=documento.responseText con obviamente nada. Entonces 1 de 2 :

    - Cambias el parametro , asincrono = true a false
    Código:
    documento.open("GET",url,true);
    
    por
    Código:
    documento.open("GET",url,false);
    
    -o Metes una función de tipo listener que se ejecute cuando el send haya recibido la respuesta del servlet, y mueves documento.responseText a esa funcion, ejemplo :
    Código:
    documento.onreadystatechange=function(){
          if (documento.readyState==4 && documento.status==200)
         {
          destino.innerHTML=documento.responseText;
        }
    }
    
     
  13. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    Bueno, caso resuelto con la opción para vagos, gracias por todo.
     
  14. Fedany

    Fedany Miembro frecuente

    Registro:
    21 Feb 2014
    Mensajes:
    52
    Likes:
    1
    se soluciono el problema :)
     
Etiquetas: