Liferay6.2:使用Hook执行自定义Action

Liferay Hooks是定制Liferay核心功能的最佳plugin类型。请在需要覆盖Liferay的核心功能时尽可能的使用Hook。尽管相同的任务Ext plugin也可以完成,但是Hook是支持热部署的并且更向前兼容,因此我们建议优先使用Hook。

在本教程的这一部分中,您将学习如何创建Hook,并且您将探索它们最常见的用途。

Performing a Custom Action Using a Hook - 使用Hook执行自定义Action

利用Hook能触发常见portal event的自定义action,比如用户登录或系统启动。 每个event的action都在portal.properties中定义,因此创建一个自定义action需要扩展此文件。使用Hook实现这项任务非常简单。 接下来学习探索如何使用Hook执行自定义Action。

在本教程中,你将创建一个自定义Hook,为用户登录执行自定义Action。 与此相似,你也可以为portal.properties中定义的其他portal event创建自定义Action。 接下来是具体步骤:

  1. 确定要触发自定义action的event。 查看portal.properties文档以查找匹配的event属性。 提示:event属性的名称中必定包含.event。portal.properties文档的以下部分中有session,startup,shutdown和portal event 属性:

    • Session
    • Startup Events
    • Shutdown Events
    • Portal Events
      请注意与action相关的event的属性名称。
  2. 在Hook项目中,创建一个扩展com.liferay.portal.kernel.events.Action类的Java类。 重写Action.run(HttpServletRequest,HttpServletResponse)方法。
    例如,创建一个名为LoginAction的类扩展Action并覆盖其run方法:
    package com.liferay.sample.hook;

    import com.liferay.portal.kernel.events.Action;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class LoginAction extends Action {
        public void run(HttpServletRequest req, HttpServletResponse res) {
            System.out.println("## My custom login action");
        }
    }
    

    重要提示:如果你的action访要问HttpServletRequest对象,请扩展com.liferay.portal.kernel.events.Action; 否则扩展com.liferay.portal.struts.SimpleAction。

  3. 在hook项目的docroot/WEB-INF/src文件夹中创建属性文件portal.properties。 然后添加portal event属性的名称,该属性名称与要执行action的event相对应。 将action类的完全限定名称指定为属性的值。
    例如,要在门户网站登录用户之前执行一个action,你可以将action类作为login.events.pre属性的值来指定。 就是这样:
    login.events.pre=com.liferay.sample.hook.LoginAction
    要点:由于login.events.pre等portal属性可以接受多值,因此必须将值附加到现有值上。 你可以通过其他hook重复修改属性。
    对于接受单值的portal属性,只能通过一个hook plugin来修改接受单值的portal属性。 如果通过多个plugin修改属性值,Liferay会不知道要使用哪个值。

  4. 编辑docroot/WEB-INF/liferay-hook.xml文件,并将hook的portal属性文件名成添加为…</ portal-properties>元素的值。该元素在hook的…元素中。
    例如,如果hook的属性文件名是portal.properties,则指定此元素:
    portal.properties

  5. 部署hook

  6. 触发action并验证action是否执行。


警告:由于已知bug(LPS-52754),重写具有重叠路径的Struts action时可能会出现问题。 当一个路径是另一个路径的子串时,Struts action路径会重叠。在以下示例中,Liferay的struts-config.xml文件显示了三个Struts action路径。 请注意,第一个Struts action路径是后两个的子字符串。

<action path="/document_library/edit_file_entry" ...
</action>

<action path="/document_library/edit_file_entry_discussion" ...
</action>

<action path="/document_library/edit_file_entry_type" ...
</action>

假设你创建一个hook plugin来覆盖/document_library/edit_file_entry路径。 由于上面提到的bug,hook的新自定义action不仅在调用预期路径时触发,而且在调用其中一个较大的包含路径(例如document_library/edit_file_entry_discussion)时也会触发!

要解决此问题,请遵循以下步骤:

  1. 查找所有包含路径的Struts action,这些路径包含你要覆盖的Struts action的路径。
  2. 如果找到任何违规路径,请在liferay-hook.xml中为它们创建。
  3. 在为每个Struts action创建的类中,仅覆盖processAction,render和serveResource方法。
  4. 在每个重写的方法中,只需调用原始的Struts action的方法(例如,originalStrutsPortletAction.processAction)。

至此,你已经创建了一个hook,可以在公共portal event上触发自定义action。现在已经了解了使用Liferay Portal中的hook执行自定义action所需的基本步骤。

猜你喜欢

转载自blog.csdn.net/sinat_37028632/article/details/84824503