velocity的模板中赋值语句#set( $var= ....)
默认是不允许对变量设置为null的。
参见velocity官方文档说明:https://velocity.apache.org/engine/devel/vtl-reference.html#set-establishes-the-value-of-a-reference
因为不能赋值null,在循环语句中,变量的值就还是停留在上一个不为null的值,就会导致生成的内容混乱。所以我在实际应用中需要允许#set
语句赋值null.
经过仔细跟踪代码,发现可以通过设置参数配置模板引擎(VelocityEngine)允许null赋值。
示例如下:
VelocityEngine velocityEngine = new VelocityEngine();
/** 允许 set null */
velocityEngine.setProperty(VelocityEngine.SET_NULL_ALLOWED, "true");
也可以将配置参数封装为以Properties
对象,然后调用Velocity.init(Properties)
方法来初始化模板引擎:
public static void init(Properties vprops) {
if (null == vprops) {
vprops = new Properties();
/** 设置velocity默认的初始化参数 */
vprops.put(Velocity.SET_NULL_ALLOWED, "true");
vprops.put(Velocity.INPUT_ENCODING, "UTF-8");
vprops.put(Velocity.OUTPUT_ENCODING, "UTF-8");
vprops.put(Velocity.RESOURCE_LOADER, "classpath");
}
Velocity.init(vprops);
}
VelocityEngine.SET_NULL_ALLOWED
是定义在org.apache.velocity.runtime.RuntimeConstants
中的一个常量:
/** if set to true then allows #set to accept null values in the right hand side. */
String SET_NULL_ALLOWED = "directive.set.null.allowed";