Pinghua Young wrote:
> Craig, I think you probably misunderstood my question. Our application
> has a requirement to clear some data stored in a user's session when
> an external event occurs. Or more precisely, here's what happens:
>
> #1. An external event occurs (eg weather goes bad);
> #2. It notifies one servlet housed in our web servlet application,
> and sends along a userID;
> #3. This servlet of ours then has to find out if this user is login
> to our web server or not;
> #4. If yes, then clear the data from his session, so that new data
> can be retrieved from database;
>
> With the current servlet API, I just can't seem to be able to do
> what I want without some sort of problems.
>
There are several ways to approach a problem like this that don't require you to scan
through the list of
active sessions (and that's good, because the mechanism to do so got removed in 2.1).
Here's one way that is
consistent with the usual JavaBeans design patterns (see the JavaBeans specification
for more information):
* The servlet that receives notifications about weather
changes is, or is associated with, an object that allows
you to register interest in hearing about events. Using
the usual JavaBeans naming patterns, you might have
methods like addWeatherChangeListener and
removeWeatherChangeListener.
* When a user logs on, one of the things you do
is store a new instance of a particular bean
(let's call it LoginBean) in the user's session.
* This LoginBean implements HttpSessionBindingListener,
so it's valueBound() method gets called when this object
is added to a user session. One of the things that you get
in the event argument is a reference to the session you just
got added to -- save this in a local instance variable inside
the LoginBean.
* When the valueBound() method is called, this object should
also register itself as an event listener for WeatherChangeEvent
events. This is done by calling the addWeatherChangeListener
method of the registration object described earlier.
* Whenever your servlet receives a weather change notification,
it constructs a WeatherChangeEvent and sends it along to
all the interested listeners (i.e. the LoginBean instances that
have registered themselves). Each receiver of the event can
look at the other properties of the event (such as the username)
to decide whether or not it is interested. Note that each receiver
can apply their own rules to decide what events are relevant --
you no longer have to centralize this decision as you would in a
model where the event sender was iterating through the user
sessions.
* If the receiving LoginBean is interested, it can access the session
that it's bound to (because we saved a reference to it in the
valueBound method), and it can therefore modify the user objects
stored in that session (or even invalidate it, if the event was
"Floyd is coming -- log off quick and get under cover!" :-).
* The valueUnbound() method of the LoginBean will be called when
the user logs off, or when the session is invalidated (such as on a
timeout). At that time, it should deregister itself as a listener for
the weather change events, because it no longer cares.
You will see this approach a lot in Model-View-Controller (MVC) based design patterns
and architectures. It is
particularly evident in GUI toolkits like AWT and Swing, but the event listener
concept is quite useful
generally in architectures where external stimuli causes things to happen
asynchronously. The design patterns
outlined in the JavaBeans Specification are very helpful in building classes that
implement this style.
Craig McClanahan
___________________________________________________________________________
To unsubscribe, send email to [EMAIL PROTECTED] and include in the body
of the message "signoff SERVLET-INTEREST".
Archives: http://archives.java.sun.com/archives/servlet-interest.html
Resources: http://java.sun.com/products/servlet/external-resources.html
LISTSERV Help: http://www.lsoft.com/manuals/user/user.html