【问题标题】:Thymeleaf templates in class package类包中的 Thymeleaf 模板
【发布时间】:2021-08-17 20:00:30
【问题描述】:

有没有办法将 Thymeleaf 模板存储在 resourceswebapp 中,而不是在与类相同的包中?例如这样的结构:

com
   example
      myapp
         foo
            Foo.class
            Template.html
         bar
            Bar.class
            Template.html
            OtherTemplate.html

为了实现这一点,我必须如何配置 Spring 和 Thymeleaf?

【问题讨论】:

    标签: spring templates thymeleaf


    【解决方案1】:

    您需要在WebMvcConfigurer 中定义一个ClassLoaderTemplateResolver

    在以下示例中,我拥有模板的基本包是 net.yadaframework.views(在您的情况下应该是 com.example.myapp)。 当我从控制器返回视图时,路径是相对于该包的,因此在您的示例中为 "/foo/Template"patterns 集应包含基本包的子文件夹,因此在您的示例中为 "/foo/*""/bar/*"

    @EnableWebMvc
    @ComponentScan(basePackages = { "net.yadaframework.views" })
    public class YadaWebConfig implements WebMvcConfigurer {
    
        public ClassLoaderTemplateResolver yadaTemplateResolver() {
            ClassLoaderTemplateResolver resolver = new ClassLoaderTemplateResolver();
            resolver.setPrefix("net/yadaframework/views");
            /* From the tutorial:
             When several template resolvers are applied, it is recommended to specify patterns 
             for each template resolver so that Thymeleaf can quickly discard those template resolvers 
             that are not meant to resolve the template, enhancing performance. Doing this is not a 
             requirement, but a recommendation
             */
            Set<String> patterns = new HashSet<>();
            patterns.add("/yada/*"); // Start with "yada". Patterns are NOT regexp
            patterns.add("/yadacms/*"); // Start with "yadacms". Patterns are NOT regexp
            resolver.setResolvablePatterns(patterns);
            resolver.setSuffix(".html");
            resolver.setCharacterEncoding("UTF-8");
            resolver.setTemplateMode(TemplateMode.HTML);
            resolver.setCacheable(true);
            resolver.setOrder(10); 
            return resolver;
        }
    

    【讨论】:

    • 看起来就是我要找的东西!理论上是否可以设置一个空前缀并从类规范名称中解析完整的模板路径(按照约定,它将与控制器在同一个包中)?我要进行一个高度模块化的项目,所以我希望能够解析不同包甚至不同模块中的此类模板。还是ClassLoaderTemplateResolver 只能在声明它的同一个模块中工作?
    • 我认为前缀是可选的。不了解模块。
    • 顺便说一句,我认为坚持使用资源文件夹而不是混合 java 和 html 文件会更优雅:无论如何,它们在编译后都会在一起。我有一个库项目,其中包含 src/main/java 下的 java 类和 src/main/resources 下的 html 文件,如果我在资源文件夹中使用相同的包结构,java 类和 html 文件会被打包在一起。看看:github.com/xtianus/yadaframework/tree/master/YadaWeb/src/main
    • 谢谢,我现在就是这样做的。我只是有一种用于存储在resources 中的模板的包命名约定。我试图实现一个类似于 Tapestry 的项目结构,您可以在其中创建一个业务对象结构——一个类、一个模板和一个 i18n 文件在一个包中。但这更像是一个“我可以这样做”的交易:) 谢谢你的建议!
    猜你喜欢
    • 2023-03-22
    • 2016-01-13
    • 2017-10-15
    • 2015-08-29
    • 2013-11-21
    • 2016-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-09-24
    相关资源
    最近更新 更多