1.相关目录及文件
- web目录,是扩展插件的根目录。web目录,是插件的根目录。
- META-INF目录,是扩展插件的配置文件和相关的类存放位置,类似于Java INF目录,是插件的配置文件和相关的类存放位置,类似于Java Web项目的WEB-INF目录的作用。
- classes:包含扩展插件中类文件编译后的class文件(可选)。classes:包含插件中类文件编译后的class文件(可选)。
- lib目录:扩展插件引用到的类库。Smartbi已经包括的类库,不应该放在此目录中(可选)。lib目录:插件引用到的类库。Smartbi已经包括的类库,不应该放在此目录中(可选)。
- applicationContext.xml:扩展插件Spring配置文件(可选)。xml:插件Spring配置文件(可选)。
- extension.xml:扩展插件配置文件(必选)。xml:插件配置文件(必选)。
面板 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
|
- vision目录,是前端文件存放位置。
- img目录:资源图片存放目录(可选)。
- js目录:javascript前端文件存放目录(可选)。
- js\ext\ConfigurationPatch.js:前端配置文件,多个扩展插件会自动合并(可选)。js:前端配置文件,多个插件会自动合并(可选)。
注意 |
---|
注意:vision目录中,同路径下的同名文件会替换Smartbi相关文件,因此定制开发的文件一般放到ext目录中。 |
2.相关配置文件
2.1插件声明文件extension.xml(必要)
extension.xml文件是扩展插件的必要声明文件,存放于METAxml文件是插件的必要声明文件,存放于META-INF目录中。
基本要素如下:
属性 | 描述 | 可选与否 |
---|---|---|
name | 扩展插件的名称。插件的名称。 | 必选 |
alias | 扩展插件的别名。插件的别名。 | 必选 |
desc | 扩展插件的描述。插件的描述。 | 必选 |
version | 扩展插件的版本号。插件的版本号。 | 必选 |
priority | 扩展插件的优先级,默认100。值越小,优先级越高。插件的优先级,默认100。值越小,优先级越高。 | 可选 |
before | 用于设置扩展包之间的相对优先级,指明当前扩展包应该在某个指定的扩展包之前加载,该属性配置为另一扩展包extension用于设置插件包之间的相对优先级,指明当前插件包应该在某个指定的插件包之前加载,该属性配置为另一插件包extension.xml文件的name属性值。 | 可选 |
depends | 有时多个扩展包之间会有依赖关系,比如扩展包 有时多个插件包之间会有依赖关系,比如插件包 B 中的 Java 类需要调用扩展包 类需要调用插件包 A 中的方法。 如果直接调用的话,通常会遇到 Caused by: java.lang.NoClassDefFoundError 的错误,提示我们无法找到对应类。 错误的原因是,两个扩展包的 错误的原因是,两个插件包的 Class Loader 是不一样的。 这时我们就需要设置 B 扩展包的 插件包的 depends 属性为 A 扩展包了,也是设置为A的extension插件包了,也是设置为A的extension.xml文件中的name属性值 | 可选 |
enable-jsp-processor | 支持在扩展插件中使用JSP文件。支持在插件中使用JSP文件。 | 可选 |
file-encoding | 声明扩展插件中js、html等文件的编码,默认为UTF声明插件中js、html等文件的编码,默认为UTF-8。 | 可选 |
servlet | 声明扩展插件中的Servlet对象,请参考web声明插件中的Servlet对象,请参考web.xml中的结构,见下例。 | 可选 |
servlet-mapping | 声明Servlet的映射,请参考web.xml中的结构,见下例。 | 可选 |
filter | 声明扩展插件中的Filter对象,请参考web声明插件中的Filter对象,请参考web.xml中的结构,见下例。 | 可选 |
filter-mapping | 声明需要过滤的url映射,请参考web.xml中的结构,见下例。 | 可选 |
代码块 | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
| ||||||||||
<?xml version="1.0" encoding="GBK"?> <extension name="KingbaseSmartbiExtension" alias="KingbaseSmartbiExtension" desc=" SmartbiExtension Samples" version="1.0"> <enable-jsp-processor/> <file-encoding>GBK</file-encoding> <!--servlet定义和servlet-mapping可选--> <servlet> <servlet-name> TestServlet </servlet-name> <servlet-class>bof.extension.test.TestServlet</servlet-class> <init-param> <param-name>x</param-name> <param-value>xv</param-value> </init-param> <init-param> <param-name>y</param-name> <param-value>yv</param-value> </init-param> <!--启动该servlet的优先级--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name> TestServlet </servlet-name> <url-pattern>/TestServlet</url-pattern> </servlet-mapping> <!--filter定义和filter-mapping可选--> <filter> <filter-name>TestFilter</filter-name> <filter-class>bof.extension.test.TestFilter</filter-class> </filter> <filter-mapping> <filter-name>TestFilter</filter-name> <url-pattern>/vision/ssreportServlet</url-pattern> </filter-mapping> </extension> |
2.2Spring声明文件applicationContext.xml(可选)
applicationContext.xml文件是扩展插件中的Spring声明文件,存放于METAxml文件是插件中的Spring声明文件,存放于META-INF目录中。
该文件是可选的。在java代码中调用服务器端SDK提供的接口时不需要本文件;
仅当需要在扩展插件中使用Smartbi内部模块的方法,或将新增模块组件注册到Framework和RMIModule中时(譬如需要在扩展包实现服务端方法供前端使用),才需要定义此文件,详细示例见自定义模块组件(Module)。 仅当需要在插件中使用Smartbi内部模块的方法,或将新增模块组件注册到Framework和RMIModule中时(譬如需要在插件包实现服务端方法供前端使用),才需要定义此文件,详细示例见自定义模块组件(Module)。
使用场景:
1、当需要在扩展包实现服务端方法供前端调用时使用。 1、当需要在插件包实现服务端方法供前端调用时使用。
2、Smartbi使用Spring加载服务器上的组件,因此当扩展插件需要使用到Smartbi内置组件功能时必须增加配置去引用组件,使用Spring进行组件加载。 2、Smartbi使用Spring加载服务器上的组件,因此当插件需要使用到Smartbi内置组件功能时必须增加配置去引用组件,使用Spring进行组件加载。
注意 |
---|
|
Smartbi常用的内置组件说明如下(更多内置组件请见smartbi.war\WEB-INF\applicationContext.xml):
ID | 类型 | 描述 |
---|---|---|
dao | 接口:smartbi.repository.IDAOModule 实现类:smartbi.repository.DAOModule | 处理数据库相关操作。 |
state | 接口:smartbi.state.IStateModule 实现类:smartbi.state.StateModule | 处理会话操作。 |
catalogtree | 接口:smartbi.catalogtree.ICatalogTreeModule 实现类:smartbi.catalogtree.CatalogTreeModule | 处理资源树操作。 |
usermanager | 接口:smartbi.usermanager.IUserManagerModule 实现类:smartbi.usermanager.UserManagerModule | 处理用户管理操作。 |
rmi | 实现类:smartbi.framework.rmi.RMIModule | 声明前端请求对应的模块。 |
framework | 接口:smartbi.framework.IFramework 实现类:smartbi.framework.Framework | 处理模块的升级和激活POJO对象。 |
下面示例重新声明内置对象framework和rmi,用于注册新的组件testExt,这种声明方式并不会完全覆盖产品中的framework和rmi,而是会自动合并到内置对象中的List和Map属性。
代码块 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8" ?> <beans> <bean id="framework" class="bof.framework.Framework" factory-method="getInstance"> <property name="modules"> <map> <entry> <key> <value>TestExt</value> </key> <ref bean="testExt" /> </entry> </map> </property> </bean> <bean id="rmi" class="bof.framework.rmi.RMIModule" factory-method="getInstance"> <property name="modules"> <map> <entry> <key> <value>TestExt</value> </key> <ref bean="testExt" /> </entry> </map> </property> </bean> <bean id="testExt" class="bof.extension.test.TestExtensionModule" factory-method="getInstance" > <!-- 引用内置组件dao,TestExtensionModule中需要有daoModule的get和set --> <property name="daoModule"> <ref bean="dao" /> </property> </bean> </beans> |
2.3扩展点配置文件ConfigurationPatch.js(可选)
在产品中存在一个js配置文件Configuration.js(目录smartbi.war\vision\js\中,了解这个文件大概也能了解产品前端功能框架),扩展包中存在一个可选的扩展配置文件ConfigurationPatch,插件包中存在一个可选的扩展配置文件ConfigurationPatch.js(存放于扩展插件中的visionjs(存放于插件中的vision\js\ext目录中)实际就是对产品Configuration.js文件的扩展,通过配置相应扩展点达到实现某个功能的目的,譬如新增系统选项。
该文件用于配置smartbi提供的修改产品内置功能的JS扩展点,ConfigurationPatch.js包含两个属性,分别是extensionPoints、patches的属性:
1、extensionPoints是客户端扩展点内容的定义,客户端会根据扩展点内容的声明作出相应的处理,Smartbi会自动合并原有Configuration.js和所有扩展插件中的声明。extensionPoints对象支持以下常用属性:js和所有插件中的声明。extensionPoints对象支持以下常用属性:
属性 | 用途 |
---|---|
MainFrame | 可以在MainFrame.actions下添加一级菜单模块。 |
Custom、Manager等 | 在相应一级模块下添加二级模块、任务面板操作入口。 |
CatalogTree | 添加右键菜单。 |
2、Patches提供了更丰富的属性定义,并且可以对extensionPoints中原有定义的属性进行修改。比如修改Smartbi原有扩展点内容,或在指定位置插入新的扩展点。每个Patch对象包含以下属性:
属性 | 描述 |
---|---|
path | 表示该path要修改的Configuration.js中的对象路径。 |
key | 需要替换的键值,可以为数字或者字符串,当operation为appendObject时忽略此项。
|
operation | path的动作,共有以下几种:
|
value | 修改后的值,当operation为remove时忽略此项 |
3、extensionPoints、Patches均为数组,可以定义多个扩展点对象。
说明:Smartbi可供扩展的所有扩展点请参阅"系统扩展点"。
代码块 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
var ConfigurationPatch = { /*调整前端界面:移除一级模块中的定制模块*/ patches: [ { path: "/extensionPoints/Custom/actions", key: 6, operation: "remove" } ], extensionPoints : { /*添加一级模块:在一级模块未尾添加二个模块入口 */ MainFrame : { actions : [ { className :"ext.b.FibonacciAction", groupId :"default" }, { className :"ext.b.NumberSeriesAction", groupId :"default" } ] }, /*添加二级模块:在定制模块的二级模块未尾添加一个模块入口 */ Custom: { actions: [ { className :"ext.b.FibonacciAction", groupId :"default" } ], /*添加任务入口:在数据集定义任务面板中添加一个操作入口 */ DatasetTaskPanel : { config: { handlers:[ {className:"ext.Custom.CustomTaskPanel"} ] } } }, /*编辑菜单项:对"定制"->"展现定制"中资源树的右键菜单项进行编辑 */ CatalogTree: { displayCustomHandler:[{className : "ext.b.DisplayCustom_TreePopupMenuHandler"}] } } }; |
2.4自定义Portlet声明文件portlet.xml(可选)
smartbi有一种资源叫“页面”,Portlet就是可以拖到页面的组件(用户使用时,新建页面>添加资源 页面左侧会有portlet资源,譬如产品带有IPAD分页部件),portlet.xml文件是扩展插件中的自定义portlet声明文件,存放于METAxml文件是插件中的自定义portlet声明文件,存放于META-INF目录中。
Smartbi本身提供web链接、多维分析、复杂报表、指标报表、目录等多种portlet资源。自定义 portlet用于实现产品未支持的资源类型,它必须满足Portlet和PortletEdit的接口规范。
自定义Portlet基本要素:
属性 | 描述 |
---|---|
Title | portlet的默认标题。 |
Icon | portlet在资源树节点上显示的图标,图标文件放在src/web/img/catalogtree目录下。 |
portlet-name | portlet名称,portlet的标识。 |
display-name | portlet显示名称,添加portlet时界面上显示的名称。 |
description | portlet描述信息。 |
is-bof-tree-node | 是否是资源树上的节点对象。 |
portlet-viewer-js-class | 展示界面对应的文件。 |
portlet-editor-js-class | 编辑界面对应的文件。 |
代码块 | ||||||||
---|---|---|---|---|---|---|---|---|
| ||||||||
<?xml version="1.0" encoding="UTF-8" ?> <portlet-app> <portlet title="HelloWorld" icon="HelloWorld.gif"> <portlet-name>HelloWorld</portlet-name> <display-name>HelloWorld</display-name> <description>HelloWorld</description> <is-bof-tree-node>false </is-bof-tree-node> <portlet-viewer-js-class>csdc.HelloWorldPortlet</portlet-viewer-js-class> <portlet-editor-js-class>csdc.HelloWorldPortletEdit</portlet-editor-js-class> </portlet> </portlet-app> |