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

Page tree

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

Skip to end of metadata
Go to start of metadata

接口作用

在报表运行时,将额外的参数传递给模板进行参与后续的运算。

接口内容

RequestParameterCollector
package com.fr.stable.fun;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * @author : richie
 * @since : 8.0
 */
public interface RequestParameterCollector extends Level {

    String XML_TAG = "RequestParameterCollector";

    int CURRENT_LEVEL = 1;

    /**
     * 从HTTP会话中获取所有的参数
     *
     * @param req HTTP请求
     * @return 参数集合
     */
    Map<String, Object> getParametersFromSession(HttpServletRequest req);

    /**
     * 从HTTP请求的属性中获取所有参数
     *
     * @param req HTTP请求
     * @return 参数集合
     */
    Map<String, Object> getParametersFromAttribute(HttpServletRequest req);

    /**
     * 从HTTP请求的属性中获取所有参数
     *
     * @param req HTTP请求
     * @return 参数集合
     */
    Map<String, Object> getParametersFromReqInputStream(HttpServletRequest req);

    /**
     * 根据特定的参数获取所有参数
     *
     * @param req HTTP请求
     * @return 参数集合
     */
    Map<String, Object> getParametersFromParameter(HttpServletRequest req);

    /**
     * 从JSON数据中获取所有参数
     *
     * @param req HTTP请求
     * @return 参数集合
     */
    Map<String, Object> getParametersFromJSON(HttpServletRequest req, Map<String, Object> parameterMap);
}

默认实现

DefaultRequestParameterCollector
package com.fr.web.utils;

import com.fr.general.FRLogger;
import com.fr.general.GeneralUtils;
import com.fr.general.IOUtils;
import com.fr.general.http.HttpClient;
import com.fr.general.web.ParameterConsts;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.stable.CodeUtils;
import com.fr.stable.EncodeConstants;
import com.fr.stable.StringUtils;
import com.fr.stable.fun.impl.AbstractRequestParameterCollector;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.InputStream;
import java.net.URLDecoder;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * @author : richie
 * @since : 8.0
 */
public class DefaultRequestParameterCollector extends AbstractRequestParameterCollector {
    private static DefaultRequestParameterCollector instance;

    public static synchronized DefaultRequestParameterCollector getInstance() {
        if (instance == null) {
            instance = new DefaultRequestParameterCollector();
        }
        return instance;
    }

    public Map<String, Object> getParametersFromSession(HttpServletRequest req) {
        HttpSession session = req.getSession(false);
        Map<String, Object> map = new HashMap<String, Object>();
        if (session == null) {
            return map;
        }
        Enumeration hsessionEnum = session.getAttributeNames();
        while (hsessionEnum.hasMoreElements()) {
            Object nextElem = hsessionEnum.nextElement();
            String decodedElem = CodeUtils.decodeText("" + nextElem);

            map.put(decodedElem.toUpperCase(), session.getAttribute("" + nextElem));
        }
        return map;
    }

    public Map<String, Object> getParametersFromAttribute(HttpServletRequest req) {
        Map<String, Object> map = new HashMap<String, Object>();
        Enumeration attrEnum = req.getAttributeNames();
        while (attrEnum.hasMoreElements()) {
            Object nextElem = attrEnum.nextElement();
            String decodedElem = CodeUtils.decodeText("" + nextElem);

            try {
                if (map.containsKey(decodedElem.toUpperCase())) {
                    map.remove(decodedElem.toUpperCase());
                }
                map.put(decodedElem, WebUtils.getHTTPRequestParameter(req, "" + nextElem));
            } catch (Exception e) {
                // alex: do nothing
            }
        }
        return map;
    }

    public Map<String, Object> getParametersFromParameter(HttpServletRequest req) {
        Map<String, Object> parameterMap = new HashMap<String, Object>();
        Enumeration paramEnum = req.getParameterNames();
        while (paramEnum.hasMoreElements()) {
            Object nextElem = paramEnum.nextElement();
            String decodedElem = CodeUtils.decodeText("" + nextElem);

            try {
                if (parameterMap.containsKey(decodedElem.toUpperCase())) {
                    parameterMap.remove(decodedElem.toUpperCase());
                }
                parameterMap.put(decodedElem, WebUtils.getHTTPRequestParameter(req, "" + nextElem));
                if ("reportlet".equalsIgnoreCase(decodedElem)) {
                    parameterMap.put("reportName", WebUtils.getHTTPRequestParameter(req, "" + nextElem));
                }
                if ("formlet".equalsIgnoreCase(decodedElem)) {
                    parameterMap.put("formletName", WebUtils.getHTTPRequestParameter(req, "" + nextElem));
                }

                if("chartlet".equalsIgnoreCase(decodedElem)){
                    parameterMap.put("chartName", WebUtils.getHTTPRequestParameter(req, "" + nextElem));
                }
                //如果是encode后的中文参数名, 这边再放一个decode的进去
                parameterMap.put(URLDecoder.decode(decodedElem, EncodeConstants.ENCODING_UTF_8), WebUtils.getHTTPRequestParameter(req, "" + nextElem));
            } catch (Exception e) {
                // alex: do nothing
            }
        }
        return parameterMap;
    }

    public Map<String, Object> getParametersFromJSON(HttpServletRequest req, Map<String, Object> parameterMap) {
        Map<String, Object> map = new HashMap<String, Object>();
        Object typeSensitiveParameter = parameterMap.get(ParameterConsts.__PARAMETERS__);
        if (typeSensitiveParameter instanceof String) {
            try {
                map = GeneralUtils.jsonString2Map((String) typeSensitiveParameter);
                // alex:如果可以正确转成java.util.Map,说明是符合标准格式的JSON
                // shoc:用户使用了同名的session和模板参数的话,优先用报表定义的参数值,bug31092
                Iterator iter = map.entrySet().iterator();
                while (iter.hasNext()) {
                    Map.Entry entry = (Map.Entry) iter.next();
                    String key = (String) entry.getKey();
                    if (parameterMap.containsKey(key.toUpperCase())) {
                        parameterMap.remove(key.toUpperCase());
                    }
                }
                parameterMap.remove(ParameterConsts.__PARAMETERS__);
            } catch (JSONException e) {
                FRLogger.getLogger().error(e.getMessage(), e);
            }
        }
        return map;
    }

   /**
    *
    * @since 2014-9-25
    * @category TODO:
    *
    * @see com.fr.stable.fun.RequestParameterCollector#getParametersFromReqInputStream(javax.servlet.http.HttpServletRequest)
    * 
    */
   public Map<String, Object> getParametersFromReqInputStream(HttpServletRequest req) {
      Map<String, Object> map = new HashMap<String, Object>();
      InputStream in;
      try {
         String paraJson = (String) req.getAttribute(HttpClient.CLOSED);
         if(paraJson == null){
            in = req.getInputStream();
            
            if(in == null){
               return map;
            }
            paraJson = IOUtils.inputStream2String(in);
            //做个标记
            req.setAttribute(HttpClient.CLOSED, paraJson);
         }
         
         if(StringUtils.isEmpty(paraJson)){
            return map;
         }
         
         JSONObject jo = new JSONObject(paraJson);
         Iterator<String> it = jo.keys();
         while (it.hasNext()) {
            String key = it.next();
            map.put(key, jo.get(key));
         }
      } catch (Exception e) {
      } catch (Error e){
      }
      
      return map;
   }
}

注册方式

<extra-core>
   <RequestParameterCollector class="com.fr.plugin.xxx.youclassname"/>
</extra-core>
  • No labels