Comment puis-je partager une variable ou un objet entre deux Servlets ou plus?
Je voudrais savoir s'il existe un moyen de partager une variable ou un objet entre deux Servlets ou plus, je veux dire une manière "standard". Je suppose que ce n'est pas une bonne pratique mais un moyen plus facile de construire un prototype.
Je ne sais pas si cela dépend des technologies utilisées, mais je vais utiliser Tomcat 5.5
Je veux partager un vecteur d'objets d'une classe simple (juste 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, évidemment sera perdu lorsque le Tomcat est arrêté. (c'est juste pour tester)
6 réponses
Je pense que ce que vous cherchez ici, ce sont 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 mettez dans l'objet request, il sera disponible pour le servlet qui est transféré jusqu'à ce que la requête soit terminée:
request.getAttribute("sharedId");
Si vous le mettez dans la session, il sera disponible pour toutes les servlets à l'avenir, mais la valeur sera liée à la 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 servlet, il sera disponible pendant que l'application est en cours d'exécution:
this.getServletConfig().getServletContext().getAttribute("sharedId");
Jusqu'à ce que vous le supprimiez:
this.getServletConfig().getServletContext().removeAttribute("sharedId");
Mettez - le dans l'une des 3 portées différentes.
Demande-durée de vie de la demande
Séance - durée de vie de la session de l'utilisateur
Application-dure jusqu'à ce que l'application soit arrêtée
Vous pouvez accéder à toutes ces étendues via la variable HttpServletRequest transmise aux méthodes qui s'étendent à partir de la classe HttpServlet
Dépend de la portée 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 de pages touchées, etc. utiliser l'objet session (httpServletRequest.getSession ().get / setAttribute(chaîne [,objet]))
S'il s'agit des mêmes données sur plusieurs utilisateurs (nombre total de visites de pages web, threads de travail, etc.), utilisez les attributs ServletContext. servlet.getServletCongfig ().getServletContext ().get / setAttribute (chaîne [, objet])). Cela ne fonctionnera dans le même fichier war/web application. Notez que ces données ne sont pas non plus conservées 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 myApp1:
ServletContext sc = getServletContext();
sc.setAttribute("attribute", "value");
Sur myApp2:
ServletContext sc = getServletContext("/myApp1");
String anwser = (String)sc.getAttribute("attribute");
Ne pourriez-vous pas simplement mettre l'objet dans HttpSession et ensuite y faire référence par son nom d'attribut dans chacune des servlets?
Par exemple:
getSession().setAttribute("thing", object);
...puis dans un 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 pendant le démarrage d'un serveur Jetty intégré et partagé entre toutes les webapps pendant la durée de vie du serveur. Peut également être utilisé pour partager des objets / données entre webapps en supposant qu'il n'y ait qu'un seul écrivain dans le contexte - sinon vous devez être conscient de la concurrence.