Foros del Web » Programación para mayores de 30 ;) » Java »

FormData

Estas en el tema de FormData en el foro de Java en Foros del Web. Comento mi gran perdición y lo que me esta amargando la existencia. Espero que alguien pueda ayudarme . Bien la cosa es que estoy practicando ...
  #1 (permalink)  
Antiguo 05/02/2016, 13:32
 
Fecha de Ingreso: enero-2010
Mensajes: 35
Antigüedad: 14 años, 3 meses
Puntos: 0
FormData

Comento mi gran perdición y lo que me esta amargando la existencia. Espero que alguien pueda ayudarme .

Bien la cosa es que estoy practicando como trabajo Ajax-js-servlet y envio GET y POST o incluso JSON funciona bien el problema esta en cuando quiero enviar un formulario como FormData y es que no soy capaz de coger los parámetros con el servlet.
Este es el js: Lineas clave 67-74
Código Javascript:
Ver original
  1. window.addEventListener("load",cargarSelect);
  2.    
  3.             var xhl;
  4.             function cargarSelect(){
  5.                 //creamos el objeto XMLHttpRequest
  6.                 xhl= new XMLHttpRequest();
  7.                 var formu=document.createElement("form");
  8.                 formu.method="POST";
  9.                
  10.                 formu.name="formu";
  11.                 formu.id="formu";
  12.                 formu.enctype="multipart/form-data";
  13.                 document.body.appendChild(formu);
  14.                 //pedimos el select de las comunidades
  15.                 peticionComunidades();
  16.                
  17.             }
  18.            
  19.            
  20.             function peticionComunidades(){
  21.                 //añadimos el listener para gestionar los cambios en el objeto
  22.                 xhl.addEventListener("readystatechange",procesarDatosComunidades);
  23.                 //cargamos el fichero en este caso un servlet
  24.                 xhl.open("GET","comunidadesServlet",true);
  25.                 //El metodo GET manda en el enlace los datos pero en este caso no necesitamos enviar nada solo recoger
  26.                 xhl.send(null);
  27.             }
  28.            
  29.             function procesarDatosComunidades(evento){
  30.                 var event=evento || window.event;
  31.                 //comprobamos que el estado de la descarga ajax ha terminado
  32.                 if(event.target.readyState ==4 ){
  33.                     //creamos el select
  34.                     var select=document.createElement("select");
  35.                     //le damos un id para luego poder acceder a ello
  36.                     select.id="comunidad";
  37.                    
  38.                    
  39.                     //le añadimos los eventos al select
  40.                     select.addEventListener("change",peticionProvincias);
  41.                     //guardamos los resultado en una variable
  42.                     var doc=xhl.responseXML;
  43.                     //Al ser XML nos devolvera una serie de objetos envueltos en tagsy podemos acceder a ellos
  44.                     var idComunidades=doc.getElementsByTagName("identificador");
  45.                     var nomComunidades=doc.getElementsByTagName("nombre");
  46.                     //recorremos los resultados y los vamos añadiendo al select
  47.                     for(var i=0; i<idComunidades.length;i++){
  48.                         var nodo=document.createElement("option");
  49.                         nodo.value=idComunidades.item(i).firstChild.nodeValue;
  50.                         nodo.innerHTML=nomComunidades.item(i).firstChild.nodeValue;
  51.                         select.appendChild(nodo);
  52.                     }
  53.                     //añadimos al body el select
  54.                     document.getElementById("formu").appendChild(select);
  55.                     //removemos elevento para usar el objeto mas adelante
  56.                     xhl.removeEventListener("readystatechange",procesarDatosComunidades);
  57.                 }
  58.             }    
  59.             function peticionProvincias(){
  60.                 //deshabilitmos el select durante la creacion del select de provincias
  61.                 //document.getElementById("comunidad").disabled =true;
  62.                  //añadimos el listener para gestionar los cambios en el objeto
  63.                 xhl.addEventListener("readystatechange",procesarDatosProvincias);
  64.                 //recogemos el valor de la comunidad
  65.                 var comunidad=document.getElementById("comunidad").value;
  66.                 //cargamos el fichero en este caso un servlet
  67.                 var datos =new FormData(document.getElementById("formu"));
  68.                
  69.              
  70.                
  71.                  xhl.open("POST","provinciasServletForm",true);
  72.                 //añadimos una cabecera y un envio de parametros
  73.                  xhl.setRequestHeader('Content-Type', "multipart/form-data");
  74.                 xhl.send(datos);
  75.             }
  76.             function procesarDatosProvincias(evento){
  77.                 var event=evento || window.event;
  78.                 //comprobamos que el estado de la descarga ajax ha terminado
  79.                 if(event.target.readyState ==4 && evento.target.status == 200 ){
  80.                     //si existe el nodo del select primero lo borramos
  81.                      
  82.                     if(!document.getElementById("provincias")){
  83.                         //creamos el select y le damos un id por un futuro uso
  84.                         var select=document.createElement("select");
  85.                         select.id="provincias";
  86.                         //guardamos los resultado en una variable
  87.                         var doc=xhl.responseXML;
  88.                         //Al ser XML nos devolvera una serie de objetos envueltos en tagsy podemos acceder a ellos
  89.                         var idComunidades=doc.getElementsByTagName("identificador");
  90.                         var nomComunidades=doc.getElementsByTagName("nombre");
  91.                           //recorremos los resultados y los vamos añadiendo al select
  92.                         for(var i=0; i<idComunidades.length;i++){
  93.                             var nodo=document.createElement("option");
  94.                             nodo.value=idComunidades.item(i).firstChild.nodeValue;
  95.                             nodo.innerHTML=nomComunidades.item(i).firstChild.nodeValue;
  96.                             select.appendChild(nodo);
  97.                         }
  98.                          //añadimos al body el select
  99.                         document.getElementById("formu").appendChild(select);
  100.                            //removemos elevento para usar el objeto mas adelante
  101.                         xhl.removeEventListener("readystatechange",procesarDatosProvincias);
  102.                         //habilitamos de nuevo el select de comunidades
  103.                         document.getElementById("comunidad").disabled =false;
  104.                     }else{
  105.                         //borramos el select y llamamos al metodo otra vez
  106.                         var child= document.getElementById("provincias");
  107.                         child.parentNode.removeChild(child);
  108.                         procesarDatosProvincias();
  109.                      }
  110.                 }
  111.             }

