Whats the difference between Http Session and PortletSession? How are they related or how they are different and what is the scope of each? Can someone please guide me to some documentation or please explain me.
When the user initially accesses a portlet, a PortletSession is created. The portlet session stores transient data associated with an individual use of the portlet.
The PortletSession object extends from HttpSession and serves much the same purpose. The PortletSession is intended to represent an ongoing conversation between the client and the portlet. To this end, the PortletSession can be used to store information needed between requests. The PortletSession is intended to store data between requests, not between portlets. As such, data stored in the session by one portlet is not accessible by another. The PortletSession is retrieved from the request object.
Just like you, struggeling to get the right solutions!<br /> <br />Sun Certified Java Programmer 1.5<br /> <br />Target - SCWCD
Joined: Jul 19, 2006
This has created few more doubts in my mind. Can there be multiple PortletSessions for a HttpSession? In my application on the home page I have different portlets each can be accessed by the link so when is the particular portletsession created?
Joined: Jan 27, 2003
You are correct....every Portlet has it's own PortletSession. As Portlet is a self-containted, reusable web-application, and has it's own saperate PortletSession. This session is not sharable across 2 portlets on the same page.
Joined: Jul 19, 2006
Well now to ask you more, In my application I have a home page which is a portlet and it has a common template which has links to the other portlets. Now when I start the application I first get to see Home page and a Session is created. So is this session Like a Parent portlet and any other portlet that i access are the child of it or within the main portlet? When i try to get the session id i always get the same session id irrespective of which portlet i am in. Can you please explain.
Well, on this topic, you've got to realize that the PortletSession is just piggybacking on the HttpSession. Sure, one Portlet can't see another Portlet's PortletSession data, but if you go into a JSP, grab the HttpSession from the page, not the PortletSession, but the HttpSession (you can do it, after all, it is a JSP page), you'll find all of the various PorletSession data objects stuffed inside the HttpSession...The only difference is the Portal has given all teh PortletSession data objects crazy namespace names so that one portlet can't see another portlets session data. Do you think the application server is creating new database rows for every PortletSession though? Not a chance...That'd be way too wasteful.
Well both Portlets and Servlets are loaded using the same classloader.So it's a plain fact that session can be made available in both the contexts.
As far as the portlets are concerned,
The PortletSession is namespaced :
1) PORTLET_SCOPE : Only available to the particular portlet.
2) APPLICATION_SCOPE: Available to all Portlets and also available in Servlets/JSP etc
So, if you really want to share sessions among Servlets and Portlets...
1) Define the scope of the session attributes as APPLICATION_SCOPE in Portlets....
2) Access the session attributes defined or set in servlets by specifying APPLICATION_SCOPE.. else you will get null.
As far as retrieving the PortletSession from HttpRequest is concerned.. You can get them via the APIs available..
For JSR168 Struts Portlets we have WpsStrutsUtil package that will return you the PortletSession...