编写模块

您可以定义全局或特定于主题的包含主题模块的添加项,此主题模块通过主题概要文件适用于不同的作用域。模块使用 plugin.xml 或 JSON 文件定义其添加项。

系统模块
通过使用 plugin.xml 文件作为门户网站类路径中的压缩文件或 Web 模块的组成部分,或者作为 Web 模块的 WEB-INF 目录中的单一文件,可用于系统中所有主题。必须在主题模块的扩展点 com.ibm.portal.resourceaggregator.module 中声明主题模块。
特定于主题的模块
此模块只能由在其 contributions 文件夹中的 JSON 文件中对其进行定义的主题引用。Contributions 文件夹是缺省文件夹,但可以通过在主题上设置 resourceaggregation.contributions.folder 元数据来更改位置,这与 profiles 一样。这些文件由系统进行自动扫描,并且为主题注册的添加项。
XML 模式

下图描述了此扩展点的 XML 模式:

添加项包含添加项类型。

以下代码是 plugin.xml 文件的示例,在此示例中,模块部署在具有上下文根 res:{war:context-root}/ 的 Web 应用程序中。

<extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension1"> 
        <module id="testModule1" version="1.0">

            <capability id="capabilityA" value="1.0.0"/>
            <capability id="capabilityB" value="1.5"/>

            <prereq id="testModuleA"/>
            <prereq id="testModuleB" minVersion="1.2.3.4"/>
            <prereq id="testModuleC" type="optional"/>

            <title lang="en" value="en Module"/>
            <title lang="de" value="de Module"/>
            <title lang="es" value="es Module"/>

            <description lang="en" value="one two three"/>
            <description lang="de" value="ein zwei drei"/>
            <description lang="es" value="uno dos tres"/>

            <contribution type="head">
                <sub-contribution type="css">
                    <uri value="res:{war:context-root}/css/helloWorld.css" />
                    <!-- define alternate styles for right to left -->
                    <uri type="rtl" value="res:{war:context-root}/css/helloWorld_rtl.css" />
                    <!-- define alternate styles for an iPad -->
                    <uri deviceClass="tablet+iOS" value="res:{war:context-root}/css/helloWorld_iPad.css" />
                </sub-contribution>
                <sub-contribution type="js">
                    <uri value="res:{war:context-root}/js/helloWorldHead.js" />
                </sub-contribution>
                <sub-contribution type="markup">
                    <uri value="res:{war:context-root}/markup/helloWorldHead.html" />
                </sub-contribution>
            </contribution>

            <contribution type="config">
                <sub-contribution type="js">
                    <uri value="res:{war:context-root}/js/helloWorldBody_root.js" />
                    <!-- define alternate js for when the Portal is using different languages -->
                    <uri lang="en" value="res:{war:context-root}/js/helloWorldBody_en.js" />
                    <uri lang="de" value="res:{war:context-root}/js/helloWorldBody_de.js" />
                    <uri lang="es" value="res:{war:context-root}/js/helloWorldBody_es.js" />
                    <!-- define alternate js for debugging purposes in LTR and RTL environments -->
                    <uri type="debug" value="res:{war:context-root}/js/helloWorldBody_debug.js" />
                    <uri type="debug,rtl" value="res:{war:context-root}/js/helloWorldBody_debug_rtl.js" />
                </sub-contribution>
                <sub-contribution type="config_dynamic">
                    <uri value="res:{war:context-root}/jsp/helloWorldBodyConfig.jsp" />
                </sub-contribution>
                <sub-contribution type="config_static">
                    <uri value="res:{war:context-root}/jsp/helloWorldBodyStatic.jsp" />
                </sub-contribution>
            </contribution>

            <contribution type="menu">
                <sub-contribution type="json">
                    <uri value="res:{war:context-root}/js/helloWorld.json" />
                </sub-contribution>
            </contribution>

            <contribution type="dyn-cs">
                <sub-contribution type="markup" ref-id="some_dynamic_spot_id">
                    <uri value="res:{war:context-root}/jsp/helloWorldDynamicSpot.jsp" />
                </sub-contribution>
            </contribution>

            <moduleActivation extensionID="com.ibm.portal.resourceaggregator.util.ResourceEnvironmentProviderModuleActivationHandler">
                <parameter name="rep" value="RESOURCE_ENV_PROVIDER_NAME" />
                <parameter name="key" value="KEY_IN_RESOURCE_ENV_PROVIDER"/> 
            </moduleActivation>

            <runtimeActivation>
                <condition deviceClass="tablet"/> 
            </runtimeActivation>

        </module> 
    </extension>

    <extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension2"> 
        <module id="testModule2" version="1.0">
            <!-- Some other module... -->
        </module> 
    </extension>

    <extension point="com.ibm.portal.resourceaggregator.module" id="testModuleExtension3"> 
        <module id="testModule3" version="1.0">
            <!-- One last module... -->
        </module> 
    </extension>

