java中完成消息组装推送

想起以前做过一个项目,根据对周围环境的温湿度实时监控,以及当时的设备开启状态,分析数据,推送一组最最优设备启动推荐信息,其实感觉和freemaker的原理是一样的,挖坑,填数据

        那么你如果按每一种设备的开启进行判断,那么需要太多的if,else去生成你的信息,所以怎么写一个模版,去组装这些需要输出的信息,是特别重要的。

定义构造一个模板

/**
     * 态势变化映射
     */
    private static Map<String,String> TSFX_TYPE_NAMES = new HashMap<String,String>();
    
    /**
     * 静态初
     */
    static 
    {
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_BJGJSX, "当前{showName}已高于{min}{suffix},可能于{t0}秒后上升至{max}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_BJGJXX,"当前{showName}已低于{max}{suffix},可能于{t0}秒后下降至{min}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_DYGJXX, "当前{showName}低于{min}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_DYGJXX_WDSS, "当前{showName}低于{min}{suffix},可能于{t0}秒后上升至{min}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_GYGJSX, "当前{showName}高于{max}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_GYGJSX_WDHJ, "当前{showName}高于{max}{suffix},可能于{t0}秒后下降至{max}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_SSLVGK, "上升速率过快可能于{t0}秒后上升至{s}{suffix}" );
    	TSFX_TYPE_NAMES.put(ScadaConstants.TSFX_XJLVGK, "下降速率过快可能于{t0}秒后下降至{s}{suffix}" );
    }

构造要填入的值

m.put("showName",state.getShowName());
	    		if(state.getVarName().equals("temperature")){
	    			m.put("suffix","℃");
	    		}else if(state.getVarName().equals("humidity")){
	    			m.put("suffix","%");
	    		}else if(state.getVarName().equals("Ia") || state.getVarName().equals("Ib")|| state.getVarName().equals("Ic")){
	    			m.put("suffix","A");
	    		}else{
	    			m.put("suffix","V");
	    		}

根据key获取模版中的语句,

	            	String template = TSFX_TYPE_NAMES.get(alarmType);
	            	String eventInfo = StringUtilsEx.renderTemplate(template,m);

替换模版中的值的方法

/**
	 *  将模板文本中的{varName}形式的部分替换为varName对应的变量值
	 * @param tpl
	 * @param vars
	 * @return
	 */
	public static String renderTemplate(String tpl, Map<String, Object> vars) {
		if (tpl == null || tpl.trim().length() == 0)
			return "";

		if (vars == null || vars.isEmpty())
			return tpl;

		int pos = tpl.indexOf('{');
		if(pos < 0)
			return tpl;
		
		StringBuilder sb = new StringBuilder();
		sb.append(tpl.substring(0,pos));
		while(pos >= 0){
			int endPos = tpl.indexOf('}',pos);
			if(endPos < 0){
				sb.append(tpl.substring(pos));
				break;
			}
			String varName = tpl.substring(pos+1,endPos);
			if(vars.containsKey(varName)){
				Object value = vars.get(varName);
				if(value != null)
					sb.append(value);
			}else{
				// if var is not found, then output in its original form
				sb.append(tpl.substring(pos,endPos+1));
			}
			pos = tpl.indexOf('{',endPos+1);
			if(pos < 0){
				sb.append(tpl.substring(endPos+1));
				break;
			}else{
				sb.append(tpl.substring(endPos+1,pos));
			}
		}
		return sb.toString();
	}

通过以上的代码就可以利用每次不通的结果,调用模版,填入数据进行输出


总结 

     如果输出信息内容模式查不多

           1 定义一个map模版   在value中用特殊符号标注需要替换的  字段,

          2 构造一个map数据,key为上一个map的value中需要替换的字段,然后根据得到的信息进行解析替换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值