Buenas, pues mirar tengo un problema con un ArrayList
:
Tengo una aplicación que tiene dos servlets, uno para validar datos donde tengo guardado un ArrayList
que necesito llamar desde el otro servlet que es para comprobar los datos introducidos en una fecha concreta. Mi problema es que lo llame como lo llame siempre me da la excepción NullPointerException
, y no se cómo pasar los datos de un servlet a otro. Adjunto el código:
Este es el código del primer servlet donde creo el ArrayList
:
ArrayList<ObservacioMeteorologica> observacions = new ArrayList<>(); ObservacioMeteorologica obmet = new ObservacioMeteorologica(mun, fecha, TempMax, TempMin, Prec); observacions.add(obmet); req.setAttribute("d", obmet); req.setAttribute("observacio", observacions); req.getRequestDispatcher("DadesOK.jsp").forward(req, resp);
Y así es como la estoy intentando llamar en la otra página:
ArrayList <ObservacioMeteorologica> p = (ArrayList<ObservacioMeteorologica>) getServletContext().getAttribute("observacio");
¿Alguien tiene idea de como podría pasar los datos del ArrayList
?
Respuestas
Basándome en esta respuesta publicada en StackOveflow por el usuario BalusC, creo que lo que deberías hacer el siguiente cambio:
// código original req.getRequestDispatcher("DadesOK.jsp").forward(req, resp); // nuevo código req.getRequestDispatcher("/servleturl").include(req, resp);
En vez de indicar la página JSP a la que rediriges, debes indicar la URL del servlet, que es la parte final de la URL que no incluye ni el nombre del host ni el nombre de tu aplicación. Si la URL entera es http://localhost/yourApp/pathToYourServlet
, la URL del servlet es /pathToYourServlet
y ese es el valor que deberías utilizar en el método getRequestDispatcher()
.
Después, para obtener el ArrayList
en el segundo servlet, también deberías hacer un cambio:
// código original ArrayList <ObservacioMeteorologica> p = (ArrayList<ObservacioMeteorologica>) getServletContext().getAttribute("observacio"); // nuevo código ArrayList <ObservacioMeteorologica> p = (ArrayList<ObservacioMeteorologica>) request.getAttribute("observacio");
Por último, ten en cuenta que los parámetros pasados en la petición tienen un límite de tamaño muy estricto. Así que si vas a pasar muchos datos, es mejor que guardes el parámetro en la sesión dentro del primer servlet y lo recuperes después en el segundo servlet. Y no olvides borrar el parámetro de la sesión después de obtenerlo para no penalizar el rendimiento en las siguientes peticiones.
@javiereguiluz
Gracias por responder, pero no puedo cambiar esta línea, ya que el ejercicio me pide que sea así:
req.getRequestDispatcher("DadesOK.jsp").forward(req, resp);
Además, después de que el servlet me valide los valores, tiene que mostrarlos en esa pagina de DadesOK.jsp
para confirmar que se han introducido más. Estoy intentando guardar elArrayList
dentro de un atributo de sesión para llamarlo desde el otro servlet, pero por ahora no lo he conseguido.
@tangooShiny
Utilizando la misma respuesta de StackOverflow que te mencionaba antes, estos son los cambios que habría que hacer.
Al guardar el ArrayLsit en la sesión
ArrayList<ObservacioMeteorologica> observacions = new ArrayList<>(); ObservacioMeteorologica obmet = new ObservacioMeteorologica(mun, fecha, TempMax, TempMin, Prec); observacions.add(obmet); req.getSession().setAttribute("observacio", observacions);
Al recuperar el ArrayList de la sesión
ArrayList <ObservacioMeteorologica> p = (ArrayList<ObservacioMeteorologica>) req.getSession().getAttribute("observacio"); req.getSession().removeAttribute("observacio");
@javiereguiluz
Muchísimas gracias, me has arreglado un problema con el que llevaba dos días en dos minutos ¡eres un crack!
@tangooShiny