Pregunta

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

No sé si depende de la tecnología usada, pero voy a usar Tomcat 5.5


Quiero compartir un Vector de objetos de una clase simple (sólo público atributos, cadenas, enteros, etc).Mi intención es tener un dato estático como en una DB, obviamente se pierde cuando el Tomcat se detiene.(es sólo para Pruebas)

¿Fue útil?

Solución

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

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

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 la pones en el objeto de solicitud que estará disponible para el servlet que se remite hasta que finalice la solicitud:

request.getAttribute("sharedId");

Si la pones en la sesión a la que estará disponible para todos los servlets de ir hacia delante, pero el valor será atado para el usuario:

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

Hasta que finaliza la sesión basado en la inactividad del usuario.

Se restablece por usted:

request.getSession().invalidate();

O un servlet quita de alcance:

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

Si lo pones en el contexto de servlet estará disponible mientras la aplicación se está ejecutando:

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

Hasta que usted la elimine:

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

Otros consejos

Lo puso en uno de los 3 ámbitos diferentes.

solicitud - dura vida de solicitud

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

la aplicación dura hasta applciation se apaga

Usted puede tener acceso a todos estos ámbitos a través de la HttpServletRequest variable que se pasa a los métodos que se extienden desde la La clase HttpServlet

Depende del alcance de la intención de uso de los datos.

Si los datos se utilizan únicamente en función de cada usuario, como información de inicio de sesión de usuario, página recuento de visitas, etc.utilice el objeto de sesión (httpServletRequest.getSession().get/setAttribute(String [Objeto]))

Si es el mismo de los datos a través de múltiples usuarios (total de visitas a la página web, los subprocesos de trabajo, etc) utilizar el ServletContext atributos.servlet.getServletCongfig().getServletContext().get/setAttribute(String [Objeto])).Esto sólo funcionará dentro del mismo archivo war/web de la aplicación.Tenga en cuenta que estos datos no se conserva a través de los reinicios, ya sea.

Otra opción, compartir los datos betwheen contextos...

compartir datos entre-servlets-en-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");

No podría usted acaba de poner el objeto en el HttpSession y, a continuación, se refieren a él por su nombre de atributo en cada uno de los servlets?

e.g:

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

...luego en otro servlet:

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

He aquí cómo puedo hacer esto con Embarcadero.

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

Utiliza el contexto del servidor, donde un singleton es escrito durante el inicio de una incrustado Jetty servidor y compartida entre todos los webapps para la vida del servidor.También puede ser usado para compartir objetos/datos entre webapps suponiendo que no es sólo un escritor para el contexto de lo contrario, usted debe ser consciente de la concurrencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top