Struts Action Hooks

这种类型的 Hook 可用于覆盖核心门户(例如 c/portal/login)和 portlet struts 动作(例如/login/forgot_password),Liferay Portal 的此操作在 struts-config.xml 文件夹中的 struts-config.xml 文件中指定。要覆盖动作:

  1. docroot/WEB-INF 下你的 hook 插件的 liferay-hook.xml 文件中,在 hook 元素中添加一个 struts-action 元素。
  2. struts-action 元素中,添加 struts-action-path,指定你要覆盖的动作路径和 struts-action-impl,它指定你的自定义动作类。这看起来像:
 <struts-action-path>/login/login</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsPortletAction
    </struts-action-impl>
</struts-action> 
  1. 创建一个扩展 BaseStrutsPortletAction 的 Struts portlet 动作类。这个类的一个例子是:
 public class ExampleStrutsPortletAction extends BaseStrutsPortletAction {

        public void processAction(StrutsPortletAction originalStrutsPortletAction,
                PortletConfig portletConfig, ActionRequest actionRequest,
                ActionResponse actionResponse) throws Exception {

            System.out.println("Custom Struts Action");

            originalStrutsPortletAction.processAction(originalStrutsPortletAction,
                    portletConfig, actionRequest, actionResponse);
        }

    public String render(StrutsPortletAction originalStrutsPortletAction,
            PortletConfig portletConfig, RenderRequest renderRequest,
            RenderResponse renderResponse) throws Exception {

        System.out.println("Custom Struts Action");

        return originalStrutsPortletAction.render(null, portletConfig,
                renderRequest, renderResponse);
    }
}

调用被覆盖的方法,如 originalStrutsPortletAction.processAction,并不是强制性的,而是保持 Action 的行为不受 Liferay Portal 影响的最佳实践。这种类型的钩子也可用于添加新的 Struts 动作,它与修改现有动作相同,在这种情况下 liferay-hook.xml 将是:

<struts-action>
    <struts-action-path>/my/custom/path</struts-action-path>
    <struts-action-impl>
    com.myhook.action.ExampleStrutsAction
    </struts-action-impl>
</struts-action>