Write a filter class.
A filter class should implement one or more of the above mentioned four interfaces and should provide a no argument public constructor. The filter class should also override the init() and destroy() methods of the javax.portlet.filter.PortletFilter interface.
public class HitCounterFilter implements RenderFilter { private FilterConfig filterConfig = null; public void init(FilterConfig filterConfig) throws PortletException { this.filterConfig = filterConfig; } public void doFilter(RenderRequest renderRequest, RenderResponse renderResponse, FilterChain filterChain) throws IOException, PortletException { . . . StringWriter sw = new StringWriter(); PrintWriter writer = new PrintWriter(sw); . . . writer.println(); writer.println("==============="); writer.println("The number of hits is: " +count); writer.println("==============="); . . . filterChain.doFilter(renderRequest, renderResponse); } public void destroy() { } } |
Add the following XML fragments in the portlet.xml files after you write the portlet filter class.
<portlet-app xmlns="http://java.sun.com/xml/ns/portlet/ portlet-app_2_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/portlet/ portlet-app_2_0.xsd http://java.sun.com/xml/ns/portlet/portlet-app_2_0.xsd" id="myPortletApp" version="2.0"> <portlet> ... <filter> <filter-name>HitCounterRenderFilter</filter-name> <filter-class>com.sun.portal.portlet.filter .HitCounterFilter</filter-class> <lifecycle>RENDER_PHASE</lifecycle> </filter> <filter-mapping> <filter-name>HitCounterRenderFilter</filter-name> <portlet-name>HelloWorld</portlet-name> </filter-mapping> </portlet-app> |