2016-03-07 10 views
13

zu bekommen Könnte mir jemand erklären, was ist der Unterschied zwischen diesen Möglichkeiten, die ServletContext eines HttpServlet zu bekommen?Verschiedene Möglichkeiten, Servlet-Kontext

Gibt es einen Unterschied in der Leistung oder im Kontext selbst? Wenn ja, welches ist der beste Weg? Gibt es eine andere Möglichkeit, den Kontext abzurufen?

+2

Es gibt keinen Unterschied. – EJP

Antwort

18

Es gibt noch eins.

request.getServletContext(); 

ist es technisch kein Unterschied in der Leistung, nur die request.getSession() wird implizit das HTTP-Session-Objekt erstellen, wenn noch nicht erstellt. Wenn dies noch nicht geschehen ist, kann es einige Nanosekunden länger dauern, bis der Servletkontext über die Sitzung abgerufen wird, wenn die Sitzung noch nicht erstellt wurde.

Es gibt auch keinen Unterschied im zurückgegebenen Kontext. Diese Methoden sind nur für die Bequemlichkeit und dem Verfahren zu erhalten, der Kontext auf dem Kontext abhängt;.) Sie gerade sitzen in

Wenn Sie sich in einem Verfahren aufgerufen von Servlets service() (wie doGet(), doPost() sitzen, usw.), verwenden Sie dann einfach die geerbte Methode getServletContext(). Andere Wege fügen dem Quellcode nur unnötig mehr Zeichen hinzu.

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
    ServletContext context = getServletContext(); 
    // ... 
} 

Wenn Sie in Servlets init(ServletConfig) Methode sitzt, dann ist die geerbte getServletContext() noch nicht zur Verfügung, solange Sie nicht super.init(config) genannt haben. Sie müssten es von ServletConfig greifen.

@Override 
public void init(ServletConfig config) { 
    ServletContext context = config.getServletContext(); 
    // ... 
} 

Aber viel besser ist init() stattdessen außer Kraft zu setzen. In einem vernünftigen Servlet müssen Sie normalerweise niemals überschreiben.

@Override 
public void init() { 
    ServletContext context = getServletContext(); 
    // ... 
} 

Wenn Sie in einem Servlet sitzen nicht aber in z.B. eine filter, die die ererbte getServletContext() Methode fehlt und Sie nur ServletRequest zur Hand haben, dann könnten Sie es von dort greifen.

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    ServletContext context = request.getServletContext(); 
    // ... 
} 

Beachten Sie, dass dies seit Servlet 3.0 neu ist. Zuvor mussten Sie es aus der Sitzung abrufen.

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    ServletContext context = request.getSession().getServletContext(); 
    // ... 
} 

Dies ist jedoch nicht nett, wenn Sie sich Sorgen über unnötige Sitzungserstellung machen. Daher die Einführung von ServletRequest#getServletContext() — obwohl Sie auch einfach aus FilterConfig extrahieren können (hey, es gibt noch einen anderen Weg!).

private FilterConfig config; 

@Override 
public void init(FilterConfig config) { 
    this.config = config; 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    ServletContext context = config.getServletContext(); 
    // ... 
} 

Und dann gibt es HTTP session listeners, wo man auf u.a. hören konnte Sitzung zerstören. Es gibt keine andere Möglichkeit, den Servlet-Kontext als über HttpSession#getServletContext() zu erhalten.

Hier müssen Sie sich keine Gedanken über unnötige Sitzungserstellung machen, weil sie an diesem Punkt schon lange vorher erstellt wurde.Beachten Sie, dass es keine gibt, da es nicht unbedingt eine aktive HTTP-Anfrage während des Server-Session-Timeouts gibt.

Wie zuletzt gibt es auch ServletContext#getContext(), die die ServletContext einer anderen Webanwendung, die auf demselben Server bereitgestellt wird, zurückgibt (funktioniert nur, wenn der Server für den kontextübergreifenden Zugriff auf die Zielwebapp konfiguriert ist).

ServletContext otherContext = context.getContext("/otherContextPath"); 

Dies erfordert aber bereits die aktuelle ServletContext mit zu beginnen, für die Sie sollten jetzt schon wissen, welche Art und Weise es zu erhalten, zu verwenden.

Verwandte Themen