Question

Je voudrais savoir s’il existe un moyen de partager une variable ou un objet entre deux Servlets ou plus, je veux dire des expressions "standard". façon. 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 le test)

Était-ce utile?

La solution

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

Dans un 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'à l'expiration 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 de la servlet, il sera disponible pendant l'exécution de l'application:

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

Jusqu'à ce que vous le supprimiez:

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

Autres conseils

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

request - dure toute la vie de la requête

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 Classe HttpServlet

Dépend de l'étendue de l'utilisation prévue des données.

Si les données ne sont utilisées que par utilisateur, comme 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, de 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 lors des redémarrages.

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

partager des 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");

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?

exemple:

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

... puis dans une autre servlet:

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

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 / des 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top