【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

一、特殊名词介绍

二、接口/方法/对象源码——【FineReport V10 2018-07-30】

WebActionsDispatcher.java
package com.fr.web.core;

import com.fr.general.web.ParameterConstants;
import com.fr.plugin.injectable.PluginModule;
import com.fr.stable.StringUtils;
import com.fr.stable.plugin.ExtraClassManagerProvider;
import com.fr.stable.web.RequestCMDReceiver;
import com.fr.web.utils.WebUtils;

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

/**
 * @author kunsnat E-mail:kunsnat@gmail.com
 * @version 创建时间:2011-12-7 上午10:52:44
 * 类说明: 各种Service请求之后, Action执行中心. 处理各种Action
 */
public class WebActionsDispatcher {

	private static final String PLUGIN_ID = "pid";

	/**
	 * 处理有sessionid的所有cmd对应的请求
	 * 
	 * @param req HTTP请求
	 * @param res HTTP响应
	 * @param sessionID 会话id
	 * @param actions 所有操作
	 * 
	 *
	 * @date 2014-9-25-下午6:12:55
	 *
	 */
	public static void dealForActionCMD(HttpServletRequest req, HttpServletResponse res, 
			String sessionID, RequestCMDReceiver[] actions) throws Exception {
		
		dealForActionDefaultCmd(req, res, sessionID, actions, null);
	}

	/**
	 * 处理拥有默认cmd的对应请求
	 * 
	 * @param req HTTP请求
	 * @param res HTTP响应
	 * @param sessionID 会话id
	 * @param actions 所有操作
	 * @param defaultCmd 默认的操作
	 * 
	 *
	 * @date 2014-9-25-下午6:12:55
	 *
	 */
    public static void dealForActionDefaultCmd(HttpServletRequest req, HttpServletResponse res,
                                               String sessionID, RequestCMDReceiver[] actions, String defaultCmd) throws Exception {
        String cmd = WebUtils.getHTTPRequestParameter(req, "cmd");
        if (StringUtils.isEmpty(cmd)) {
            cmd = defaultCmd;
        }
        dealForActionCMD(req, res, sessionID, actions, cmd);
    }

	/**
	 * 处理有sessionid的cmd对应的请求
	 * 
	 * @param req HTTP请求
	 * @param res HTTP响应
	 * @param sessionID 会话id
	 * @param actions 所有操作
	 * @param cmd 指定的操作
	 * 
	 *
	 * @date 2014-9-25-下午6:12:55
	 *
	 */
	public static void dealForActionCMD(HttpServletRequest req, HttpServletResponse res, String sessionID, RequestCMDReceiver[] actions, String cmd) throws Exception {

        String op = WebUtils.getHTTPRequestParameter(req, ParameterConstants.OP);
		String pluginID = WebUtils.getHTTPRequestParameter(req, PLUGIN_ID);
		ExtraClassManagerProvider pluginProvider = PluginModule.getAgent(PluginModule.ExtraCore);
		RequestCMDReceiver actionCMD = null;
		if (pluginProvider != null) {
			 actionCMD = pluginProvider.getActionCMD(op, cmd, pluginID);
		}
        if (actionCMD != null) {
            actionCMD.actionCMD(req, res, sessionID);
        } else  {
            for (RequestCMDReceiver action : actions) {
                String acceptCmd = action.getCMD();
                if (acceptCmd.equalsIgnoreCase(cmd)) {
                    action.actionCMD(req, res, sessionID);
                    return;
                }
            }
        }
	}

	/**
	 * 处理没有sessionid的cmd对应的请求
	 * 
	 * @param req HTTP请求
	 * @param res HTTP响应
	 * @param actions 所有操作
	 * 
	 *
	 * @date 2014-9-25-下午6:12:55
	 *
	 */
	public static void dealForActionNoSessionIDCMD(HttpServletRequest req, HttpServletResponse res, 
			ActionNoSessionCMD[] actions) throws Exception {

		String op = WebUtils.getHTTPRequestParameter(req, ParameterConstants.OP);

		String cmd = WebUtils.getHTTPRequestParameter(req, "cmd");

		String pluginID = WebUtils.getHTTPRequestParameter(req, PLUGIN_ID);
		ExtraClassManagerProvider pluginProvider = PluginModule.getAgent(PluginModule.ExtraCore);
		RequestCMDReceiver actionCMD = null;
		if (pluginProvider != null) {
			actionCMD = pluginProvider.getActionCMD(op, cmd, pluginID);
		}
        if (actionCMD != null) {
            actionCMD.actionCMD(req, res);
        } else {
            for (ActionNoSessionCMD action : actions) {
                String acceptCmd = action.getCMD();
                if (acceptCmd.equalsIgnoreCase(cmd)) {
                    action.actionCMD(req, res);
                    return;
                }
            }
        }
	}
}


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

该接口主要用于配合WebService接口,对具体的服务请求进行分发处理。分发的所有请求必须是报表请求(view/report或view/form),且包含参数 op 和 cmd

上层的分发器通过op参数找到具体的WebService,然后根据cmd参数把请求分发到具体的Action类处理。

该分发器一共有4个方法可以调用,但是插件开发中用得到的绝大多数情况下只有其中的3种。

RequestCMDReceiver [] actions = new RequestCMDReceiver[]{
        new ActionA(),
        new ActionB()
}
//第一种分发方式,也是最常用的一种方式。这种方式会传入sessionID,主要用于需要根据sessionID获取到当前的报表,根据报表进一步的处理的场景
WebActionsDispatcher.dealForActionCMD( request, response, sessionID, actions);
RequestCMDReceiver [] actions = new RequestCMDReceiver[]{
        new ActionA(),
        new ActionB()
}
//第二种分发方式,功能跟第一种差不多,但主要是用于产品内部兼容一些历史原因导致的没有实现cmd的请求的规范处理。【主要是兼容用,插件里面也很少用】
WebActionsDispatcher.dealForActionDefaultCmd( request, response, sessionID, actions, "cmdA");
ActionNoSessionCMD [] actions = new ActionNoSessionCMD[]{
        new ActionA(),
        new ActionB()
}
//第三种分发方式,调用具体的Action时不会带入sessionID,主要用于报表访问时的一些公共信息的加载。(在8.0/9.0中主要用于决策平台的请求扩展)
WebActionsDispatcher.dealForActionNoSessionIDCMD( request, response, actions);

四、常用链接

配合使用的服务接口介绍:com.fr.stable.fun.Service

配合使用的请求接口介绍:

com.fr.web.core.ActionNoSessionCMD

com.fr.stable.web.RequestCMDReceiver

五、开源案例

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


  • No labels