views:

1198

answers:

4

I would like to know if there is some way to share a variable or an object between two or more Servlets, I mean some "standard" way. I suppose that this is not a good practice but is a easier way to build a prototype.

I don't know if it depends on the technologies used, but I'll use Tomcat 5.5

Thanks.


I want to share a Vector of objects of a simple class (just public attributes, strings, ints, etc). My intention is to have a static data like in a DB, obviously it will be lost when the Tomcat is stopped. (is Just for Testing)

+1  A: 

Couldn't you just put the object in the HttpSession and then refer to it by its attribute name in each of the servlets?

e.g:

getSession().setAttribute("thing", object);

...then in another servlet:

Object obj = getSession.getAttribute("thing");
yalestar
+4  A: 

Depends on the scope of the intended use of the data.

If the data is only used on a per-user basis, like user login info, page hit count, etc. use the session object (httpServletRequest.getSession().get/setAttribute(String [,Object]))

If it is the same data across multiple users (total web page hits, worker threads, etc) use the ServletContext attributes. servlet.getServletCongfig().getServletContext().get/setAttribute(String [,Object])). This will only work within the same war file/web applicaiton. Note that this data is not persisted across restarts either.

shemnon
Using the ServletContext can easily get you into trouble if you're not careful. For instance, you couldn't use it to implement a page hit count in the naive way: get the current page hit count from the context, increment it, and set the value to the context. Multi-threading kills that solution.
JavadocMD
Meta critque - the question is asking for functionality a backing data store should be handling via transactions anyway. Complaints about ACID should result in using an ACID data service. ServletContext and Session violate all of ACID in some way.
shemnon
+10  A: 

I think what you're looking for here is request, session or application data.

In a servlet you can add an object as an attribute to the request object, session object or servlet context object:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

If you put it in the request object it will be available to the servlet that is forwarded to until the request is finished:

request.getAttribute("sharedId");

If you put it in the session it will be available to all the servlets going forward but the value will be tied to the user:

request.getSession().getAttribute("sharedId");

Until the session expires based on inactivity from the user.

Is reset by you:

request.getSession().invalidate();

Or one servlet removes it from scope:

request.getSession().removeAttribute("sharedId");

If you put it in the servlet context it will be available while the application is running:

this.getServletConfig().getServletContext().getAttribute("sharedId");

Until you remove it:

this.getServletConfig().getServletContext().removeAttribute("sharedId");
William
Can you please extend your answer for ServletContext ?
David Ameller
+1  A: 

Put it in one of the 3 different scopes.

request - lasts life of request

session - lasts life of user's session

application - lasts until applciation is shut down

You can access all of these scopes via the HttpServletRequest variable that is passed in to the methods that extend from the HttpServlet class

bpapa