web-dev-qa-db-fra.com

Comment partager une variable ou un objet entre deux servlets ou plus?

J'aimerais savoir s'il existe un moyen de partager une variable ou un objet entre deux Servlets ou plus, je veux dire un moyen "standard". Je suppose que ce n’est pas une bonne pratique mais un moyen plus simple de construire un prototype.

Je ne sais pas si cela dépend des technologies utilisées, mais j'utiliserai Tomcat 5.5.


Je souhaite partager un vecteur d'objets d'une classe simple (uniquement des attributs publics, des chaînes, des ints, etc.). Mon intention est d’avoir des données statiques comme dans une base de données, elles seront évidemment perdues lorsque le Tomcat sera arrêté. (c'est juste pour les tests)

40
David Ameller

Je pense que vous recherchez ici des données de demande, de session ou d'application.

Dans une servlet, vous pouvez ajouter un objet en tant qu'attribut à l'objet de requête, à l'objet de session ou à l'objet de contexte 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 vous le placez dans l'objet de requête, il sera disponible pour le servlet transféré jusqu'à la fin de la requête:

request.getAttribute("sharedId");

Si vous le mettez dans la session, il sera disponible pour tous les servlets à venir, mais la valeur sera liée à l'utilisateur:

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

Jusqu'à la fin de la session en fonction de l'inactivité de l'utilisateur.

Est réinitialisé par vous:

request.getSession().invalidate();

Ou un servlet le supprime de la portée:

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

Si vous le mettez dans le contexte du servlet, il sera disponible pendant l'exécution de l'application:

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

Jusqu'à ce que vous l'enleviez:

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

Mettez-le dans l'une des 3 différentes portées. 

request - dure la vie de la demande

session - dure la vie de la session de l'utilisateur

application - dure jusqu'à la fermeture de l'application

Vous pouvez accéder à toutes ces étendues via la variable HttpServletRequest transmise aux méthodes qui s’étendent de la classe HttpServlet

8
bpapa

Dépend de la portée de l'utilisation prévue des données.

Si les données sont uniquement utilisées utilisateur par utilisateur, telles que les informations de connexion de l'utilisateur, le nombre d'accès à la page, etc., utilisez l'objet de session (HttpServletRequest.getSession (). Get/setAttribute (String [ Object]))

S'il s'agit des mêmes données sur plusieurs utilisateurs (nombre total de visites de page Web, threads de travail, etc.), utilisez les attributs ServletContext. servlet.getServletCongfig (). getServletContext (). get/setAttribute (String [ Object])). Cela ne fonctionnera que dans le même fichier war/application Web. Notez que ces données ne sont pas persistantes non plus lors des redémarrages.

7
shemnon

Une autre option, partager des données entre les contextes ...

partage de données entre servlets sur Tomcat

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

Sur monApp1:

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

Sur monApp2:

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

Ne pourriez-vous pas simplement placer l'objet dans la session HttpSession et y faire ensuite référence par son nom d'attribut dans chacune des servlets?

par exemple:

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

... puis dans une autre servlet:

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

Voici comment je fais cela avec Jetty.

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

Utilise le contexte du serveur, dans lequel un singleton est écrit lors du démarrage d'un serveur Jetty intégré et partagé entre toutes les applications Web pendant toute la durée de vie du serveur. Peut également être utilisé pour partager des objets/données entre des applications Web en supposant qu'il n'y a qu'un seul écrivain dans le contexte - sinon, vous devez être attentif à la concurrence.

0
Reed Sandberg