Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents

一、特殊名词介绍

二、接口/方法/对象源码——【FineReport

...

V10 2018-

...

07-

...

30】

Code Block
languagejava
themeEclipse
firstline1
titleRequestCMDReceiver.java
linenumberstrue
package com.fr.stable.web;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by richie on 16/8/9.
 * 请求接收器
 */
public interface RequestCMDReceiver {

    /**
     * cmd参数值
     * @return cmd参数值
     */
    String getCMD();

    /**
     * 执行
     * @param req http请求
     * @param res http应答
     * @param sessionID 会话ID
     * @throws Exception 处理失败则抛出异常
     */
    void actionCMD(HttpServletRequest req, HttpServletResponse res,
                   String sessionID) throws Exception;

    /**
     * 执行请求
     * @param req http请求
     * @param res http响应
     * @throws Exception 处理失败则抛出异常
     */
    void actionCMD(HttpServletRequest req, HttpServletResponse res) throws Exception;
}
Code Block
languagejava
themeEclipse
firstline1
titleFilter.java
linenumberstrue
package com.fr.web.struct;

import com.fr.common.annotations.Open;

@Open
public interface Filter {

    boolean accept();

}


三、接口/方法/对象说明

关于@Open注解,可以查看链接:3种插件中较为稳定的接口说明

在早期的帆软报表产品中,所有的服务请求都是通过op和cmd参数来指定的。这个接口也就是基于这个设定产生的早期接口。不独立使用,常用来配合WebService接口实现web服务的申明。

String getCMD其中 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.CLASS

...

方法指定了该请求具体绑定的cmd参数。需要注意的是,同一个op下的每一个cmd不能重复,一旦重复分发器先匹配到哪个cmd就执行哪个。

void actionCMD(HttpServletRequest req, HttpServletResponse res,String sessionID) 和 void actionCMD(HttpServletRequest req, HttpServletResponse res) 两个方法中并不是都要实现的,需要根据我们的场景选择其中一个实现

如果我们分发器使用的是WebActionsDispatcher.dealForActionNoSessionIDCMD则我们直接实现RequestCMDReceiver派生的NoSessionActionCMD即可,只用实现其中的void actionCMD(HttpServletRequest req, HttpServletResponse res) 即可。

否则选择实现void actionCMD(HttpServletRequest req, HttpServletResponse res,String sessionID)

四、常用链接

demo地址:demo-web-service

com.fr.web.core.ActionNoSessionCMD

com.fr.stable.fun.RequestInterceptor

com.fr.web.core.WebActionsDispatcher

根据FileType读取到的字符串,并不一定是最终的JS数据,其中可以使用  ${FineReport的公式/部分系统环境参数}  这样的表达式来进行脚本的动态生成。比如一些链接什么的。所以在转换成最终JS脚本时,提供了两种解析的方法声明。

开发者需要根据开始时的具体场景需要来选择,能不使用公式解析就不要使用,以节省资源的开销。

...

ParserType.DYNAMIC

...

StylePath style(RequestClient req) 方法是与ScriptPath script(RequestClient req) 相对应的获取样式文件声明的接口,其构造与ScriptPath一致。差异仅仅是ScriptPath生成的最终是JS脚本,而StylePath生成的最终是样式文件。相关参数含义不再赘述。

Filter filter()方法,表示的是接口实际被调用时,是否需要生效该接口对应的web组件资源(JS/样式)。绝大部分场景也用不到这个方法,直接使用缺省的实现即可。

需要注意的是,虽然插件接口中大部分时候都是声明返回的是一个Atom对象,但是实际开发插件的时候,要求所有插件均需要使用Component或AssembleComponent,以减少插件未来兼容的难度。

当插件内部声明的web组件,如果允许对其进行再次扩展,则需要该组件实现AssembleComponent接口。

...

五、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。