在Freemarker中,可以使用?default
指令或者!
来设置变量为空时的默认值,避免报错。
例如,假设有一个变量${name}
,如果该变量为空,则可以使用以下语法设置默认值:
${name?default("未知")}
${name!"未知"}
这将在${name}
为空时输出“未知”,而不会报错。
也可以使用Freemarker的Configuration类的setClassicCompatible
方法来实现,如果设置为true
,则启用经典兼容模式,当变量为null或者变量不存在时都不会抛出异常。
经典兼容模式是指Freemarker 2.x版本中的一些行为,这些行为在Freemarker 2.x版本中是默认的,但在Freemarker 2.3.x版本中已经被修改了。
经典兼容模式的启用或禁用将影响Freemarker的一些行为,例如:
- 在模板中使用未定义的变量时,是否抛出异常
- 是否允许在模板中使用未定义的宏
- 是否允许在模板中使用未定义的指令
因此,根据应用程序的需求,可以选择启用或禁用经典兼容模式。
示例代码如下:
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
public class FreemarkerNullValueExample {
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_30);
cfg.setClassForTemplateLoading(FreemarkerNullValueExample.class, "/");
cfg.setDefaultEncoding("UTF-8");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setClassicCompatible(true); // 设置为兼容模式
Map<String, Object> data = new HashMap<>();
data.put("name", "John");
data.put("age", null);
Template template = cfg.getTemplate("example.ftl");
Writer out = new OutputStreamWriter(System.out);
template.process(data, out);
out.flush();
}
}
在上面的示例中,我们将Configuration的classicCompatible属性设置为true,这将使Freemarker在处理null值时不抛出异常。在模板中,您可以像往常一样使用变量,即使它们为null,甚至它们不存在都不会抛出异常。例如:
<!DOCTYPE html>
<html>
<head>
<title>Welcome ${name}</title>
</head>
<body>
<p>Age: ${age}</p>
<p>Age: ${sex}</p>
</body>
</html>
在上面的模板中,我们使用name, age和sex变量,即使age为null
,或者sex变量不存在都不会抛出异常。
网友评论