springboot freemarker 自定义列表标签
时间: 2023-06-23 12:10:30 浏览: 122
在 Spring Boot 中使用 Freemarker 模板引擎时,可以通过自定义标签来实现一些常用的功能。下面介绍如何自定义一个列表标签。
首先,创建一个类,实现 `freemarker.template.TemplateDirectiveModel` 接口。这个接口只有一个方法 `execute`,需要在其中实现自定义标签的逻辑。例如:
```
import java.io.IOException;
import java.util.Map;
import freemarker.core.Environment;
import freemarker.template.TemplateDirectiveBody;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModel;
import freemarker.template.TemplateModelException;
public class CustomListDirective implements TemplateDirectiveModel {
@Override
public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
throws TemplateException, IOException {
// 获取参数
String items = params.get("items").toString();
String separator = params.get("separator").toString();
// 分割字符串,生成列表
String[] itemList = items.split(",");
StringBuilder result = new StringBuilder();
for (String item : itemList) {
result.append(item).append(separator);
}
// 输出结果
env.getOut().write(result.toString());
}
}
```
这个类实现了一个简单的列表标签,根据传入的参数 `items` 和 `separator`,将 `items` 字符串按照 `separator` 分割生成列表,并输出。
接着,在 Spring Boot 的配置类中注册这个自定义标签:
```
import java.util.HashMap;
import java.util.Map;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import freemarker.template.Configuration;
import freemarker.template.TemplateDirectiveModel;
@Configuration
public class FreemarkerConfig {
@Bean
public Configuration freemarkerConfig() {
Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
configuration.setClassForTemplateLoading(this.getClass(), "/templates");
// 注册自定义标签
Map<String, TemplateDirectiveModel> directives = new HashMap<>();
directives.put("customList", new CustomListDirective());
configuration.setSharedVariable("directives", directives);
return configuration;
}
}
```
这里将自定义标签注册到了 `Configuration` 中,然后在模板中使用 `<@directives.customList items="a,b,c" separator="-" />` 的方式调用即可。
需要注意的是,在模板中使用自定义标签时需要加上 `@` 符号,例如 `<@directives.customList ... />`。另外,`directives` 名称可以自定义,只要与 `freemarkerConfig` 中设置的名称一致即可。
阅读全文