一、初始化流程
//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将它们处理的结果按特定布局进行显示。
分享到:
相关推荐
- **序列控制**:实现程序流程控制的关键技术。 - **字操作码**:涉及寄存器编址、操作及系统寄存器的使用。 - **模拟值处理**:针对模拟信号的特殊处理方式。 #### 文本形式的程序声明 - **程序声明**:规定了程序...
《ABB安全控制器PLUTO功能块手册》:深入解析与应用指南 标题:“ABB安全控制器PLUTO功能块手册”概述了一本详细的指导书籍,专门针对ABB的PLUTO安全控制器中的功能块进行阐述。这本书旨在帮助工程师、技术人员和...
固件是设备内部控制硬件行为的软件,它决定了设备的功能和性能。定期更新固件可以修复已知问题,增加新特性,提高设备的稳定性和兼容性。对于PLUTOSDR这样的SDR设备,固件更新可能涉及射频(RF)性能优化、新的调制...
### Windows 驱动程序安装指南:针对 PlutoSDR 的详解 #### 一、概述 在本篇文章中,我们将深入探讨如何为 Analog Devices 公司的 PlutoSDR 设备安装 Windows 10 驱动程序。PlutoSDR 是一款高性能的软件定义无线电...
对于Pluto SDR来说,这个支持包可能包括了驱动程序、接口库以及相关的示例代码,使得用户能够在Matlab环境中方便地控制和利用Pluto硬件进行实验和开发。 至于“R2017b”,这是Matlab的一个版本号,表示该支持包是为...
Struts2的核心是Action类,它处理用户的请求,并通过配置文件或注解来决定控制流程。此外,Struts2还支持拦截器、结果类型、动态方法调用等功能,增强了其可扩展性和灵活性。 **Portlet和Pluto Portlet Container**...
从压缩包子文件的文件名"Pluto_QAM.m"来看,这是一个Matlab脚本文件,很可能包含了实现Pluto编码和QAM调制的函数或完整程序。在Matlab中,.m文件通常包含用户定义的函数或脚本,用于执行特定任务。 为了理解并实现...
2. 驱动程序:这些是与PlutoSDR通信所需的实际硬件接口代码,可能包括C语言编写的库,这些库被MATLAB调用来控制硬件。 3. MATLAB接口:一组预定义的MATLAB函数和类,允许用户在MATLAB环境中调用PlutoSDR的功能,如...
《PLUTO安全PLC编程手册V13B》是ABB公司为用户提供的关于PLUTO安全模块的编程指南,旨在帮助用户理解和使用该设备进行安全控制系统的编程。手册内容详尽,分为两大部分,覆盖了从基础操作到高级特性的全方位指导。 ...
7. **SDRSharp.PlutoSDR.dll**:这是SDR#软件专门为Pluto SDR设计的插件,包含了驱动和控制Pluto SDR的代码。 8. **libiio-sharp.dll**:C#版本的libiio库,使得.NET应用程序可以利用libiio的功能。 9. **README-...
在软件版本控制中,"2.0.3"表明这是一个主版本2,次版本0,修订版3的迭代。这意味着它是在2.0.0和2.1.0之间的更新,修复了可能存在的bug,或者添加了一些小的功能改进。 在软件开发中,版本号的升级往往伴随着一...
Portlet是一种Web应用程序组件,常用于构建企业级的portlet容器,如Apache Pluto。Apache Pluto是Java Portlet规范的开源实现,它提供了一个portlet容器,使得开发者可以创建和部署portlet应用。在本文中,我们将...
- 阐述了AS-i通信协议在PLUTO中的应用,包括配置步骤、通信流程等。 #### 四、项目管理 ##### 4.1 项目创建 - 介绍了如何通过PlutoManager创建新的项目,包括设置项目名称、选择设备型号等步骤。 ##### 4.2 项目...
在"pluto2.c"中,可能会看到对GPIO(General Purpose Input/Output)的控制,中断处理,内存管理,以及可能涉及到的编解码算法。 标签"pluto2"可能是这个项目或者设备的内部标识,用于区分不同的版本或迭代。在...
- **SDR原理**:理解ADALM-PLUTO的工作原理,以及如何通过编程控制它进行频谱扫描。 - **网络分析**:学习如何计算标量网络参数,如反射系数、驻波比和S参数。 - **数据可视化**:掌握如何使用MATLAB的绘图功能展示...
Struts2是基于Model-View-Controller (MVC)架构模式的Java Web框架,它提供了一种组织应用程序结构和控制流程的方式。Struts2的特点包括强大的拦截器机制、灵活的配置、丰富的UI组件以及对Ajax的支持。在这个示例中...
对于PLUTO这样的SDR平台来说,这样的支持包至关重要,因为它确保了软件与硬件之间的通信流畅,使用户能够通过MATLAB控制实际的无线电硬件。 “matlab2018a”是这个离线包兼容的MATLAB版本。这意味着,如果用户使用...
`PortletContext`提供了许多方法来管理Portlet的应用程序级别的数据。开发者可以通过`PortletContext`来设置或获取全局范围内的属性,这些属性对于整个Portlet应用来说是可见的。 #### 6. PortletRequestPortlet...
在Web应用程序开发领域,尤其是企业级门户构建中,Pluto扮演着重要的角色。标题中的"开发portal必备pluto2.02"强调了Pluto 2.0.2版本对于门户开发的重要性。这个版本可能是稳定版或具有特定功能改进的版本,对于...