選項一:在java控制器中處理您的字符串。這樣,您就不需要更改模板
@RequestMapping("/test2")
public ModelAndView test2() throws IOException, TemplateException {
Map<String, String> fragment = new HashMap<>();
fragment.put("title", "Some Title");
ModelAndView model = new ModelAndView("index", "fragment", fragment);
//your string should go here instead of this default
String template = "<div>${fragment.title}</div> <div>some other test</div>";
fragment.put("design", processTemplate(model.getModel(), template));
return model;
}
private String processTemplate(Map model, String template)
throws IOException, TemplateException {
Template t = new Template("TemplateFromDBName", template,
Environment.getCurrentEnvironment().getConfiguration());
Writer out = new StringWriter();
t.process(model, out);
return out.toString();
}
模板部分:
<div class="fragment">
${fragment.design}
</div>
選擇二:創建自定義method expression,你可以在模板中使用。
// http://freemarker.org/docs/pgui_datamodel_method.html
public static class ProcessString implements TemplateMethodModelEx {
public static final String PROCESS_STRING_FUNCTION_NAME = "processString";
public TemplateModel exec(List args) throws TemplateModelException {
if (args.size() != 1) throw new TemplateModelException("Wrong arguments");
try {
Environment env = Environment.getCurrentEnvironment();
Template t = new Template("TemplateFromDBName",
args.get(0).toString(), env.getConfiguration());
Writer out = new StringWriter();
t.process(env.getDataModel(), out);
return new SimpleScalar(out.toString());
} catch (IOException | TemplateException e) {
e.printStackTrace();
}
return new SimpleScalar("");
}
}
配置寄存器它
@Configuration
public class FreeMarkerConfig extends WebMvcConfigurerAdapter {
@Bean
@Primary
public FreeMarkerConfigurer freemarkerConfig() {
FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
// some other config here
Map properties = new HashMap();
properties.put(ProcessString.PROCESS_STRING_FUNCTION_NAME,
new ProcessString());
freeMarkerConfigurer.setFreemarkerVariables(properties);
return freeMarkerConfigurer;
}
}
而且模板的樣子:
<div class="fragment">
${processString(fragment.design)}
</div>
但是控制器會乾淨
@RequestMapping("/test")
public ModelAndView test() throws IOException, TemplateException {
Map<String, String> fragment = new HashMap<>();
fragment.put("title", "Some Title");
fragment.put("design", "<div>${fragment.title}</div><div> other test</div>");
return new ModelAndView("index", "fragment", fragment);
}
你可以嘗試使用'parse = true'選項來包含嗎?比如'<#include「inc/header。ftp「parse = true>' – varren
這是'fragment.design'字符串中的Freemarker變量,它們沒有被解析。 – crm