You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tapestry.apache.org by Laurent Rouvet <la...@roovay.com> on 2005/01/13 19:14:23 UTC
valueUnbound() ?
Does someone can confirm if it works or not with Tomcat 5.x ?
Nikla Ratinen wrote:
> Hi,
>
> Overriding valueUnbound() works in Jetty but not in
> Tomcat (4.1.27). The reason is that Tomcat calls valueUnbound()
> of the old listener each time the new listener is set to the HTTP
> session. Tapestry engine gets stored to session after (almost) every
> request even if its already there, therefore resulting in valueUnbound()
> called at the end of each request. Jetty is wise enough to check
> for parameter equality and calls valueUnbound() on old parameter
> only if the new and old values are not equal.
>
> If anybody knows a better way I would like to hear it,
> but at least this works:
>
> ----------- MyEngine.java ---------
>
> public class MyEngine extends BaseEngine
> {
> public static String SESSION_LISTENER = "session_listener";
>
> public boolean service(RequestContext context)
> throws ServletException, IOException
> {
> HttpSession session = context.getSession();
> if (session != null &&
> session.getAttribute(SESSION_LISTENER) == null)
> {
> session.setAttribute(SESSION_LISTENER,
> new SessionEndListener(this));
> }
> return super.service(context);
> }
> }
>
> --------- SessionEndListener.java ------------
>
> public class SessionEndListener
> implements HttpSessionBindingListener,
> Serializable
> {
> private IEngine engine;
> public SessionEndListener(IEngine engine)
> {
> this.engine = engine;
> }
>
> public void valueBound(HttpSessionBindingEvent hsbe)
> {
> }
>
> public void valueUnbound(HttpSessionBindingEvent hsbe)
> {
> if (engine != null)
> {
> // Cleanup code here
> }
> engine = null;
> }
> }
>
> -----------------------------------------------
>
>
> Rgds,
> -- Nikla
>
>
> On Wed, 2004-06-16 at 00:49, Hensley, Richard wrote:
>
>>I need to detect an invalidated session from a Tapestry application. The
>>purpose is to detect when the container times a session out so clean up work
>>can be done.
>>
>>I noticed that AbstractEngine implements the HttpSessionBindingListenter.
>>Can I simply extend BaseEngine override valueUnbound?
>>
>>That method would be implemented something like
>>
>> public void valueUnbound(HttpSessionBindingEvent arg0) {
>> super.valueUnbound(arg0);
>> Visit visit = (Visit)getVisit();
>> if (visit != null) {
>> visit.cleanup();
>> }
>> }
>>
>>I think this would mean that anytime the container discards the session, or
>>the session is invalidated by Tapestry, this method will get called.
>>
>>Is this the best way to detect this situation?
>>
>>According to the JavaDoc for Servlet 2.3
>>
>>"When an application stores an object in or removes an object from a
>>session, the session checks whether the object implements
>>HttpSessionBindingListener. If it does, the servlet notifies the object that
>>it has been bound to or unbound from the session. Notifications are sent
>>after the binding methods complete. For session that are invalidated or
>>expire, notifications are sent after the session has been invalidatd or
>>expired."
>>
>>So I think I have the right animal. :)
>>
>>Richard Hensley
>>
>>
>>---------------------------------------------------------------------
>>To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
>>For additional commands, e-mail: tapestry-user-help@jakarta.apache.org
---------------------------------------------------------------------
To unsubscribe, e-mail: tapestry-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tapestry-user-help@jakarta.apache.org