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

Pluto控制流程

阅读更多


一、初始化流程

  //Servlet初始化
  Pluto.PortalImpl.Servlet.init()

     // ServiceManager初始化
     ServiceManager.init()

        ConfigService.init()  // 配置服务

        LogService.init()  // 日志服务

        FactoryManagerService.init()  // 工厂管理器

        PortletDefinitionRegistryService.init()  // Portlet定义注册表

        PortletEntityRegistryService.init()  // Portlet实体注册表

        PageRegistryService.init() // Page注册表

        //注,以上服务都读取同名的properties配置文件.

     // 初始化Portlet容器, 容器实现类在ConfigService.properties中指定
     PortletContainerFactory.getPortletContainer().init()

二、请求处理流程

  Pluto.PortalImpl.Servlet.doGet()

    1. 创建PortalEnvironment;

    2. 查找ActionWindow;

    2a. 如找到ActionWindow, 则为Action
            执行PortletContainer.processPortletAction();
            重定向输出.

    2b. 找不到ActionWindow, 则为Render, 读取Page定义。
            RootFragment root = PageRegistry.getRootFragment();
            root.service(servletRequest, servletResponse);

    3. 处理完毕;

  // 处理Fragment, RootFragment与Pageregistry.xml文件关联, 后者定义了页面的布局
  Pluto.portalImpl.Aggregation.RootFragment.service()

    // 服务前置处理。
    1. preService(request, response);

    // 包含与当前fragment同名的jsp文件,当前为RootFragment。
    2. RequestDispatcher rd = getServletConfig().getServletContext().
                                getRequestDispatcher(BASE_ROOT+jspName);
       rd.include(request, response);

    // 服务后置处理
    3. postService(request, response);

  // Pageregistry.xml
  〈portal〉  // 对应RootFragment
    〈fragment name="navigation"
        class="org.apache.Pluto.portalImpl.aggregation.navigation.TabNavigation"〉
    〈/fragment〉

    〈fragment name="test" type="page"〉  // 对应PageFragment
        〈navigation〉
            〈title〉Test〈/title〉
            〈description〉...〈/description〉
        〈/navigation〉

        〈fragment name="row" type="row"〉  // 对应RowFragment
            〈fragment name="col1" type="column"〉   // 对应ColumnFragment
                〈fragment name="p1" type="portlet"〉   // 对应PortletFragment
                    〈property name="portlet" value="3.1"/〉
                〈/fragment〉
                〈fragment name="p2" type="portlet"〉  // 对应PortletFragment
                    〈property name="portlet" value="4.1"/〉
                〈/fragment〉
            〈/fragment〉
        〈/fragment〉
    〈/fragment〉
  〈/portal〉

   // 上面的层次结构十分清楚,其中fragment与Fragment的子类对应,上面的定义中包括RootFragment,
        PageFragment, RowFragment, ColumnFragment和PortletFragment,除了PortletFragment外,
        其它Fragment的处理大致上是一样的,
   Iterator childIterator = fragment.getChildFragments().iterator();

   // 遍历子fragment, 并调用其服务方法。
   while (childIterator.hasNext()) {
       Fragment subfragment = (Fragment)childIterator.next();
       if (subfragment instanceof AbstractNavigationFragment)
       {
           subfragment.service(request, response);
           break;
       }
  }

