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.
Es gibt keinen Unterschied. – EJP