+

Search Tips   |   Advanced Search

Portlet preferences


Preferences are set by portlets to store customized information. By default, the PortletServingServlet servlet stores the portlet preferences for each portlet window in a cookie. However, we can change the location to store them in either a session, an .xml file, or a database.

 

Storing portlet preferences in cookies

The attributes of the cookie are defined as follows:

Path

context/portlet-name/portletwindow

Name:

The name of the cookie has the fixed value of PortletPreferenceCookie.

Value

The value of the cookie contains a list of preferences by mapping to the following structure:
*['/' pref-name *['=' pref-value]]

All preferences start with '/' followed by the name of the preference. If the preference has one or more values, the values follow the name separated by the '=' character. A null value is represented by the string '#*!0_NULL_0!*#'. As an example, the cookie value may look like, /locations=raleigh=boeblingen/regions=nc=bw

 

Customizing the portlet preferences storage

You can override how the cookie is handled to store preferences in a session, an .xml file or database. To customize the storage, create a filter, servlet or JSPs file as new entry point that wraps the request and response before calling the portlet. Examine the following example wrappers to understand how to change the behavior of the PortletServingServlet to store the preferences in a session instead of cookies.

The following is an example of how the main servlet manages the portlet invocation.

public class DispatchServlet extends HttpServlet
{
    ...
    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
  response.setContentType("text/html");
  
  
// create wrappers to change preference storage
  RequestProxy req = new RequestProxy(request);
  ResponseProxy resp = new ResponseProxy(request, response);

  
// create url prefix to always return to this servlet
                ...
                req.setAttribute("com.ibm.wsspi.portlet.url.prefix", urlPrefix);
        
  
// prepare portlet url
  String portletPath = request.getPathInfo(); 
                ...

  
// include portlet using wrappers
  RequestDispatcher rd = getServletContext().getRequestDispatcher(modifiedPortletPath);
                rd.include(req, resp);
    }
}


In the following example, the request wrapper changes the cookie handling to retrieve the preferences out of the session.

public class RequestWrapper extends HttpServletRequestWrapper 
{
    ...
    public Cookie[] getCookies() {
        Cookie[] cookies = (Cookie[]) session.getAttribute("SessionPreferences");
        return cookies;
    }
}

In the following example, the response wrapper changes the cookie handling to store the preferences in the session:

public class ResponseProxy extends HttpServletResponseWrapper 
{
   ...
    public void addCookie(Cookie cookie) {
        Cookie[] oldCookies = (Cookie[]) session.getAttribute("SessionPreferences");
        int newPos = (oldCookies == null) ? 0 : oldCookies.length;
        Cookie[] newCookies = new Cookie[newPos+1];
        session.setAttribute("SessionPreferences", newCookies);

        if (oldCookies != null) {
        System.arraycopy(oldCookies, 0, newCookies, 0, oldCookies.length);
        } 
        newCookies[newPos] = cookie;
    }
}





Related concepts


Portlet aggregation using JSPs
Portlets
Portlet container

 

Related information


JSR-000168 Portlet Specification