三、Portal处理流程

  先来看看Portlet的初始化, 主要是从配置文件中读取Portlet定义。
  PortletFragment.init()

      // 读取Portlet的实体Id, 在pageregistry.xml中由portlet属性指定.
      String portletEntityId = getInitParameters().getString("portlet");

      // 读取Portlet实体. portlet实体在portletentityregistry.xml中定义.
      PortletEntity portletEntity = PortletEntityRegistry.getPortletEntity(...);

      // portletentityregistry.xml
      〈portlet-entity-registry〉
        〈application id="3"〉  // 对应PortletApplicationEntity
           〈definition-id〉testsuite〈/definition-id〉
           〈portlet id="1"〉  // 对应PortletEntity
              〈definition-id〉testsuite.TestPortlet1〈/definition-id〉
              〈preferences〉
                  〈pref-name〉TestName4〈/pref-name〉
                  〈pref-value〉TestValue4〈/pref-value〉
                  〈read-only〉true〈/read-only〉
              〈/preferences〉
          〈/portlet>
       〈/application>
       〈application id="4"〉
          〈definition-id>testsuite〈/definition-id〉
          〈portlet id="1"〉
              〈definition-id>testsuite.TestPortlet2〈/definition-id〉
              〈preferences〉
                  〈pref-name〉TestName4〈/pref-name〉
                  〈pref-value〉TestValue4〈/pref-value〉
                  〈read-only〉true〈/read-only〉
              〈/preferences〉
          〈/portlet〉
       〈/application〉
     〈/portlet-entity-registry〉
      //要注意这里的applicationid和portletid与pageregistry中的portletid的对应关系。

  // Portlet服务
  PortletFragment.service()

      //load protlet
      PortletContainer.portletLoad(...)

        // 1.取得PortletDefinition, 从portletentityregistry中定义的application中读取portlet定义.
        PortletDefinition def = portletWindow.getPortletEntity().getPortletDefinition();

        // portlet.xml
        〈portlet-app〉   // 对应PortletApplicationDefinition
           〈portlet〉     // 对应PortletDefinition
              〈description〉TestSuiteDescription〈/description〉
              〈portlet-name〉TestPortlet1〈/portlet-name〉
              〈display-name〉Test Portlet #1〈/display-name〉

              〈portlet-class〉org.apache.Pluto.portalImpl.portlet.TestPortlet〈/portlet-class〉

              〈init-param>
                  〈name〉config〈/name〉
                  〈value〉/WEB-INF/testsuite-config.xml〈/value〉
              〈/init-param〉

              〈supports〉
                  〈mime-type〉text/html〈/mime-type〉
                  〈portlet-mode〉VIEW〈/portlet-mode〉
                  〈portlet-mode〉EDIT〈/portlet-mode〉
                  〈portlet-mode〉HELP〈/portlet-mode〉
              〈/supports〉

              〈portlet-info〉
                    〈title〉Test Portlet #1〈/title〉
                    〈short-title〉Test #1〈/short-title〉
                    〈keywords〉Test,Testing〈/keywords〉
              〈/portlet-info>

              〈security-role-ref〉
                  〈role-name〉PlutoTestRole〈/role-name〉
                  〈role-link〉tomcat〈/role-link〉
              〈/security-role-ref〉
           〈/portlet〉
        〈portlet-app〉

        // 2.取得PortletInvoker
        PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(def);

        // 3.执行load操作
        invoker.load(renderRequest, renderResponse)

      // render Portlet
      PortletContainer.renderPortlet(...);

        // 1. 取得PortletInvoker
        PortletInvoker invoker = PortletInvokerAccess.getPortletInvoker(...);

        // 2. 执行render操作。
        invoker.render(renderRequest, renderResponse);

      // 处理Title, support modes,

  // Portlet调用.
  ProtletInvoker.invoke(...)

      // 取得Portlet应用的dispatcher.
      ServletDefinition servletDefinition = portletDefinition.getServletDefinition();
      ServletContext servletContext = servletConfig.getServletContext();
      RequestDispatcher dispatcher = servletDefinition.getRequestDispatcher(servletContext);

      // 设置属性, METHOD_ID为别对应load, render和action。
      servletRequest.setAttribute(Constants.METHOD_ID, methodID);
      servletRequest.setAttribute(Constants.PORTLET_REQUEST, portletRequest);
      servletRequest.setAttribute(Constants.PORTLET_RESPONSE, portletResponse);

      // 调用Portlet 
      dispatcher.include(servletRequest, servletResponse);

