views:

1515

answers:

2

What (if any) is the difference between storing a variable in the ServletContext and just having it as a public static member of one of the classes?

Instead of writing:

// simplified (!)
int counter = (Integer)getServletContext().getAttribute("counter");
counter++;
this.getServletContext().setAttribute("counter", counter);

Why not just have:

// in class MyServlet
public static int counter = 0;

// in a method somewhere
MyServlet.counter++;

(Ignore concurrency issues, please, this is just a dumb example)

From what I can tell, these two options behave the same way under Tomcat. Is there something better about using the first option?

+5  A: 

Well they're not quite the same; servlet-context-scope is private to the webapp, whereas static scope is private to the classloader. Depending on your container and how it's configured, these may or may not be the same. When thinking in terms of webapps and JavaEE, using a context-coped field is going to be more reliably portable. Also, context-scoped attributes are easier to access from JSPs, i.e. you don't need scriptlets to get to them.

skaffman
+4  A: 

The web container knows about your servlet context, but not about your static variables which as skaffmans says are private to your classloader.

Anything that cause two different requests to be served by an application instance in a different classloader (this could be server restarting, web application redeployment, or multi-node servers) will case your logic to break. The servlet context will survive these things as the web container knows about it and can serialize it or have a common repository.

Thorbjørn Ravn Andersen