indiWiz.com

Subhash's Tech Log

Archive for the ‘jsr286’ tag

Serving Static and Dynamic Resources in JSR 286

without comments

To serve static content packaged as part of the portlet WAR, we generally take this approach:

<%=response.encodeURL(request.getContextPath()+"/js/project.js")%>

For generating dynamic content what do we do? In JSR 168 this was not possible. Thankfully, JSR 286 introduced this important concept. For creating dynamic content, just override the void serveResource(ResourceRequest request, ResourceResponse response) method in javax.portlet.ResourceServingPortlet (implemented by javax.portlet.GenericPortlet). A simple example:

    @Override
    public void serveResource(ResourceRequest request, ResourceResponse response)
            throws PortletException, IOException {
        String paramValue = request.getParameter("abc");
        System.out.println(paramValue);
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/plain");
        PrintWriter pw = response.getWriter();
        pw.println(paramValue);
        pw.close();
    }

To link to this dynamic content:

<portlet:resourceURL var="url">
  <portlet:param name="abc" value="Hello World"/>
</portlet:resourceURL>

<a href="<%=url%>">Dynamic link</a>

Written by Subhash Chandran

February 20th, 2009 at 5:15 pm

Posted in Uncategorized

Tagged with , ,

JSR-286: Adding Header Elements

without comments

Some HTML elements like <link>, <script> may need to be placed in the HTML’s <head> section. For such needs, JSR-286 defines a standard way:

import javax.portlet.GenericPortlet;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.MimeResponse;
import org.w3c.dom.Element;

...

public class MyPortlet extends GenericPortlet {
  @Override
  protected void doHeaders(RenderRequest request, RenderResponse response){
    Element e = response.createElement("link");
    e.setAttribute("rel", "stylesheet");
    e.setAttribute("type", "text/css");
    e.setAttribute("href", "abc.css");
    response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, e);
  }
}

response.addProperty(MimeResponse.MARKUP_HEAD_ELEMENT, ...) might be called for adding any number of headers.

We also have to add this in the portlet.xml (either in portlet scope or application scope):

<container­-runtime­-option>
  <name>javax.portlet.renderHeaders</name>
  <value>true</value>
</container­-runtime­-option>

This is because javax.portlet.renderHeaders is set to false by default.

Written by Subhash Chandran

November 19th, 2008 at 3:23 pm

Posted in Java

Tagged with , ,