variables classpath - Java-Systemeigenschaften und Umgebungsvariablen





set provide (3)


Ich denke, der Unterschied zwischen den beiden läuft darauf hinaus. Auf Systemumgebungsvariablen kann von jedem Prozess zugegriffen werden, und Java-Systemeigenschaften sind nur für den Prozess verfügbar, dem sie hinzugefügt werden.

Wie auch böhmisch angegeben, werden env-Variablen im Betriebssystem gesetzt (sie können jedoch über Java gesetzt werden) und Systemeigenschaften werden als Befehlszeilenoptionen übergeben oder über setProperty() .

Was ist der Unterschied zwischen Systemeigenschaften System.getProperties() und Umgebungsvariablen System.getenv() in einer JVM?







ServletContext

Wenn der Servlet-Container (wie Apache Tomcat ) gestartet wird, werden alle Webanwendungen bereitgestellt und geladen. Wenn eine Webanwendung geladen wird, erstellt der Servlet-Container den ServletContext einmal und ServletContext ihn im Speicher des Servers. Die web.xml Datei der Web-App wird analysiert, und jedes gefundene <servlet> , <filter> und <listener> (oder jede mit @WebServlet , @WebFilter bzw. @WebListener annotierte Klasse) wird einmal instanziiert und im Speicher des Servers gespeichert Gut. Für jeden instanziierten Filter wird seine Methode init() mit einer neuen FilterConfig .

Wenn der Servlet-Container heruntergefahren wird, werden alle Webanwendungen ServletContext , die Methode destroy() aller initialisierten Servlets und Filter ServletContext und alle ServletContext , ServletContext , ServletContext und Listener Instanzen werden verworfen.

Wenn ein Servlet einen <servlet><load-on-startup> oder @WebServlet(loadOnStartup) Wert größer als 0 , wird seine init() Methode auch beim Start mit einer neuen ServletConfig . Diese Servlets werden in der gleichen Reihenfolge initialisiert, die durch diesen Wert angegeben wird (1 -> 1st, 2 -> 2nd usw.). Wenn für mehrere Servlets derselbe Wert angegeben wird, wird jedes dieser Servlets in der Reihenfolge geladen, in der sie in der @WebServlet oder @WebServlet Klassenladefunktion @WebServlet . Wenn der Wert "load-on-startup" nicht vorhanden ist, wird die init() -Methode aufgerufen, sobald die HTTP-Anforderung das erste Mal auf dieses Servlet trifft.

HttpServletRequest und HttpServletResponse

Der Servlet-Container ist an einen Web-Server angeschlossen, der HTTP-Anfragen an einer bestimmten Port-Nummer abhört (Port 8080 wird normalerweise während der Entwicklung und Port 80 in der Produktion verwendet). Wenn ein Client (Benutzer mit einem Webbrowser) eine HTTP-Anforderung sendet, erstellt der Servlet-Container neue HttpServletRequest und HttpServletResponse Objekte und übergibt diese an eine definierte Filter und schließlich an die Servlet Instanz.

Bei filters wird die doFilter() -Methode aufgerufen. Wenn der Code chain.doFilter(request, response) aufruft, werden Anfrage und Antwort an den nächsten Filter weitergeleitet oder das Servlet angetippt, wenn keine weiteren Filter vorhanden sind.

Bei servlets wird die Methode service() aufgerufen. Diese Methode legt standardmäßig fest, welche der doXxx() -Methoden basierend auf request.getMethod() . Wenn die bestimmte Methode im Servlet nicht vorhanden ist, wird in der Antwort ein HTTP 405-Fehler zurückgegeben.

Das Anforderungsobjekt bietet Zugriff auf alle Informationen zur HTTP-Anforderung, z. B. die Header und den Hauptteil. Das Antwortobjekt bietet die Möglichkeit, die HTTP-Antwort so zu steuern und zu senden, wie Sie möchten, indem Sie beispielsweise die Header und den Body festlegen (normalerweise mit generiertem HTML-Inhalt aus einer JSP-Datei). Wenn die HTTP-Antwort festgeschrieben und abgeschlossen ist, werden sowohl das Anfrage- als auch das Antwortobjekt wiederverwendet und zur Wiederverwendung bereitgestellt.

HttpSitzung

Wenn ein Client die Webanwendung zum ersten Mal besucht und / oder die HttpSession zum ersten Mal über request.getSession() abgerufen wird, erstellt der Servlet-Container ein neues HttpSession Objekt und generiert eine lange und eindeutige ID (die Sie nach session.getId() HttpSession können) session.getId() ) und speichert sie im Speicher des Servers. Der Servlet-Container legt auch einen Cookie im Set-Cookie Header der HTTP-Antwort mit JSESSIONID als Name und der eindeutigen Sitzungs-ID als Wert fest.

