【仅供内部供应商使用,不提供对外解答和培训】
【仅供内部供应商使用,不提供对外解答和培训】
无
package com.fr.web.struct; import com.fr.common.annotations.Open; import com.fr.web.struct.browser.RequestClient; import com.fr.web.struct.category.ScriptPath; import com.fr.web.struct.category.StylePath; /** * web端所用到的原子组件 */ @Open public interface Atom { /** * 该原子组件所使用的javascript脚本 * * @return 脚本路径 */ @Deprecated ScriptPath script(); /** * 该原子组件所使用的css样式表 * * @return css路径 */ @Deprecated StylePath style(); /** * 该原子组件所使用的javascript脚本 * * @param req 请求客户端 * @return 脚本路径 */ ScriptPath script(RequestClient req); /** * 该原子组件所使用的css样式表 * * @param req 请求客户端 * @return css路径 */ StylePath style(RequestClient req); /** * 自身的过滤器,根据这个过滤器决定是否输出到web端 * @return 过滤器 */ Filter filter(); }
package com.fr.web.struct; import com.fr.common.annotations.Open; import com.fr.web.struct.browser.RequestClient; import com.fr.web.struct.category.ScriptPath; import com.fr.web.struct.category.StylePath; /** * 原子组件抽象类,用于提供各种兼容 */ @Open public abstract class Component implements Atom { @Override @Deprecated public ScriptPath script() { return ScriptPath.EMPTY; } @Override @Deprecated public StylePath style() { return StylePath.EMPTY; } @Override public ScriptPath script(RequestClient req) { return script(); } @Override public StylePath style(RequestClient req) { return style(); } @Override public Filter filter() { return null; } }
package com.fr.web.struct; import com.fr.common.annotations.Open; /** * 组合组件,可以有多个依赖的原子组件 */ @Open public abstract class AssembleComponent extends Component { /** * 依赖的其他组件组成的数组,需要确保顺序是正确的,排在越前面的组件,越基础,排在后面的组件可以依赖排在前面的组件。 * * @return 依赖的组件数组 */ public abstract Atom[] refer(); /** * 该组件所使用的孩子组件 * * @return 孩子组件数组 */ public Atom[] children() { return new Atom[0]; } }
package com.fr.web.struct; import com.fr.common.annotations.Open; @Open public interface Filter { boolean accept(); }
关于@Open注解,可以查看链接:3种插件中较为稳定的接口说明
其中 ScriptPath script(); 与 StylePath style(); 方法均为废弃接口。仅仅用于兼容保留,开发者在开发的过程中切勿使用!
ScriptPath script(RequestClient req) 方法中入参为 RequestClient 带入当前的浏览器信息,返回值是 ScriptPath 申明一个JS脚本链接。
ScriptPath生成的方法有5种,但是这里只介绍其中的四种,因为第五种插件中很难用得到。
ScriptPath.build( String path, FileType fileType, ParserType parserType );
ScriptPath.build( String path, FileType fileType ); 等同于 ScriptPath.build( String path, FileType fileType, ParserType.PLAIN );
ScriptPath.build( String path, ParserType parserType ); 等同于 ScriptPath.build( String path, FileType.PLAIN, ParserType parserType );
ScriptPath.build( String path ); 等同于 ScriptPath.build( String path, FileType.PLAIN, ParserType.PLAIN );
这四种方法除了提供缺省构建以外,功能完全相同。需要单独介绍的是FileType和ParserType这两个枚举类型的入参的含义。
枚举值 | 说明 |
---|---|
FileType.PLAIN | 文件类型是纯文本类型,读取时直接当作字符串读取进来。绝大部分时候,在插件开发过程中使用的都是这个类型。并且文件类型为PLAIN时,参数path的含义就是脚本文件的包内路径(比如com/fr/plugin/js/main.js) |
FileType.CLASS | 文件的类型为calss类型,读取时以class文件进行读取,且该class必须实现com.fr.gen.TextGenerator接口,通过接口返回js的字符串脚本。在插件中很少有场景会使用到,举例的话比如产品中生成国际化的前端数据的时候,就会用到这个类型。并且文件类型为CLASS时,参数path的含义就是生成脚本字符串的class名(比如com.fr.plugin.js.JsMaker) |
根据FileType读取到的字符串,并不一定是最终的JS数据,其中可以使用 ${FineReport的公式/部分系统环境参数} 这样的表达式来进行脚本的动态生成。比如一些链接什么的。所以在转换成最终JS脚本时,提供了两种解析的方法声明。
开发者需要根据开始时的具体场景需要来选择,能不使用公式解析就不要使用,以节省资源的开销。
枚举值 | 说明 |
---|---|
ParserType.PLAIN | 解析是什么都不做,读取到的文本是什么,就把这段文本当作是最终的JS脚本。 |
ParserType.DYNAMIC | 解析的时候,会对读取到的文本中${}包含的部分进行动态计算得到最终的JS脚本。 |
StylePath style(RequestClient req) 方法是与ScriptPath script(RequestClient req) 相对应的获取样式文件声明的接口,其构造与ScriptPath一致。差异仅仅是ScriptPath生成的最终是JS脚本,而StylePath生成的最终是样式文件。相关参数含义不再赘述。
Filter filter()方法,表示的是接口实际被调用时,是否需要生效该接口对应的web组件资源(JS/样式)。绝大部分场景也用不到这个方法,直接使用缺省的实现即可。
需要注意的是,虽然插件接口中大部分时候都是声明返回的是一个Atom对象,但是实际开发插件的时候,要求所有插件均需要使用Component或AssembleComponent,以减少插件未来兼容的难度。
当插件内部声明的web组件,如果允许对其进行再次扩展,则需要该组件实现AssembleComponent接口。
免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。