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 {
    }

}
时间: 2024-08-03 13:53:32

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

Liferay7 BPM门户开发之37: Liferay7下的OSGi Hook集成开发

hook开发是Liferay客制扩展的一种方式,比插件灵活,即可以扩展liferay门户,也能对原有特性进行更改,Liferay有许多内置的服务,比如用hook甚至可以覆盖Liferay服务. 可作为系统服务挂钩(Liferay Service Hook),还有其他类型的hook... Liferay6.2 时的hook开发比较有限,而在Liferay7则大为不同,OSGi services的彻底改进至Liferay的底层模型框架,使得Liferay可以支持更多的定制扩展!OSGi plugin

Liferay7 BPM门户开发之17: Portlet 生命周期

Portlet 生命周期 init() =〉 render() =〉 processAction() =〉 processEvent() =〉 serveResource() =〉destroy() init() 在Liferay容器部署portlet时,启动portlet实例化 init有两个写法: public void init() throws PortletException public void init(PortletConfig config) throws PortletEx

Liferay7 BPM门户开发之33: Portlet之间通信的3种方式(session、IPC Render Parameter、IPC Event、Cookies)

文章介绍了5种方式,4种是比较常用的: Portlet session IPC Public Render Parameters IPC Event Cookies 参考地址: https://web.liferay.com/zh/community/wiki/-/wiki/Main/Portlet%E9%97%B4%E7%9A%84%E9%80%9A%E4%BF%A1 方式1:Session portlet session作用域: APPLICATION_SCOPE  :全局 PORTLET_

Liferay7 BPM门户开发之28: Portlet文件上传,及实体类同步更新上传

抓住核心 -- 王昕 Liferay文件上传的核心就是使用UploadPortletRequest类 继承关系java.lang.Object extended byjavax.servlet.ServletRequestWrapper extended byjavax.servlet.http.HttpServletRequestWrapper extended bycom.liferay.util.servlet.UploadPortletRequest 实现关系:Implemented I

Liferay7 BPM门户开发之32: 实现自定义认证登陆(定制Authentication Hook)

优秀的平台必然松耦合.易扩展  -- 王昕 第一步:修改liferay-hook.xml <?xml version="1.0"?> <!DOCTYPE hook PUBLIC "-//Liferay//DTD Hook 6.2.0//EN" "http://www.liferay.com/dtd/liferay-hook_6_2_0.dtd"> <hook> <portal-properties>

Liferay7 BPM门户开发之14: Liferay开发体系简介

Liferay SDK 开发体系 主要分6种: Portlet Hook Theme Layout Templates Web Modules Ext Portlet :类似于servlet的web组件,编译后是war包,是页面的组成元素,可以把它理解为一个web APP 详细介绍:https://web.liferay.com/zh/products/what-is-a-portal/web-platform Hook:钩子插件,用来覆盖门户的JSP文件和配置文件,适用于仅需要少量(jsp)代

Liferay7 BPM门户开发之39: Form表单提交的ProcessAction处理

在v6.2开始后,需要设置<requires-namespaced-parameters>false</requires-namespaced-parameters>  来避免在jsp中写<portlet:namespace/>的input前缀 在v7.0发现,注解方式是不灵的! 即  "javax.portlet.requires-namespaced-parameters=false", 无效果, 真是汗... 但我们是有办法在7.0中解决的,直

Liferay7 BPM门户开发之41: Expando API入门

Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Service Builder那么繁琐, 实现的具体技术实际上是列转行,其中ExpandoValue有点像Activiti的act_ru_variable 主要有4种接口,分别是表\行\列\值 ExpandoTableLocalServiceUtil ExpandoRowLocalServiceUtil Ex

Liferay7 BPM门户开发之8: Activiti实用问题集合

1.如何实现审核的上级获取(任务逐级审批) 这个是必备功能,通过Spring的注入+Activiti表达式可以很容易解决. 可参考: http://blog.csdn.net/sunxing007/article/details/8491552 http://linhongyu.blog.51cto.com/6373370/1656596 2.如何设置流程发起人,并动态在其他任务中使用 通过变量,在启动的时候设置. activiti里设置流程发起人的功能很绕. activiti 指定发起人,并作