以下代码是 myModules.json 文件的一个示例,此文件存储在主题的 contributions 文件夹中。使用以下规则调整在 plugin.xml 文件中使用的结构、键和值以符合 JSON 格式。

  • 允许在同一个级别中有多个子条目的键以复数形式使用。例如,prereq 变成 prereqs,capability 变成 capabilities。
  • 文件路径以正斜杠开头,且解析为相对于主题根文件夹。
  • 无法在 WebDAV 外部处理 JSP 文件。所有相对于主题根的资源必须为静态类型(例如,js、CSS 或 HTML)。
{
        "modules":[{
            "id":"testModule1",
            "version":"1.0",

            "capabilities":[{
                    "id":"capabilityA",
                    "value":"1.0.0"
                },
                {
                    "id":"capabilityB",
                    "value":"1.5"
                }
            ],

            "prereqs":[{
                    "id":"testModuleA"
                },
                {
                    "id":"testModuleB",
                    "minVersion":"1.2.3.4"
                },
                {
                    "id":"testModuleC",
                    "type":"optional"
                }
            ],

            "titles":[{
                    "lang":"en",
                    "value":"en Module"
                },
                {
                    "lang":"de",
                    "value":"de Module"
                },
                {
                    "lang":"es",
                    "value":"es Module"
                }
            ],

            "descriptions":[{
                    "lang":"en",
                    "value":"one two three"
                },
                {
                    "lang":"de",
                    "value":"ein zwei drei"
                },
                {
                    "lang":"es",
                    "value":"uno dos tres"
                }
            ],

            "contributions":[{
                "type":"head",
                "sub-contributions":[{
                    "type":"css",
                    "uris":[{
                        "value":"/css/helloWorld.css"
                    },
                    // define alternate styles for right to left
                    {
                        "value":"/css/helloWorld_rtl.css",
                        "type":"rtl"
                    },
                    // define alternate styles for an iPad
                    {
                        "value":"/css/helloWorld_iPad.css",
                        "deviceClass":"tablet+iOS"
                    }]
                },
                {
                    "type":"js",
                    "uris":[{
                        "value":"/js/helloWorldHead.js"
                    }]
                },
                {
                    "type":"markup",
                    "uris":[{
                        "value":"/markup/helloWorldHead.html"
                    }]
                }]
            },{
                "type":"config",
                "sub-contributions":[{
                    "type":"js",
                    "uris":[{
                        "value":"/js/helloWorldBody_root.js"
                    },
                    // define alternate js for when the Portal is using different languages
                    {
                        "value":"/js/helloWorldBody_en.js",
                        "lang":"en"
                    },
                    {
                        "value":"/js/helloWorldBody_de.js",
                        "lang":"de"
                    },
                    {
                        "value":"/js/helloWorldBody_es.js",
                        "lang":"es"
                    },
                    // define alternate js for debugging purposes in LTR and RTL environments
                    {
                        "value":"/js/helloWorldBody_debug.js",
                        "type":"debug"
                    },
                    {
                        "value":"/js/helloWorldBody_debug_rtl.js",
                        "type":"debug,rtl"
                    }]
                },
                {
                    "type":"config_dynamic",
                    "uris":[{
                        "value":"/config/helloWorldBodyConfig.js"
                    }]
                },
                {
                    "type":"config_static",
                    "uris":[{
                        "value":"/config/helloWorldBodyStatic.js"
                    }]
                }]
            },{
                "type":"menu",
                "sub-contribution":[{
                    "type":"json",
                    "uris":[{
                        "value":"/js/helloWorld.json"
                    }]
                }]
            },{
                "type":"dyn-cs",
                 "sub-contribution":[{
                    "type":"markup",
                    "ref-id":"some_dynamic_spot_id",
                    "uris":[{
                        "value":"/html/helloWorldDynamicSpot.html"
                    }]
                }]
            }],

            "moduleActivation":{
                "extensionID":"com.ibm.portal.resourceaggregator.util.ResourceEnvironmentProviderModuleActivationHandler",
                "parameters":[{
                    "name":"rep",
                    "value":"RESOURCE_ENV_PROVIDER_NAME"
                },
                {
                    "name":"key",
                    "value":"KEY_IN_RESOURCE_ENV_PROVIDER"
                }]
            },

            "runtimeActivation":[{
                "condition":{
                    "deviceClass":"tablet"
                }
            }]

        },{
            "id":"testModule2",
            "version":"1.0"
            // Some other module...
        },{
            "id":"testModule3",
            "version":"1.0"
            // One last module...
        }]
    }

Web 模块的添加项 URI

{war:context-root}
此变量访存包含的 WAR 文件的上下文根,并将其插入相应位置。它只对定义为 WAR 文件的一部分的模块有效。这不适用于 WebDAV 中定义的模块,或类装入层次结构中的其他某个位置(例如,共享应用程序)。