ServletContext.getAttribute und contextDestroyed

Allgemeine Themen rund um dem Appl.-Server GlassFish

Moderator: wegus

Antworten
wolfgke

ServletContext.getAttribute und contextDestroyed

Beitrag von wolfgke » 15.09.2008, 13:25

Hallo,
ich habe mittels des Assistenten von Netbeans eine ganz einfache Webanwendung für Glassfish 2 erstellt (das, was Netbeans automatisch macht+einen Listener) und direkt über Netbeans 6.1 ausgeführt.

Der Listener sieht folgendermaßen aus:

Code: Alles auswählen


import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletContextAttributeEvent;
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Web application lifecycle listener.
 * @author Wolfgang
 */

public class NewServletListener implements ServletContextListener, ServletContextAttributeListener {

    public void contextInitialized(ServletContextEvent e) {
        Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Context "+
                e.getServletContext()+" initialized");
        e.getServletContext().setAttribute("foo", "bar");
    }

    public void contextDestroyed(ServletContextEvent e) {
        Logger.getLogger(this.getClass().getName()).log(Level.INFO, 
                e.getServletContext().toString()+" destroyed. Attribute value of 'foo' is "+e.getServletContext().getAttribute("foo"));
    }

    public void attributeAdded(ServletContextAttributeEvent e) {
        Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Added attribute "+
                e.getName()+" with value "+e.getValue());
    }

    public void attributeRemoved(ServletContextAttributeEvent e) {
         Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Removed attribute "+
                e.getName()+" with value "+e.getValue());
    }

    public void attributeReplaced(ServletContextAttributeEvent e) {
         Logger.getLogger(this.getClass().getName()).log(Level.INFO, "Replaced attribute "+
                e.getName()+" with value "+e.getValue());
    }
}
Wenn man diese startet und stoppt, wäre zu erwarten, dass wenn contextDestroyed aufgerufen wird, das Attribut "foo" noch nicht null ist und es erst dannach gelöscht wird.

Ist aber nicht der Fall. Vielmehr wird es bereits *vor* dem Aufruf von contextDestroyed gelöscht:

Vielmehr sieht die Ausgabe folgendermaßen aus:

Hochfahren:
[...]
Enabling Grizzly ARP Comet support.
WEB0712: Sun-Java-System/Application-Server HTTP/1.1 wird gestartet auf 8080
WEB0712: Sun-Java-System/Application-Server HTTP/1.1 wird gestartet auf 8181
WEB0712: Sun-Java-System/Application-Server HTTP/1.1 wird gestartet auf 4848
Context org.apache.catalina.core.ApplicationContextFacade@e609c9 initialized
Added attribute foo with value bar
Added attribute com.sun.appserv.jsp.resource.injector with value com.sun.enterprise.web.jsp.ResourceInjectorImpl@48bc3d
Added attribute com.sun.jsp.taglibraryCache with value {}
Added attribute com.sun.jsp.tagFileJarUrlsCache with value {}
SMGT0007: Selbstverwaltungsregeldienst ist aktiviert
Start des Anwendungsservers abgeschlossen.
Removed attribute com.sun.jsp.tagFileJarUrlsCache with value {}
Removed attribute com.sun.jsp.taglibraryCache with value {}
Removed attribute com.sun.appserv.jsp.resource.injector with value com.sun.enterprise.web.jsp.ResourceInjectorImpl@48bc3d
Removed attribute foo with value bar
Removed attribute com.sun.jsp.propertyGroups with value []
Removed attribute com.sun.faces.useMyFaces with value false
Removed attribute com.sun.servlet.webxml.version with value 2.5
org.apache.catalina.core.ApplicationContextFacade@e609c9 destroyed. Attribute value of 'foo' is null
deployed with moduleid = WebApplication2
Context org.apache.catalina.core.ApplicationContextFacade@1655fb9 initialized
Added attribute foo with value bar
Added attribute com.sun.appserv.jsp.resource.injector with value com.sun.enterprise.web.jsp.ResourceInjectorImpl@798797
Added attribute com.sun.jsp.taglibraryCache with value {}
Added attribute com.sun.jsp.tagFileJarUrlsCache with value {}
Added attribute jspx.1st.request with value true
Runterfahren:
WEB0303: Sun-Java-System/Application-Server wird gestoppt.
WEB0713: Sun-Java-System/Application-Server HTTP/1.1 wird gestoppt auf 8080
WEB0713: Sun-Java-System/Application-Server HTTP/1.1 wird gestoppt auf 8181
WEB0713: Sun-Java-System/Application-Server HTTP/1.1 wird gestoppt auf 4848
Removed attribute com.sun.jsp.tldUriToLocationMap with value {}
Removed attribute com.sun.jsp.tagFileJarUrlsCache with value {}
Removed attribute jspx.1st.request with value true
Removed attribute foo with value bar
Removed attribute com.sun.appserv.jsp.resource.injector with value com.sun.enterprise.web.jsp.ResourceInjectorImpl@798797
Removed attribute com.sun.jsp.taglibraryCache with value {}
Removed attribute com.sun.jsp.propertyGroups with value []
Removed attribute com.sun.faces.useMyFaces with value false
Removed attribute com.sun.servlet.webxml.version with value 2.5
org.apache.catalina.core.ApplicationContextFacade@1655fb9 destroyed. Attribute value of 'foo' is null
[...]
Ich habe mal die Meldung, dass Comet aktiviert ist, dringelassen (dies habe ich manuell gemacht, da ich es brauchen werde).

Wieso wird also das Attribut "foo" VOR dem Aufruf dem contextDestroyed gelöscht, obwohl fast alle Seiten im Netz etwas gegenteiliges erzählen?[/quote]

Antworten