2008-09-23 8 views
39

Ich würde gerne wissen, ob es eine Möglichkeit gibt, eine Variable oder ein Objekt zwischen zwei oder mehr Servlets zu teilen, ich meine einen "Standard" Weg. Ich nehme an, dass dies keine gute Übung ist, aber ein einfacherer Weg ist, einen Prototyp zu bauen.Wie kann ich eine Variable oder ein Objekt zwischen zwei oder mehr Servlets teilen?

Ich weiß nicht, ob es auf den Technologien verwendet wird, hängt, aber ich werde verwenden Tomcat 5,5


Ich möchte ein Foto von Objekten einer einfachen Klasse teilen (nur öffentliche Attribute, Strings, Ints usw.). Ich beabsichtige, statische Daten wie in einer DB zu haben, diese gehen natürlich verloren, wenn der Tomcat gestoppt wird. (es ist nur für Testing)

+0

Es hängt weitgehend davon ab, welche Art von Objekt/Variable es ist. Gehört die Variable zu einer Klasse und möchten Sie nur darauf zugreifen? Ist es eine Konstante? Ein Beispiel wäre nett. – Swati

+0

Ich wünsche das hilft :) –

Antwort

74

Ich denke, was Sie hier suchen, ist Anfrage, Sitzung oder Anwendungsdaten.

In einem Servlet Sie ein Objekt als Attribut auf das Request-Objekt hinzufügen können, Session-Objekt oder Servletkontext Objekt:

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); 
} 

Wenn Sie es in dem Request-Objekt gesetzt wird es an das Servlet verfügbar sein, wird die Anfrage weitergeleitet, bis beendet:

request.getAttribute("sharedId"); 

Wenn Sie es in der Sitzung gestellt wird es alle Servlets für die Zukunft verfügbar sein, aber der Wert wird an den Benutzer gebunden werden:

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

Bis die Sitzung basierend auf Inaktivität vom Benutzer abläuft.

wird von Ihnen zurück:

request.getSession().invalidate(); 

Oder ein Servlet aus Anwendungsbereich entfernt:

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

Wenn Sie es im Servlet Kontext gestellt wird es verfügbar sein, während die Anwendung ausgeführt wird:

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

Bis Sie es entfernen:

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

Können Sie bitte Ihre Antwort für ServletContext erweitern? –

+1

Oder 'getServletContext()' anstelle von 'this.getServletConfig(). GetServletContext()' ... –

+0

@William Wie kann ich etwas anderes als eine Zeichenfolge f. ein Objekt aus einer Klasse, die ich selbst erstellt habe? – Stanko

1

Konnte man nicht einfach das Objekt in die HttpSession setzen und sich dann auf seinen Attributnamen in jedem der Servlets beziehen?

z:

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

... dann in einem anderen Servlet:

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

muss Objekt serialisierbar sein, damit dies funktioniert? – Jus12

7

Abhängig vom Umfang der beabsichtigten Verwendung der Daten.

Wenn die Daten nur für einzelne Benutzer verwendet werden, wie Benutzeranmeldeinformationen, Seitenanzahl usw., verwenden Sie das Sitzungsobjekt (httpServletRequest.getSession(). Get/setAttribute (String [, Objekt]))

Wenn es sich um die gleichen Daten über mehrere Benutzer (insgesamt Webseitentreffer, Worker-Threads usw.) handelt, verwenden Sie die ServletContext-Attribute. servlet.getServletCongfig(). getServletContext(). get/setAttribute (String [, Objekt])). Dies funktioniert nur innerhalb der gleichen War-Datei/Web-Anwendung. Beachten Sie, dass diese Daten auch bei Neustarts nicht beibehalten werden.

+0

Die Verwendung des ServletContext kann Sie leicht in Schwierigkeiten bringen, wenn Sie nicht vorsichtig sind. Sie könnten es beispielsweise nicht dazu verwenden, eine Anzahl von Seitenaufrufen auf naive Art zu implementieren: Holen Sie die aktuelle Anzahl von Seitenaufrufen aus dem Kontext, erhöhen Sie sie und setzen Sie den Wert auf den Kontext. Multi-Threading tötet diese Lösung. – JavadocMD

+0

Meta-Kritik - die Frage ist die Frage nach der Funktionalität, die ein Backup-Datenspeicher ohnehin über Transaktionen verarbeiten sollte. Beschwerden über ACID sollten zur Verwendung eines ACID-Datendienstes führen. ServletContext und Session verletzen in irgendeiner Weise ACID. – shemnon

8

Legen Sie es in einen der 3 verschiedenen Bereiche.

Anfrage - dauert das Leben der Anfrage

Sitzung - dauert das Leben der Sitzung des Benutzers

Anwendung - dauert bis applciation heruntergefahren wird

Sie können alle diese Bereiche über die HttpServletRequest Variable zuzugreifen, ist übergeben an die Methoden, die von der HttpServlet class

2

reichen Eine andere Option, Daten zwischen Kontexten ...

teilen 10

share-data-between-servlets-on-tomcat

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

Auf Myapp1:

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

Auf myApp2:

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

Hier ist, wie ich das mit Jetty.

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

Verwendet den Serverkontext, in dem ein Singleton während des Starts eines eingebetteten Jetty-Server geschrieben und unter allen Webapps für das Leben des Servers geteilt. Kann auch verwendet werden, um Objekte/Daten zwischen Webapps zu teilen, unter der Annahme, dass es nur einen Schreiber für den Kontext gibt - andernfalls müssen Sie auf Nebenläufigkeit achten.

Verwandte Themen