java - recibir - ¿Cómo puedo compartir una variable u objeto entre dos o más Servlets?
request.setattribute jsp (6)
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)
¿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://.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.
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 alcance:
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");
Depende del alcance 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 ...
share-data-between-servlets-on-tomcat
<Context path="/myApp1" docBase="myApp1" crossContext="true"/>
<Context path="/myApp2" docBase="myApp2" crossContext="true"/>
En myApp1:
ServletContext sc = getServletContext();
sc.setAttribute("attribute", "value");
En myApp2:
ServletContext sc = getServletContext("/myApp1");
String anwser = (String)sc.getAttribute("attribute");
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