当前位置: 首页 > 知识库问答 >
问题:

Thymeleaf 3.0模板引擎,从两个位置拾取模板

壤驷旭
2023-03-14

我正在设置一个自定义模板引擎,该引擎将处理来自两个位置的模板。。如何设置可实现此目的的自定义模板引擎?

好的,引擎应该只处理胸腺模板,并从两个不同的位置提取它们。其中一个是通常的 /WEB-INF/templates但另一个应该在应用上下文之外和文件系统中。为了参数的缘故,让它在D:/app/myapp/实例/上。对于文件系统之一,我设法用FileTemplateResolver处理模板,对于内部模板ClassLoaderTemplateResolver,这是不好的,因为我读过Thymeleaf 3.0使用SpringResourceTemplateResolver。除了这个问题之外,我还有一个问题,我无法使发动机处理两者,它可以是一个或另一个基于订单。检查我的代码

        @Bean
    public TemplateEngine templateEngine() {
      SpringTemplateEngine templateEngine = new 
          SpringTemplateEngine();

      templateEngine.setEnableSpringELCompiler(true);
      templateEngine.addTemplateResolver(thymeleafTemplateResolver());
      templateEngine.addTemplateResolver(databaseTemplateResolver());

      return templateEngine;
    }

    //Resolver for thymeleaf
    @Bean
    public ThymeleafViewResolver  thymeleafViewResolver() {
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
        viewResolver.setTemplateEngine((ISpringTemplateEngine) templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");
        viewResolver.setOrder(0);
        viewResolver.setApplicationContext(applicationContext);

        return viewResolver;
    }
    //Pulling out methods
    @Bean(name = "databaseTemplateResolver")
    public ITemplateResolver databaseTemplateResolver() {
        var prefix = rootDirectory+Directory.INSTANCES_DIR+File.separator;
        System.out.println(prefix);
        var templateResolver 
          = new FileTemplateResolver();
        templateResolver.setPrefix(prefix);
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setOrder(1);
        templateResolver.setCacheable(false);
        return templateResolver;
    }
    @Bean(name = "thymeleafTemplateResolver")
    public ITemplateResolver thymeleafTemplateResolver() {
        var templateResolver 
          = new ClassLoaderTemplateResolver();
      templateResolver.setPrefix("templates/");

       // var templateResolver   = new SpringResourceTemplateResolver();
      //  templateResolver.setApplicationContext(applicationContext);
        //templateResolver.setPrefix("/WEB-INF/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode(TemplateMode.HTML);
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setCacheable(false);
        templateResolver.setOrder(0);
        return templateResolver;
    }

如果顺序设置为0为ThymeleafTemplateResolver和1为数据库TemplateResolver我将得到

        org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "templates/europe/fra-1/offer.html")
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
at org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]
at org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666) ~[thymeleaf-3.0.11.RELEASE.jar:3.0.11.RELEASE]

当尝试加载文件系统模板时,由于某种原因,内部模板将在没有css的情况下加载

如果将ThymeleaftTemplateResolver的顺序设置为1,将databaseTemplateResolver的顺序设置为0,则我将获得

       org.thymeleaf.exceptions.TemplateInputException: An error happened during template parsing (template: "D:\apps\myapp\instances\login.html")
org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parse(AbstractMarkupTemplateParser.java:235)
org.thymeleaf.templateparser.markup.AbstractMarkupTemplateParser.parseStandalone(AbstractMarkupTemplateParser.java:100)
org.thymeleaf.engine.TemplateManager.parseAndProcess(TemplateManager.java:666)

尝试加载内部模板时,文件系统模板将正常加载。

出于某种原因,模板引擎只拾取一个解析器,而不检查另一个。我如何解决这些问题,使模板引擎的过程?

谢谢

共有1个答案

益麻雀
2023-03-14

除非您在其中一个解析器(最先发生的具有较低顺序号的解析器)上设置setCheckExistence(true),否则它将在找不到模板时引发异常。请参见链接解析器的留档。

 类似资料:
  • 具体查看ejs官方文档 https://github.com/mde/ejs

  • 我们自己实现了一个轻量级的模板引擎,不要问为什么不用smart之类的,因为我们认为没有必要为了一个小小的模板引擎而引入smaart这样复杂的实现。你可能会说,smart功能强大,支持各种标签,标签也是很强大,而且还可以对模板引擎进行各种"灵活"的配置... 这里我们觉得有必要说明一下: 框架的内置模板引擎基本上实现了我们日常开中所有常用的标签。 不常用的标签我们也做了巧妙的实现。 我们只提供了扩展

  • 内置模板引擎 视图的模板文件可以支持不同的解析规则,默认情况下无需手动初始化模板引擎。 可以通过下面的几种方式对模板引擎进行初始化。 配置文件 内置模板引擎的参数统一在配置目录的template.php文件中配置,例如: return [ // 模板引擎类型 支持 php think 支持扩展 'type' => 'Think', // 模板路径 '

  • Warning: The packages listed below may be outdated, no longer maintained or even broken. Listing here does not constitute an endorsement or recommendation from the Expressjs project team. Use at your

  • Use the app.engine(ext, callback) method to create your own template engine. ext refers to the file extension, and callback is the template engine function, which accepts the following items as parame

  • hi-nginx-java内置了两个mustache模板引擎:mustache.java和jmustache。 以下介绍仅就jmustache而言。 字符串模板 字符串模板是最简单的情况。例如: package test; import hi.request; import hi.response; import hi.route; import java.util.regex.Matcher