想起以前做过一个项目,根据对周围环境的温湿度实时监控,以及当时的设备开启状态,分析数据,推送一组最最优设备启动推荐信息,其实感觉和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中需要替换的字段,然后根据得到的信息进行解析替换