`
esffor
  • 浏览: 1363005 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Liferay Portal额外研究(五):对多分发命令Action的支持(方案一)

阅读更多
 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是一款开源的企业级门户平台,它提供了丰富的功能和高度的可定制性,用于构建企业内部或外部的网站、工作流应用和协作平台。在这个额外研究中,我们将探讨如何在新的...

    liferay portal 开发指南

    **Liferay Portal** 是一款功能强大的企业级门户平台,支持多种应用集成和技术扩展。它不仅提供了丰富的特性满足企业日常需求,同时也支持高度定制化开发。本文档旨在指导开发者如何进行 Portlet 的开发并部署在 ...

    liferay Portal 的学习书籍

    Liferay Portal是一种开源的企业门户解决方案,支持使用Java语言构建企业内部网(intranets)和其他协作平台。根据提供的内容片段,我们可以了解到一些关于Liferay Portal书籍的具体信息,这本书是外国人编写的,受...

    liferay portal 开发实例

    Liferay Portal是一款开源的企业级门户平台,用于构建和管理复杂的企业级Web应用程序。在这个开发实例中,我们将深入探讨四个Liferay Portal MVC(Model-View-Controller)应用的实践案例,这些实例可以帮助开发者更...

    liferay portal开发大全

    Liferay Portal 是一个开源的企业级门户平台,广泛用于构建复杂的Web应用程序和企业内部协作系统。它提供了丰富的功能,包括内容管理、社交媒体集成、工作流支持以及用户界面定制。本资源集是针对Liferay Portal开发...

    liferay portal 6 使用文档

    #### 一、Liferay Portal 6:企业级门户解决方案 Liferay Portal 6是一款先进的企业级门户平台,旨在帮助企业构建和维护高效、安全、用户友好的内部网(Intranets)。它不仅提供了丰富的功能模块,如文档管理、工作...

    Liferay Portal Systems Development

    Liferay Portal是一个开源的企业级门户解决方案,它允许用户构建和部署Web应用程序和门户。它支持多种插件,包括Portlets(小应用程序)、主题、布局模板等,使得开发者能够灵活地创建企业级应用。 在描述中提到的...

    Liferay Portal文档

    《Liferay Portal文档》是一份详尽的指南,主要介绍了Liferay Portal的架构、工作原理及其核心组件——Portlet。Liferay Portal是一款开源的企业级门户平台,它提供了丰富的功能,如内容管理、社交网络、协作工具等...

    搭建liferay portal的开发环境.doc

    搭建Liferay Portal的开发环境是一项细致且复杂的过程,涉及到多个步骤和组件的配合。本文将根据给定的文件信息,详细解析如何从零开始构建一个完整的Liferay开发环境,包括必要的准备、具体步骤以及关键配置。 ###...

    Liferay_Portal_门户解决方案

    Liferay Portal 是一个完整的门户解决方案,基于 J2EE 的应用,使用了 EJB 及 JMS 等技术,前台界面部分使用 Struts MVC 框架,基于 XML 的 portlet 配置文件可以自由地动态扩展,使用了 Web 服务来支持一些远程信息...

    Liferay Portal 内容管理

    【Liferay Portal 内容管理】是企业级门户平台Liferay Portal的重要组成部分,它提供了丰富的文档管理和信息发布功能,便于组织内部的信息共享与协作。 在Liferay Portal中,文档管理主要通过【Document Library】...

    Liferay Portal 二次开发指南

    #### 一、Liferay Portal 架构解析 ##### 1.1 Portal规范 Liferay Portal遵循了两种主要的门户规范:JSR 168 和 WSRP (Web Services for Remote Portlets)。JSR 168是一个Java规范请求,用于定义Portlet容器和...

    Liferay Portal performance

    本次研究由 Liferay 工程团队执行,旨在通过一系列用例(包括基础设施门户、协作和内容管理)进行密集调优和测试,以展示 Liferay Portal EE 的可扩展性。 该研究的目标是: - 确定单个物理服务器在定义的测试案例...

    Using Liferay Portal 6.1

    Using Liferay Portal 6.1

    liferay-portal详解

    本文档将从架构解析、portal 规范、portlet 容器、portlet 生命周期、liferay portal 工作原理等方面对 Liferay Portal 进行详细介绍。 第一部分:Liferay Portal 架构解析 Liferay Portal 的架构主要由三个部分...

    Liferay Portal Liferay IDE

    Liferay Portal Liferay IDE

    liferay+Portal+二次开发指南

    **Liferay Portal** 是一款开源的企业级门户平台,它基于Java技术构建,支持多种标准,包括JSR 168和WSRP等。Liferay Portal 提供了一个高度可定制化的框架,允许开发者根据业务需求进行扩展和二次开发。 #### 二、...

    liferay Portal 求助

    Liferay Portal 是一个开源的企业级门户平台,它允许用户创建、管理和定制各种Web应用程序和内容。这个求助主题可能涉及到在使用Liferay Portal过程中遇到的问题,或者是寻求关于如何更有效地利用其特性和功能的建议...

    liferay portal(jsp)开发指南

    总的来说,Liferay Portal的JSP开发涉及到多个环节,从创建项目到编写和配置JSP页面,再到注册Portlet,每个步骤都是实现功能的关键。理解这些基本概念和流程,对于高效地开发和维护Liferay Portlet至关重要。在实际...

Global site tag (gtag.js) - Google Analytics