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>