Struts Action Hooks
这种类型的 Hook 可用于覆盖核心门户(例如 c/portal/login
)和 portlet struts 动作(例如/login/forgot_password
),Liferay Portal 的此操作在 struts-config.xml
文件夹中的 struts-config.xml
文件中指定。要覆盖动作:
- 在
docroot/WEB-INF
下你的 hook 插件的liferay-hook.xml
文件中,在 hook 元素中添加一个struts-action
元素。 - 在
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>
- 创建一个扩展
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>