zoukankan      html  css  js  c++  java
  • 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 {
        }
    
    }
  • 相关阅读:
    html框架
    head标签
    项目报错,tomcat中引起
    Eclipse中点击小猫提示Tomcat settings should be set in Tomcat Preference Page
    同一台电脑上安装两个tomcat服务器
    Java排序算法
    格式化系统日期
    九九乘法表
    Java实现给定字符串的倒序输出
    Eclipse警告:The serializable class XXX does not declare a static final serialVersionUID field of type long
  • 原文地址:https://www.cnblogs.com/starcrm/p/6061432.html
Copyright © 2011-2022 走看看