package com.haogrgr.test.util; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; /** * 基于字符串替换的简单模板 * <p>Description: 基于字符串替换的简单模板</p> * <p>Author: desheng.tu</p> * <p>Date: 2014年4月18日</p> */ public class SimpleTempletUtil { public static final String DEFAULT_SPLIT = "$$"; public static void main(String[] args) { Set<String> paramNames = getParamNames("dddd$$aaa$$$$bbb$$ccc$$", "$$"); System.out.println(paramNames); Map<String, Object> context = new HashMap<String, Object>(); context.put("name", "haogrgr"); context.put("order", new Object()); String render = render("你好$$name$$, 您的订单号 $$order$$ 已经发货!", context); System.err.println(render); } /** * 使用context中对应的值替换templet中用$$包围的变量名(也是context的key) * @param templet 模板 * @param context 用于替换模板中的变量 * @return 例如 参数 : dddd$$aaa$$$$bbb$$ccc$$, $$, {<aaa, value1>, <bbb, value2>} 结果:ddddvalue1value2ccc$$ */ public static String render(String templet, Map<String, ?> context) { return render(templet, DEFAULT_SPLIT, context); } /** * 使用context中对应的值替换templet中用split包围的变量名(也是context的key) * @param templet 模板 * @param split 用于标识变量名的标志 * @param context 用于替换模板中的变量 * @return 例如 参数 : dddd$$aaa$$$$bbb$$ccc$$, $$, {<aaa, value1>, <bbb, value2>} 结果:ddddvalue1value2ccc$$ */ public static String render(String templet, String split, Map<String, ?> context) { if(context == null || context.size() == 0){ return templet; } if(templet == null || templet.trim().length() == 0){ return null; } Set<String> paramNames = getParamNames(templet, split); for (String name : paramNames) { Object obj = context.get(name); if(obj == null){ obj = ""; } String regex = "\\Q" + split + name + split + "\\E"; templet = templet.replaceAll(regex, obj.toString()); } return templet; } /** * 根据分割符从模板中取得变量的名字($$变量名$$) eg: * $$aaa$$$$bbb$$ccc$$ 返回 aaa,bbb * @param templet 模板 * @param split 包围变量名的字符串 * @return 模板中的变量名 */ public static Set<String> getParamNames(String templet, String split) { Set<String> paramNames = new HashSet<String>(); int start = 0, end = 0; while (end < templet.length()) { start = templet.indexOf(split, end); if (start == -1) { break; } start = start + split.length(); end = templet.indexOf(split, start); if (end == -1) { break; } String param = templet.substring(start, end); paramNames.add(param); //System.out.println(param + "===" + start + "===" + end); end = end + split.length(); } return paramNames; } }