Problema con llamar Arraylist desde otra página

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

#1

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.

#2

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.

#3

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");
#4

Muchísimas gracias, me has arreglado un problema con el que llevaba dos días en dos minutos ¡eres un crack!