¿Cómo puedo compartir una variable u objeto entre dos o más Servlets?

Me gustaría saber si hay alguna forma de compartir una variable o un objeto entre dos o más Servlets, me refiero a alguna forma “estándar”. Supongo que esta no es una buena práctica, pero es una forma más fácil de construir un prototipo.

No sé si depende de las tecnologías utilizadas, pero usaré Tomcat 5.5


Quiero compartir un Vector de objetos de una clase simple (solo atributos públicos, cadenas, entradas, etc.). Mi intención es tener una información estática como en un DB, obviamente se perderá cuando el Tomcat se detenga. (es solo para Pruebas)

Creo que lo que estás buscando aquí es solicitud, sesión o datos de la aplicación.

En un servlet puede agregar un objeto como un atributo al objeto de solicitud, objeto de sesión o objeto de contexto de servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) { String shared = "shared"; request.setAttribute("sharedId", shared); // add to request request.getSession().setAttribute("sharedId", shared); // add to session this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context request.getRequestDispatcher("/URLofOtherServlet").forward(request, response); } 

Si lo coloca en el objeto de solicitud, estará disponible para el servlet al que se reenvía hasta que finalice la solicitud:

 request.getAttribute("sharedId"); 

Si lo coloca en la sesión, estará disponible para todos los servlets en el futuro, pero el valor estará vinculado al usuario:

 request.getSession().getAttribute("sharedId"); 

Hasta que la sesión caduque en función de la inactividad del usuario.

Es restablecido por usted:

 request.getSession().invalidate(); 

O un servlet lo quita del scope:

 request.getSession().removeAttribute("sharedId"); 

Si lo coloca en el contexto de servlet, estará disponible mientras se ejecuta la aplicación:

 this.getServletConfig().getServletContext().getAttribute("sharedId"); 

Hasta que lo elimines:

 this.getServletConfig().getServletContext().removeAttribute("sharedId"); 

Ponlo en uno de los 3 ámbitos diferentes.

solicitud – dura vida de la solicitud

sesión – dura la vida de la sesión del usuario

aplicación – dura hasta que se apaga la aplicación

Puede acceder a todos estos ámbitos a través de la variable HttpServletRequest que se pasa a los métodos que se extienden desde la clase HttpServlet

Depende del scope del uso previsto de los datos.

Si los datos solo se utilizan por usuario, como información de inicio de sesión de usuario, recuento de aciertos de página, etc. utilice el objeto de sesión (httpServletRequest.getSession (). Get / setAttribute (String [, Object]))

Si se trata de los mismos datos en varios usuarios (visitas totales a la página web, hilos de trabajo, etc.) use los atributos de ServletContext. servlet.getServletCongfig (). getServletContext (). get / setAttribute (String [, Object])). Esto solo funcionará dentro del mismo archivo war / aplicación web. Tenga en cuenta que estos datos tampoco se conservan en los reinicios.

Otra opción, compartir datos entre contextos …

compartir-datos-entre-servlets-en-tomcat

    

En myApp1:

  ServletContext sc = getServletContext(); sc.setAttribute("attribute", "value"); 

En myApp2:

  ServletContext sc = getServletContext("/myApp1"); String anwser = (String)sc.getAttribute("attribute"); 

¿No podría simplemente poner el objeto en la HttpSession y luego referirse a él por su nombre de atributo en cada uno de los servlets?

p.ej:

 getSession().setAttribute("thing", object); 

… luego en otro servlet:

 Object obj = getSession.getAttribute("thing"); 

Así es como hago esto con Jetty.

https://stackoverflow.com/a/46968645/1287091

Utiliza el contexto del servidor, donde se escribe un singleton durante el inicio de un servidor Jetty incrustado y se comparte entre todos los webapps durante la vida útil del servidor. También se puede usar para compartir objetos / datos entre webapps, suponiendo que solo haya un escritor en el contexto; de lo contrario, debe tener en cuenta la simultaneidad.