Y este el servlet:
Código Java:
Ver original
  1. package servlets;
  2.  
  3. import beans.Comunidad;
  4. import beans.Provincia;
  5. import java.io.IOException;
  6. import java.io.PrintWriter;
  7. import java.util.ArrayList;
  8. import javax.servlet.ServletException;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import modelo.ComunidadesDao;
  14.  
  15. /**
  16.  *
  17.  * @author otori
  18.  */
  19. @WebServlet(name = "provinciasServletForm", urlPatterns = {"/provinciasServletForm"})
  20. public class provinciasServletForm extends HttpServlet {
  21.  
  22.     /**
  23.      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
  24.      * methods.
  25.      *
  26.      * @param request servlet request
  27.      * @param response servlet response
  28.      * @throws ServletException if a servlet-specific error occurs
  29.      * @throws IOException if an I/O error occurs
  30.      */
  31.     @Override
  32.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  33.             throws ServletException, IOException {
  34.          response.setContentType("text/xml;charset=UTF-8");
  35.         try (PrintWriter out = response.getWriter()) {
  36.             //recoge el atributode comunidades
  37.             //recoge mediante el dao la lista de provincias la transforma en XML
  38.             //y muestra el resultado
  39.               String respuesta="<?xml version='1.0'?><comunidades>";
  40.            
  41.              
  42.              
  43.               int id=Integer.parseInt(request.getParameter("id"));
  44.               ComunidadesDao pdao=new ComunidadesDao();
  45.               ArrayList<Provincia> provincias=(ArrayList<Provincia>) pdao.obtenerProvincias(id);
  46.              
  47.             for(Provincia p: provincias){
  48.                 respuesta+="<identificador>"+p.getIdProvincia()+"</identificador><nombre>"+p.getNombreProvincia()+"</nombre>";
  49.             }
  50.             respuesta+="</comunidades>";
  51.             out.println(respuesta);
  52.         }
  53.     }
  54.  
  55.     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
  56.     /**
  57.      * Handles the HTTP <code>GET</code> method.
  58.      *
  59.      * @param request servlet request
  60.      * @param response servlet response
  61.      * @throws ServletException if a servlet-specific error occurs
  62.      * @throws IOException if an I/O error occurs
  63.      */
  64.  
  65.  
  66.     /**
  67.      * Handles the HTTP <code>POST</code> method.
  68.      *
  69.      * @param request servlet request
  70.      * @param response servlet response
  71.      * @throws ServletException if a servlet-specific error occurs
  72.      * @throws IOException if an I/O error occurs
  73.      */
  74.  
  75.  
  76.     /**
  77.      * Returns a short description of the servlet.
  78.      *
  79.      * @return a String containing servlet description
  80.      */
  81.     @Override
  82.     public String getServletInfo() {
  83.         return "Short description";
  84.     }// </editor-fold>
  85.  
  86. }


Gracias y esperoque alguien pueda ayudarme
  #2 (permalink)  
Antiguo 06/02/2016, 03:54
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: FormData

Buenas,

El multipart/form-data se utiliza cuando quieres enviar ficheros. Si envias datos con dicho enctype el getParameter devolvera siempre null.

Para este caso te recomiendo que utilices commons-fileupload: http://commons.apache.org/proper/com...oad/using.html

Si no vas a enviar ficheros, como creo que es el caso, entonces usar multipart/form-data no tiene ningun sentido.


Un saludo
__________________
If to err is human, then programmers are the most human of us
  #3 (permalink)  
Antiguo 06/02/2016, 05:52
 
Fecha de Ingreso: enero-2010
Mensajes: 35
Antigüedad: 14 años, 3 meses
Puntos: 0
Respuesta: FormData

Por lo que he entendido si yo elimino:
Código Javascript:
Ver original
  1. xhl.setRequestHeader('Content-Type', "multipart/form-data");
y lo dejo por defecto debería funcionar perfectamente pero me sigue devolviendo un null.
También he pensado en que puede ser por que no coja el select y he probado a darle un .append y pasar le ("id",comunidad.value) pero sigue pasando un null ...

Código Javascript:
Ver original
  1. var comunidad=document.getElementById("comunidad").value;
  2.                 //cargamos el fichero en este caso un servlet
  3.                 var datos =new FormData();
  4.                
  5.              
  6.                
  7.                  xhl.open("POST","provinciasServletForm",true);
  8.                 //añadimos una cabecera y un envio de parametros
  9.          
  10.                  datos.append("id",comunidad);
  11.                  xhl.send(datos);
  #4 (permalink)  
Antiguo 06/02/2016, 08:20
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: FormData

Buenas,

No.

FormData forma parte del estandard XMLHttpRequest Level 2 para el envio de ficheros por Ajax: https://www.w3.org/TR/XMLHttpRequest2/.
Desde el momento en el que utilizas el objeto FormData con Javascript estas forzando automaticamente el envio como multipart/form-data.

Si no vas a enviar ficheros, utiliza un envio Post normal y olvidate del FormData.

Un saludo
__________________
If to err is human, then programmers are the most human of us

Etiquetas: ajax, javascript, jsp
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:40.