如何使用Spring MVC,Sitemesh和Freemarker将spring.ftl宏导入Freemarker模板页面?
我使用基于Ted Young's configuration example的Sitemesh和Freemarker配置了一个Spring MVC应用程序。根据{{3}}集成引用,有必要导入spring.ftl宏,以便通过< @ spring.bind“command.name”/>将支持模型绑定到视图。但是,这样做:
<#import "/spring.ftl" as spring>
<@spring.bind "command.user"/>
此例外的结果:
org.springframework.web.util.NestedServletException:
Request processing failed; nested exception is freemarker.
template.TemplateException: Error reading imported file spring.ftl
Spring MVC/Freemarker,但我还没有找到谷歌的解决方案。我还尝试使用Others have experienced this issue(压缩spring.ftl,将其放在META-INF / lib中,并将zip添加到构建路径中),但它似乎没有用完。
谢谢!
答案 0 :(得分:3)
问题是spring不知道在哪里查看spring.ftl
文件:
这是我使用Boot
/**
* Otras configuraciones de la aplicaciones web, incluyendo algunas definidas en
* xml. Usar @ImportResource("classpath:/extra-config.xml") en caso de quererse
* importar configuracion en xml
*/
@Configuration
@PropertySource("classpath:application.properties")
public class WebAppConfig
{
@Autowired
private ServletContext context;
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
PropertySourcesPlaceholderConfigurer placeHolderConfigurer = new PropertySourcesPlaceholderConfigurer();
return placeHolderConfigurer;
}
@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() throws IOException, TemplateException
{
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer()
{
@Override
protected void postProcessConfiguration(freemarker.template.Configuration config) throws IOException, TemplateException
{
WebappTemplateLoader WebAppTplLoader = new WebappTemplateLoader(context, "/WEB-INF/ftl");
ClassTemplateLoader classTplLoader = new ClassTemplateLoader(context.getClassLoader(), "/templates");
ClassTemplateLoader baseMvcTplLoader = new ClassTemplateLoader(FreeMarkerConfigurer.class, "");
MultiTemplateLoader mtl = new MultiTemplateLoader(new TemplateLoader[]
{
WebAppTplLoader,
classTplLoader,
baseMvcTplLoader
});
config.setTemplateLoader(mtl);
}
};
configurer.setDefaultEncoding("UTF-8");
configurer.setPreferFileSystemAccess(false);
return configurer;
}
@Bean
public FreeMarkerViewResolver viewResolver()
{
FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
viewResolver.setExposeSpringMacroHelpers(true);
viewResolver.setExposeRequestAttributes(true);
viewResolver.setPrefix("");
viewResolver.setSuffix(".ftl");
viewResolver.setContentType("text/html;charset=UTF-8");
return viewResolver;
}
}
前2个加载器允许从“/ WEB-INF / ftl”的.ftl
个文件和war
的常规jar
文件中加载src/resources/templates
个模板。
如果你想在freemarker中使用安全标签,那么escense就是这两行:
viewResolver.setExposeSpringMacroHelpers(true);
viewResolver.setExposeRequestAttributes(true);
baseMvcTplLoader
加载程序从spring.ftl
获取org.springframework.web.servlet.view.freemarker
。我建议在某些example project或documentation中探索ftl模板,以了解spring.ftl
的工作原理。
占位符的配置与freemarker无关 配置,但它对于在变量中注入值非常有用 使用
src/resources/application.properties
从@Value
开始 注释
使用此功能,您可以使用 freemarker 模板中的所有 spring 功能。
答案 1 :(得分:0)
我喜欢我的spring.ftl默认包含,而不必在每个视图中手动添加它。在您的配置中。
定义你的freemarkerConfigurer。
{{1}}
答案 2 :(得分:-2)
<#import "spring.ftl" as spring/>
没有/