Liferay默认提供的基于
Struts Action扩展的PortletAction是不支持多分发命令的,也就是我们一般常用的DispatchAction。但在我们日常基于
Struts处理的操作中,已经大量的沿用了DispatchAction处理方式,采用“cmd=queryall”诸如此类的方式。 本文就来给大家讲解如何通过扩展,让Liferay实现对多分发命令Action的支持。
首先让我们来看看Liferay是如何处理的:
在portlet.xml中,我们一般会配置如下:
<portlet-class>com.liferay.portlet.StrutsPortlet</portlet-class>
<init-param>
<name>view-action</name>
<value>/ext/reports/view_reports</value>
</init-param>
这样Liferay面对一个Portlet请求的时候,会根据请求model来执行Portlet的doView或doEdit方式。当执行doView的时候就会请求其view-action所配置的Action URL所代表的Action来处理。
其处理流程大致是:
Portlet类——〉RequestProcessor——〉StrutsAction处理类。
我们可以通过两种扩展方案来实现对多分发的支持:
方案(一):扩展Liferay的StrutsPortlet类,并写一个DispatchPortletAction类,这样不用扩展RequestProcessor实现。
方案(二):扩展RequestProcessor 与,并写一个DispatchPortletAction类,这样可以直接使用Liferay所提供的StrutsPortlet类。对于 RequestProcessor的扩展,在通过portal.properties文件中通过配置 “struts.portlet.request.processor”属性来设置。
接下来就两种方案做分别的详细讲解(本篇先讲方案一):
方案(一)
首先让我们写一个DispatchPortletAction 类,此类可以通过扩展Liferay本身的PortletAction实现,也可以通过扩展Struts本身的DispatchAction实现。本人是选择后一种方式,这样扩展的代码量较少,都不要自己写execute方式,直接使用基类的即可。
对于
DispatchPortletAction 主要扩展dispatchMethod和getMethodName方法。注意在getMechodName方法中,还追加了从 request.getAttribute(parameter)获取方法名称,并注意unspecified方法,这个是在没有指明访问方法的时候默认执行的,所以开发人员在后续写自己的Action一定要实现这个。
public class DispatchPortletAction extends DispatchAction ...{
protected ActionForward dispatchMethod(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response, String name) throws Exception ...{
PortletConfig portletConfig = (PortletConfig) request
.getAttribute(WebKeys.JAVAX_PORTLET_CONFIG);
RenderRequest renderRequest = (RenderRequest) request
.getAttribute(WebKeys.JAVAX_PORTLET_REQUEST);
RenderResponse renderResponse = (RenderResponse) request
.getAttribute(WebKeys.JAVAX_PORTLET_RESPONSE);
if (name == null) ...{
return this.unspecified(mapping, form, portletConfig,
renderRequest, renderResponse);
}
Method method = null;
try ...{
method = getMethod(name);
} catch (NoSuchMethodException e) ...{
String message = messages.getMessage("dispatch.method",
mapping.getPath(), name);
log.error(message, e);
String userMsg = messages.getMessage("dispatch.method.user",
mapping.getPath());
throw new NoSuchMethodException(userMsg);
}
ActionForward forward = null;
try ...{
Object args[] = ...{ mapping, form, portletConfig, renderRequest,
renderResponse };
forward = (ActionForward) method.invoke(this, args);
} catch (ClassCastException e) ...{
String message = messages.getMessage("dispatch.return",
mapping.getPath(), name);
log.error(message, e);
throw e;
} catch (IllegalAccessException e) ...{
String message = messages.getMessage("dispatch.error",
mapping.getPath(), name);
log.error(message, e);
throw e;
} catch (InvocationTargetException e) ...{
Throwable t = e.getTargetException();
if (t instanceof Exception) ...{
throw ((Exception) t);
} else ...{
String message = messages.getMessage("dispatch.error",
mapping.getPath(), name);
log.error(message, e);
throw new ServletException(t);
}
}
return (forward);
}
protected String getMethodName(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response,
String parameter) throws Exception ...{
String methodName = request.getParameter(parameter);
if (methodName == null || methodName.length() == 0) ...{
methodName = (String) request.getAttribute(parameter);
}
return
分享到:
相关推荐
【Liferay Portal额外研究】 Liferay Portal是一款开源的企业级门户平台,它提供了丰富的功能和高度的可定制性,用于构建企业内部或外部的网站、工作流应用和协作平台。在这个额外研究中,我们将探讨如何在新的...
**Liferay Portal** 是一款功能强大的企业级门户平台,支持多种应用集成和技术扩展。它不仅提供了丰富的特性满足企业日常需求,同时也支持高度定制化开发。本文档旨在指导开发者如何进行 Portlet 的开发并部署在 ...
Liferay Portal是一款开源的企业级门户平台,用于构建和管理复杂的企业级Web应用程序。在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更...
Liferay Portal 是一个开源的企业级门户平台,广泛用于构建复杂的Web应用程序和企业内部协作系统。它提供了丰富的功能,包括内容管理、社交媒体集成、工作流支持以及用户界面定制。本资源集是针对Liferay Portal开发...
#### 一、Liferay Portal 6:企业级门户解决方案 Liferay Portal 6是一款先进的企业级门户平台,旨在帮助企业构建和维护高效、安全、用户友好的内部网(Intranets)。它不仅提供了丰富的功能模块,如文档管理、工作...
Liferay Portal是一个开源的企业级门户解决方案,它允许用户构建和部署Web应用程序和门户。它支持多种插件,包括Portlets(小应用程序)、主题、布局模板等,使得开发者能够灵活地创建企业级应用。 在描述中提到的...
《Liferay Portal文档》是一份详尽的指南,主要介绍了Liferay Portal的架构、工作原理及其核心组件——Portlet。Liferay Portal是一款开源的企业级门户平台,它提供了丰富的功能,如内容管理、社交网络、协作工具等...
搭建Liferay Portal的开发环境是一项细致且复杂的过程,涉及到多个步骤和组件的配合。本文将根据给定的文件信息,详细解析如何从零开始构建一个完整的Liferay开发环境,包括必要的准备、具体步骤以及关键配置。 ###...
Liferay Portal 是一个完整的门户解决方案,基于 J2EE 的应用,使用了 EJB 及 JMS 等技术,前台界面部分使用 Struts MVC 框架,基于 XML 的 portlet 配置文件可以自由地动态扩展,使用了 Web 服务来支持一些远程信息...
Liferay Portal的核心特点是提供了一个统一的访问入口,使得用户可以通过单点登录(Single Sign-On,SSO)访问多个不同的应用程序和信息资源。其目标是消除信息孤岛,整合各类应用系统,提升用户体验,实现高效的...
【Liferay Portal 内容管理】是企业级门户平台Liferay Portal的重要组成部分,它提供了丰富的文档管理和信息发布功能,便于组织内部的信息共享与协作。 在Liferay Portal中,文档管理主要通过【Document Library】...
#### 一、Liferay Portal 架构解析 ##### 1.1 Portal规范 Liferay Portal遵循了两种主要的门户规范:JSR 168 和 WSRP (Web Services for Remote Portlets)。JSR 168是一个Java规范请求,用于定义Portlet容器和...
本次研究由 Liferay 工程团队执行,旨在通过一系列用例(包括基础设施门户、协作和内容管理)进行密集调优和测试,以展示 Liferay Portal EE 的可扩展性。 该研究的目标是: - 确定单个物理服务器在定义的测试案例...
Using Liferay Portal 6.1
本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal 工作原理等方面对 Liferay Portal 进行详细介绍。 第一部分:Liferay Portal 架构解析 Liferay Portal 的架构主要由三个部分...
Liferay Portal Liferay IDE
**Liferay Portal** 是一款开源的企业级门户平台,它基于Java技术构建,支持多种标准,包括JSR 168和WSRP等。Liferay Portal 提供了一个高度可定制化的框架,允许开发者根据业务需求进行扩展和二次开发。 #### 二、...
Liferay Portal 是一个开源的企业级门户平台,它允许用户创建、管理和定制各种Web应用程序和内容。这个求助主题可能涉及到在使用Liferay Portal过程中遇到的问题,或者是寻求关于如何更有效地利用其特性和功能的建议...
总的来说,Liferay Portal的JSP开发涉及到多个环节,从创建项目到编写和配置JSP页面,再到注册Portlet,每个步骤都是实现功能的关键。理解这些基本概念和流程,对于高效地开发和维护Liferay Portlet至关重要。在实际...
Liferay Portal 6提供了多语言环境的支持,使得不同国家和地区的员工都能无障碍地访问内部网资源。 - **安全性**:安全是企业级应用的核心关注点之一。Liferay Portal 6内置了强大的安全机制,包括用户认证、授权...