背景:
工程框架里的短信功能,有个模版配置,模版配置里会根据客户信息设置相应的参数,源框架别人开发用的是正则表达式加String.replace(),实在太不灵活,太low。
能力有限,只有下面这个笨拙的方法(有大牛经过,望止步指点一二)
工具
- Freemarker 2.3.0
- Eclipse(JDK1.7)
下面直接贴代码,大家觉得有用,直接搬砖,有更好的改造,希望可以共享,支持开源精神。
FreemarkerTest.java
import java.io.IOException;
import java.io.StringWriter;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.utility.NullArgumentException;
public class FreemarkerTest {
private static String REPLACEERROR = "替换失败,请检查参数是否有误" ;
private static Configuration cfg;
private static StringTemplateLoader stl;
static {
cfg = new Configuration(Configuration.VERSION_2_3_0);
stl = new StringTemplateLoader();
}
/**
* 单个模版,单个对象属性替换
*
* @throws NullArgumentException
*
* @param tempname 模版名称,唯一标示
* @param stringtemp 模版字符串
* @param object 模版属性的类对象
* @return 替换后生成的字符串
*/
public static String stringTemplateReplaceForObject(String tempname, String stringtemp, Object object) {
if (stringtemp == null || stringtemp.length() <= 0) {
throw new NullArgumentException("替换模版为空,不允许!");
}
if (object == null) {
throw new NullArgumentException("替换对象不要传空!");
}
try {
stl.putTemplate(tempname, stringtemp);
cfg.setTemplateLoader(stl);
Template template = cfg.getTemplate(tempname);
StringWriter writer = new StringWriter() ;
template.process(object, writer);
return writer.toString();
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return REPLACEERROR;
}
/**
* 模版二次替换,需与stringTemplateReplaceForObject(xxx,xxx,xxx)方法结合使用,不然会出现不存在指定的模版异常
*
* @see #stringTemplateReplaceForObject(String, String, Object)
*
* @param tempname 模版名称
* @param object 替换的对象
* @return 替换后生成的字符串
*/
public static String stringTempReplaceToTempNameForObject(String tempname, Object object) {
try {
Template template = cfg.getTemplate(tempname);
StringWriter writer = new StringWriter() ; // StringWriter会缓存,不能设置为全局
template.process(object, writer);
return writer.toString();
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
return REPLACEERROR;
}
}
测试
public static void main(String[] args) throws Exception{
Person person = new Person() ;
person.setName("替换成张三");
String s = FreemarkerTest.stringTemplateReplaceForObject("person", "hello:${name}", person);
System.out.println(s);
Student student = new Student();
student.setAge(25);
Map<String,Object> map = new HashMap<>() ;
map.put("person", person);
map.put("student", student);
s = FreemarkerTest.stringTemplateReplaceForObject("student", "人的名字是:${person.name},学生年龄:${student.age}", map);
System.out.println(s);
person.setName("把名字换成李四");
s= FreemarkerTest.stringTempReplaceToTempNameForObject("person",person);
System.out.println(s);
}
网友评论