Gemäß der HTTP-Cookie-Spezifikation (ein Vertrag, den ein anständiger Web-Browser und Web-Server einhalten muss), muss der Client (der Web-Browser) dieses Cookie in nachfolgenden Anfragen im Cookie Header so lange zurücksenden, wie der Cookie ist gültig (dh die eindeutige ID muss sich auf eine nicht abgelaufene Sitzung beziehen und die Domäne und der Pfad sind korrekt). Über den integrierten HTTP-Traffic-Monitor Ihres Browsers können Sie überprüfen, ob der Cookie gültig ist (drücken Sie F12 in Chrome / Firefox 23+ / IE9 + und überprüfen Sie die Registerkarte Netzwerk / Netzwerk ). Der Servlet-Container prüft den Cookie Header jeder eingehenden HTTP-Anforderung auf das Vorhandensein des Cookies mit dem Namen JSESSIONID und verwendet seinen Wert (die Sitzungs-ID), um die zugehörige HttpSession aus dem Speicher des Servers HttpSession .

Die HttpSession bleibt aktiv, bis sie für mehr als den in <session-timeout> angegebenen <session-timeout> , eine Einstellung in web.xml . Der Zeitüberschreitungswert beträgt standardmäßig 30 Minuten. Wenn der Client die Webanwendung nicht länger als die angegebene Zeit besucht, löscht der Servlet-Container die Sitzung. Jede weitere Anfrage, auch mit dem angegebenen Cookie, hat keinen Zugriff mehr auf die gleiche Sitzung; Der Servlet-Container erstellt eine neue Sitzung.

Auf der Clientseite bleibt der Sitzungscookie so lange aktiv, wie die Browserinstanz ausgeführt wird. Wenn der Client die Browser-Instanz (alle Registerkarten / Fenster) schließt, wird die Sitzung auf der Client-Seite gelöscht. In einer neuen Browser-Instanz wäre der mit der Sitzung verknüpfte Cookie nicht vorhanden und würde daher nicht mehr gesendet. Dies führt dazu, dass eine völlig neue HTTPSession erstellt wird, wobei ein vollständig neuer Sitzungscookie verwendet wird.

In einer Nussschale

  • Der ServletContext lebt so lange, wie die Web-App lebt. Es wird unter allen Anfragen in allen Sitzungen geteilt.
  • Die HttpSession so lange bestehen, wie der Client mit der Webanwendung mit derselben Browserinstanz HttpSession und die Sitzung auf der Serverseite nicht abgelaufen ist. Es wird unter allen Anfragen in derselben Sitzung geteilt.
  • Die HttpServletRequest und HttpServletResponse ab dem Zeitpunkt ausgeführt, an dem das Servlet eine HTTP-Anforderung vom Client empfängt, bis die vollständige Antwort (die Webseite) angekommen ist. Es wird nicht an anderer Stelle geteilt.
  • Alle Servlet , Filter und Listener Instanzen werden so lange ausgeführt, wie die Web-App vorhanden ist. Sie werden unter allen Anfragen in allen Sitzungen geteilt.
  • Jedes attribute , das in ServletContext , HttpServletRequest und HttpSession definiert ServletContext , HttpServletRequest so lange bestehen, wie das betreffende Objekt lebt. Das Objekt selbst stellt den "Geltungsbereich" in Bean-Management-Frameworks wie JSF, CDI, Spring usw. dar. Diese Frameworks speichern ihre Scoped-Beans als ein attribute ihres am besten passenden Bereichs.

Fadensicherheit

Das heißt, Ihr Hauptanliegen ist möglicherweise Thread-Sicherheit . Sie sollten jetzt wissen, dass Servlets und Filter unter allen Anfragen geteilt werden. Das ist das Schöne an Java, es ist Multithread und verschiedene Threads (lesen: HTTP-Requests) können dieselbe Instanz benutzen. Es wäre sonst zu teuer, sie für jede einzelne Anfrage neu zu erstellen, init() und zu destroy() .

Sie sollten auch wissen, dass Sie keine Anfrage- oder Sitzungsdaten als Instanzvariable eines Servlets oder Filters zuweisen sollten. Es wird unter allen anderen Anfragen in anderen Sitzungen geteilt. Das ist nicht threadsicher! Das folgende Beispiel veranschaulicht dies:

public class ExampleServlet extends HttpServlet {

    private Object thisIsNOTThreadSafe;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Object thisIsThreadSafe;

        thisIsNOTThreadSafe = request.getParameter("foo"); // BAD!! Shared among all requests!
        thisIsThreadSafe = request.getParameter("foo"); // OK, this is thread safe.
    } 
}

Siehe auch:





java variables properties system environment