37

I am reading through head first JSP and servlets. Going through different type of listeners, I came across HttpSessionBindingListener and HttpSessionAttributeListener.

I was thinking about the difference between the two - I want to see the practical usages in real world examples of those two listeners. I tested HttpSessionBindingListener by implementing valueBound() and valueUnBound() - why would an object need to know whether it has been added or not?

I am pretty confused about the practical usages. Please help in clarifying this.

Beryllium
  • 12,808
  • 10
  • 56
  • 86
benz
  • 4,561
  • 7
  • 37
  • 68

1 Answers1

51

The HttpSessionBindingListener is to be implemented on the class whose instances may be stored in the session, such as the logged-in user.

E.g.

public class ActiveUser implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        logins.add(this);
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        logins.remove(this);
    }

}

When an instance of this ActiveUser get set as a session attribute by HttpSession#setAttribute(), then the valueBound() will be invoked. When it get removed by either HttpSession#removeAttribute(), or an invalidate of the session, or get replaced by another HttpSession#setAttribute(), then the valueUnbound() will be invoked.

Here are some real world use cases:

The HttpSessionAttributeListener is to be implemented as an application wide @WebListener which get invoked when any attribute is added, removed or replaced in the HttpSession. Continuing with the above ActiveUser example, this is particularly useful if you can't modify the ActiveUser class to implement HttpSessionBindingListener (because it's 3rd party or so), or when you want to make use of a "marker interface" on an arbitrary amount of classes so that you can do the listening job in a single central place.

@WebListener
public class ActiveUserListener implements HttpSessionAttributeListener {

    @Override
    public void attributeAdded(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.add(event.getValue());
        }
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.remove(event.getValue());
        }
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent event) {
        if (event.getValue() instanceof ActiveUser) {
            logins.add(event.getValue());
        }
    }

}

Here's a real world use case:

Community
  • 1
  • 1
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • Thanks so much @BalusC. I understood the difference. Thanks so much for the detailed answer. – benz Jul 22 '13 at 05:06
  • This is a great answer. @BalusC how do you manage to get this all information and present in such nice way. – Makky Jul 22 '13 at 09:35
  • @BalusC - my book explains Http session binding with real world example. It say - Consider a `Customer` class, with each active instance representing a single customer's info for name, address, order info, etc. The real data is stored in an underlying database. You use the database to populate the fields of a Customer object. The `HttpSessionBindingListener` methods help you to keep the Object in sync with the database and vice versa. – Erran Morad Apr 30 '14 at 23:07
  • @BalusC - So, if the Customer logins into his e-shopping account info page, will there be some kind of `javascript/js` `Object` which will load all this info from db to prevent repeated DB hits ? When a user edits his home address, then the object will be used to update the database ? – Erran Morad Apr 30 '14 at 23:09