在软件开发中,我们经常需要将数据动态填充到模板中,以生成各种类型的文本输出。Apache Velocity 是一个流行的模板引擎,可以帮助我们实现这一目标。本文将介绍如何使用 Apache Velocity 动态填充模板,并演示一个简单的示例。
引入包
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
代码实现
动态填充表达式为 $对象名.参数名 或者 ${对象名.参数名}
举栗子: $admin.realName 或者 ${admin.realName}
注意:表达式不能存在 换行,空格,特殊符号 等操作破坏完整结构,否则动态填充失败。(本人遇到过前端输入描述自动换行,破坏了完整结构(${admin.real\r\nName})导致动态填充失败的情况)
// 初始化Velocity引擎
VelocityEngine velocityEngine = new VelocityEngine();
velocityEngine.init();
// 创建上下文并添加数据对象
VelocityContext context = new VelocityContext();
//需要的参数对象,可以多个
Admin admin = new Admin();
admin.setRealName("小明");
admin.setMobile("1561561568");
//状态是枚举
admin.setAdminState(AccountState.NORMAL);
context.put("admin", admin);
User user = new User();
user.setRealName("");
user.setMobile(null);
//状态是枚举
user.setUserState(AccountState.NORMAL);
context.put("user", user);
//需要动态填充的字符串,需要填充的参数写法 $admin.realName 或 ${admin.realName}
String content = "管理员名称 $admin.realName \r\n" +
"管理员手机号 ${admin.mobile} \r\n" +
"管理员状态 $admin.adminState.desc \r\n" +
"用户名称 $user.realName \r\n" +
"用户手机号 ${user.mobile} \r\n" +
"用户手机副号 ${user.deputyMobile} \r\n" +
"用户状态 $user.userState.desc";
// 合并模板与上下文
StringWriter writer = new StringWriter();
velocityEngine.evaluate(context, writer, "logTag", content);
System.out.println("动态填充结果:\r\n" + writer.toString());
/**
* 账号状态
*
* @author tzq
*/
@Getter
@ToString
@AllArgsConstructor
public enum AccountState {
NORMAL("NORMAL", "正常状态"),
LOCK("LOCK", "锁定状态"),
FORBID("FORBID", "禁止状态"),
;
private final String value;
private final String desc;
}
结果
动态填充结果:
管理员名称 小明
管理员手机号 1561561568
管理员状态 正常状态
用户名称
用户手机号 ${user.mobile}
用户手机副号 ${user.deputyMobile}
用户状态 正常状态
通过结果我们可以发现,${user.mobile} 和 ${user.deputyMobile} (deputyMobile参数是我乱填的,user中并没有这个参数)并没有被动态填充
这就是我们要注意的点,当值为null 或者 对象/参数不存在时,不会进行动态填充,而是保持表达式原样