Spring Boot Mustache指南

2023/05/12

1. 概述

在本文中,我们将重点介绍如何使用Mustache模板在Spring Boot应用程序中生成HTML内容。

它是一个用于创建动态内容的无逻辑模板引擎,由于其简单性而广受欢迎。

如果想了解基础知识,请查看我们对Mustache的介绍文章。

2. Maven依赖

为了能够将Mustache与Spring Boot一起使用,我们需要将专用的Spring Boot启动器添加到我们的pom.xml中:

<dependency>			
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
<dependency> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-web</artifactId> 
</dependency>

此外,我们还需要spring-boot-starter-web依赖。

3. 创建模板

让我们展示一个示例,并使用Spring Boot创建一个简单的MVC应用程序,该应用程序将在网页上提供文章。

让我们为文章内容编写第一个模板:

<div class="starter-template">
    
    <h1></h1>
    <h3></h3>
    <h3></h3>
    <p></p>
    
</div>

我们将保存这个HTML文件,比如article.html,并在我们的index.html中引用它:

<div class="container">
    
</div>

这里,layout是一个子目录,article是模板文件的文件名。

请注意,默认的mustache模板文件扩展名现在是.mustache。我们可以用一个属性覆盖这个配置:

spring.mustache.suffix=.html

4. 控制器

现在让我们编写用于提供文章的控制器:

@GetMapping("/article")
public ModelAndView displayArticle(Map<String, Object> model) {
    List<Article> articles = IntStream.range(0, 10)
        .mapToObj(i -> generateArticle("Article Title " + i))
        .collect(Collectors.toList());

    model.put("articles", articles);

    return new ModelAndView("index", model);
}

控制器返回要在页面上呈现的文章列表。在文章模板中,以#开头并以/结尾的标签articles负责处理列表。

这将遍历传递的模型并分别呈现每个元素,就像在HTML表格中一样:

...

generateArticle()方法使用一些随机数据创建一个Article实例。

请注意,控制器返回的文章模型中的键应与article模板标签的键相同。

现在,让我们测试我们的应用程序:

@Test
public void givenIndexPage_whenContainsArticle_thenTrue() {
    ResponseEntity<String> entity = this.restTemplate.getForEntity("/article", String.class);
 
    assertTrue(entity.getStatusCode().equals(HttpStatus.OK));
    assertTrue(entity.getBody().contains("Article Title 0"));
}

我们还可以通过以下方式部署来测试应用程序:

mvn spring-boot:run

部署后,我们可以访问localhost:8080/article

5. 处理默认值

在Mustache环境中,如果我们没有为占位符提供值,则会抛出MustacheException并显示一条消息“No method or field with name ”variable-name…”。

为了避免此类错误,最好为所有占位符提供一个默认的全局值:

@Bean
public Mustache.Compiler mustacheCompiler(Mustache.TemplateLoader templateLoader, Environment environment) {
    MustacheEnvironmentCollector collector = new MustacheEnvironmentCollector();
    collector.setEnvironment(environment);

    return Mustache.compiler()
        .defaultValue("Some Default Value")
        .withLoader(templateLoader)
        .withCollector(collector);
}

6. 使用Spring MVC的Mustache

现在,让我们讨论一下如果我们决定不使用Spring Boot,如何与Spring MVC集成。首先,让我们添加依赖项:

<dependency>
    <groupId>com.github.sps.mustache</groupId>
    <artifactId>mustache-spring-view</artifactId>
    <version>1.4</version>
</dependency>

最新的可以在这里找到。

接下来,我们需要配置MustacheViewResolver而不是Spring的InternalResourceViewResolver:

@Bean
public ViewResolver getViewResolver(ResourceLoader resourceLoader) {
    MustacheViewResolver mustacheViewResolver = new MustacheViewResolver();
    mustacheViewResolver.setPrefix("/WEB-INF/views/");
    mustacheViewResolver.setSuffix("..mustache");
    mustacheViewResolver.setCache(false);
    MustacheTemplateLoader mustacheTemplateLoader = new MustacheTemplateLoader();
    mustacheTemplateLoader.setResourceLoader(resourceLoader);
    mustacheViewResolver.setTemplateLoader(mustacheTemplateLoader);
    return mustacheViewResolver;
}

我们只需要配置存储模板的后缀,前缀模板的扩展名,以及负责加载模板的templateLoader。

7. 总结

在这个快速教程中,我们了解了如何将Mustache模板与Spring Boot结合使用,在UI中呈现一组元素,并为变量提供默认值以避免错误。

最后,我们讨论了如何使用MustacheViewResolver将它与Spring集成。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章