Liferay7 BPM门户开发之36: 使用Portlet filters过滤器做切面AOP

使用Portlet filters过滤器做切面AOP

Portlet Filters定义于JSR286 Java Portlet Specification 2.0 Portlet Filters
是为了在4个生命周期的过程中,提供外部的AOP支持,这非常不显眼,但也很有用,比如可以用在Liferay的Hook开发中。
JSR286 Java Portlet Specification 2.0 的更多介绍:
http://www.ibm.com/developerworks/websphere/library/techarticles/0803_hepper/0803_hepper.html

针对不同周期的4个过滤器Portlet filters:

  • javax.portlet.filter.ResourceFilter - For serveResource method
  • javax.portlet.filter.RenderFilter - For render method
  • javax.portlet.filter.ActionFilter - For processAction method
  • javax.portlet.filter.EventFilter - For processEvent method

可以看到,这个是属于javax.portlet.filter包,而不是liferay私有的,只是liferay对JSR286的实现较完整,提供了这种过滤机制。
Portlet filters除了可以实现Hook,还能实现不修改原portlet代码前提下的扩展,核心思想就是AOP,能够在生命周期方法之后或者之前做额外动作开发。

XXXXXXFilter其实是一个接口,主要方法:

  • init(javax.portlet.filter.FilterConfig filterConfig)
  • doFilter (*Request, *Response, FilterChain chain)

我们主要是要实现doFilter方法。

用例子来说明,比如在提交操作时,不用改动原代码,嵌入一个计数器。

先要通过property = {"javax.portlet.name=Your_portlet_Name"} 定义需要监听的Portlet,这步比较关键

import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.filter.FilterChain;
import javax.portlet.filter.FilterConfig;
import javax.portlet.filter.PortletFilter;
import javax.portlet.filter.RenderFilter;
import org.osgi.service.component.annotations.Component;

@Component(
    immediate = true,
    property = {"javax.portlet.name=Your_portlet_Name"},
    service = PortletFilter.class
)
public class HitCounterFilter implements RenderFilter {
        int count;
        @Override
      public void doFilter(RenderRequest renderRequest, RenderResponse renderResponse, FilterChain filterChain) throws IOException, PortletException {

       System.out.println("===============");
       System.out.println("显示数: " +count);
       System.out.println("===============");
       . . .
       System.out.println("Before filter");
       filterChain.doFilter(renderRequest, renderResponse);
       System.out.println("After filter");
   }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig filterConfig) throws PortletException {
    }

}

 

关于作者: 王昕(QQ:475660) 在广州工作生活30余年。十多年开发经验,在Java、即时通讯、NoSQL、BPM、大数据等领域较有经验。
目前维护的开源产品:https://gitee.com/475660
posted @ 2016-11-14 12:40  昕友软件开发  阅读(752)  评论(0编辑  收藏  举报
欢迎访问我的开源项目:xyIM企业即时通讯