四、Portlet处理流程

  在Portlet应用的web.xml中,定义了PortletServlet为Portlet的Servlet,它由dispatch方法统一进行请求处理.

  PortletServlet.dispatch(...)

     // 设置portletConfig.
     request.setAttribute(org.apache.Pluto.Constants.PORTLET_CONFIG, portletConfig);

     Integer method_id = (Integer)request.getAttribute(Constants.METHOD_ID);
     if (method_id == Constants.METHOD_RENDER)
     {
         renderRequest = (RenderRequest)request.getAttribute(Constants.PORTLET_REQUEST);
         renderResponse = (RenderResponse)request.getAttribute(Constants.PORTLET_RESPONSE);

         // prepare container objects to run in this webModule
         prepareRenderRequest(renderRequest, request);
         prepareRenderResponse(renderResponse, request, response);

         portletClass.render(renderRequest,renderResponse);
     }
     else if (method_id==org.apache.Pluto.Constants.METHOD_ACTION)
     {
         actionRequest = (ActionRequest)request.getAttribute(Constants.PORTLET_REQUEST);
         actionResponse = (ActionResponse)request.getAttribute(Constants.PORTLET_RESPONSE);

         // prepare container objects to run in this webModule
         prepareActionRequest(actionRequest, request);
         prepareActionResponse(actionResponse, request, response);

         portletClass.processAction(actionRequest,actionResponse);
     }
     else if (method_id == org.apache.Pluto.Constants.METHOD_NOOP)
     {
         //nothing to do
     }
     //注: portletClass即为portlet的具体实现类。

     至此,请求就由portlet进行处理了。

从上面的流程可以看出,Pluto就是将请求分派到页面上的各个portlet,portlet根据method执行相应操作,

最后由Pluto将它们处理的结果按特定布局进行显示。

 

分享到:
评论
1 楼 billy_zh 2006-12-01  
测试一下回复~

