有時候就是需要一個很簡單的模板渲染功能,就是一些固定的參數,然後將參數替換掉。如郵件模板、短信模板等等,這些模板內容比較單一,文字不多,變量類型單一,同時沒有上下文的約束。如果我們使用如 velocity 這類模板引擎來做這個事情,相對來說還是重了一點。其實這類功能還是比較簡單的,完全可以手寫。以下是我寫的一個方法,歡迎指正和學習,留言全接。
public class RenderUtils {
private static final Pattern p = Pattern.compile("\\$\\{\\s*([a-zA-Z0-9_\\-]+)\\s*\\}");
public static String renderText(String templateContent, Map<String, String> params) {
if (StringUtils.isBlank(templateContent)) {
return null;
}
if (params == null || params.isEmpty()) {
return templateContent.toString();
}
StringBuffer sb = new StringBuffer();
try {
Matcher matcher = p.matcher(templateContent);
while (matcher.find()) {
int groupCount = matcher.groupCount();
if (groupCount < 1) {
continue;
}
//String group0 = matcher.group(0);
String group1 = matcher.group(1);
String replacement;
if (params.containsKey(group1)) {
replacement = params.get(group1).toString();
} else {
replacement = "[-no value for '" + group1 + "'-]";
}
matcher.appendReplacement(sb, replacement);
}
matcher.appendTail(sb);
} catch (Exception e) {
e.printStackTrace();
return templateContent.toString();
}
return sb.toString();
}
}
這裏的功能不強大,但是夠用。就是將 ${abc} 作爲一個需要替換的內容,一旦參數中有 key=abc 的內容,就會將其替換。
支持 ${abc} 或者 ${ abc }, 中間允許一個或多個空格。