相关推荐

    ABB安全控制器PLUTO编程手册

    - **序列控制**:实现程序流程控制的关键技术。 - **字操作码**:涉及寄存器编址、操作及系统寄存器的使用。 - **模拟值处理**:针对模拟信号的特殊处理方式。 #### 文本形式的程序声明 - **程序声明**:规定了程序...

    ABB安全控制器PLUTO功能块手册

    《ABB安全控制器PLUTO功能块手册》:深入解析与应用指南 标题:“ABB安全控制器PLUTO功能块手册”概述了一本详细的指导书籍,专门针对ABB的PLUTO安全控制器中的功能块进行阐述。这本书旨在帮助工程师、技术人员和...

    plutosdr-fw-v0.31.zip

    固件是设备内部控制硬件行为的软件,它决定了设备的功能和性能。定期更新固件可以修复已知问题,增加新特性,提高设备的稳定性和兼容性。对于PLUTOSDR这样的SDR设备,固件更新可能涉及射频(RF)性能优化、新的调制...

    Windows Drivers for PlutoSDR.pdf

    ### Windows 驱动程序安装指南:针对 PlutoSDR 的详解 #### 一、概述 在本篇文章中,我们将深入探讨如何为 Analog Devices 公司的 PlutoSDR 设备安装 Windows 10 驱动程序。PlutoSDR 是一款高性能的软件定义无线电...

    Pluto-SP-R2017b.zip

    对于Pluto SDR来说,这个支持包可能包括了驱动程序、接口库以及相关的示例代码,使得用户能够在Matlab环境中方便地控制和利用Pluto硬件进行实验和开发。 至于“R2017b”,这是Matlab的一个版本号,表示该支持包是为...

    struts2_portlet_pluto_demo

    Struts2的核心是Action类,它处理用户的请求,并通过配置文件或注解来决定控制流程。此外,Struts2还支持拦截器、结果类型、动态方法调用等功能,增强了其可扩展性和灵活性。 **Portlet和Pluto Portlet Container**...

    Pluto_QAM.rar_matlab pluto_pluto_pluto matlab

    从压缩包子文件的文件名"Pluto_QAM.m"来看,这是一个Matlab脚本文件,很可能包含了实现Pluto编码和QAM调制的函数或完整程序。在Matlab中,.m文件通常包含用户定义的函数或脚本,用于执行特定任务。 为了理解并实现...

    PlutoSDR_SupportPackages_2018b.zip

    2. 驱动程序:这些是与PlutoSDR通信所需的实际硬件接口代码,可能包括C语言编写的库,这些库被MATLAB调用来控制硬件。 3. MATLAB接口:一组预定义的MATLAB函数和类,允许用户在MATLAB环境中调用PlutoSDR的功能,如...

    PLUTO安全PLC编程手册V13B.pdf

    《PLUTO安全PLC编程手册V13B》是ABB公司为用户提供的关于PLUTO安全模块的编程指南,旨在帮助用户理解和使用该设备进行安全控制系统的编程。手册内容详尽,分为两大部分,覆盖了从基础操作到高级特性的全方位指导。 ...

    sdrsharp-plutosdr-0.5.4.zip

    7. **SDRSharp.PlutoSDR.dll**:这是SDR#软件专门为Pluto SDR设计的插件,包含了驱动和控制Pluto SDR的代码。 8. **libiio-sharp.dll**:C#版本的libiio库,使得.NET应用程序可以利用libiio的功能。 9. **README-...

    pluto-2.0.3-bundle

    在软件版本控制中,"2.0.3"表明这是一个主版本2,次版本0,修订版3的迭代。这意味着它是在2.0.0和2.1.0之间的更新,修复了可能存在的bug,或者添加了一些小的功能改进。 在软件开发中,版本号的升级往往伴随着一...

    Portlet - Apache Pluto - Hello World Portlet

    Portlet是一种Web应用程序组件,常用于构建企业级的portlet容器,如Apache Pluto。Apache Pluto是Java Portlet规范的开源实现,它提供了一个portlet容器,使得开发者可以创建和部署portlet应用。在本文中,我们将...

    PLUTO 编程手册

    - 阐述了AS-i通信协议在PLUTO中的应用,包括配置步骤、通信流程等。 #### 四、项目管理 ##### 4.1 项目创建 - 介绍了如何通过PlutoManager创建新的项目,包括设置项目名称、选择设备型号等步骤。 ##### 4.2 项目...

    pluto2.rar_pluto2

    在"pluto2.c"中,可能会看到对GPIO(General Purpose Input/Output)的控制,中断处理,内存管理,以及可能涉及到的编解码算法。 标签"pluto2"可能是这个项目或者设备的内部标识,用于区分不同的版本或迭代。在...

    基于matlab AppDesigner的扫描式ADALM-PLUTO频谱分析、标量网络分析仪.zip

    - **SDR原理**:理解ADALM-PLUTO的工作原理,以及如何通过编程控制它进行频谱扫描。 - **网络分析**:学习如何计算标量网络参数,如反射系数、驻波比和S参数。 - **数据可视化**:掌握如何使用MATLAB的绘图功能展示...

    Struts2 + Pluto + portletV1.0(JSR 168) CRUD Demo

    Struts2是基于Model-View-Controller (MVC)架构模式的Java Web框架,它提供了一种组织应用程序结构和控制流程的方式。Struts2的特点包括强大的拦截器机制、灵活的配置、丰富的UI组件以及对Ajax的支持。在这个示例中...

    2018a_PLUTO.zip

    对于PLUTO这样的SDR平台来说,这样的支持包至关重要,因为它确保了软件与硬件之间的通信流畅,使用户能够通过MATLAB控制实际的无线电硬件。 “matlab2018a”是这个离线包兼容的MATLAB版本。这意味着,如果用户使用...

    Portlet规范之Pluto实现的运用

    `PortletContext`提供了许多方法来管理Portlet的应用程序级别的数据。开发者可以通过`PortletContext`来设置或获取全局范围内的属性,这些属性对于整个Portlet应用来说是可见的。 #### 6. PortletRequestPortlet...

    开发portal必备pluto2.02

    在Web应用程序开发领域,尤其是企业级门户构建中,Pluto扮演着重要的角色。标题中的"开发portal必备pluto2.02"强调了Pluto 2.0.2版本对于门户开发的重要性。这个版本可能是稳定版或具有特定功能改进的版本,对于...

Global site tag (gtag.js) - Google Analytics