用Spring Boot使用Mustache模板引擎的示例代码

概述

    • Spring Boot で Mustache テンプレートエンジンを使う

 

    今回の動作確認環境: Java 14 (AdoptOpenJDK 14.0.2+12) + Spring Boot 2.3.2 + Gradle 6.5.1 + macOS Catalina

请提供示例代码。

源代码列表 –

├── build.gradle
└── src
    └── main
        ├── java
        │   └── com
        │       └── example
        │           ├── SampleController.java
        │           └── SampleData.java
        └── resources
            ├── application.properties
            └── templates
                ├── error
                │   ├── 4xx.html
                │   └── 5xx.html
                └── my_template.html

建造.gradle

需要引入Spring Boot Starter Mustache。

plugins {
  id 'org.springframework.boot' version '2.3.2.RELEASE'
  id 'io.spring.dependency-management' version '1.0.9.RELEASE'
  id 'java'
}

group = 'com.example'
version = '0.0.1'
sourceCompatibility = '14'

repositories {
  mavenCentral()
}

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-mustache'
  implementation 'org.springframework.boot:spring-boot-starter-web'
}

当查看 spring-boot-starter-mustache-2.3.2.RELEASE.pom 的内容时,我们可以看到 Spring Boot Starter Mustache 使用了 Mustache 库的 JMustache 1.15 版本。

主页/主文件夹/资源/application.properties

设置与胡子(Mustache)相关的配置。
在这里,您可以通过设置 spring.mustache.suffix 将扩展名为html的文件作为模板文件处理。

# テンプレートのキャッシュを有効にするかどうか (デフォルト値: false)
spring.mustache.cache=false

# テンプレートのエンコード (デフォルト値: UTF-8)
spring.mustache.charset=UTF-8

# テンプレート名に適用するプレフィックス (デフォルト値: classpath:/templates/)
spring.mustache.prefix=classpath:/templates/

# テンプレート名に適用するサフィックス (デフォルト値: .mustache)
spring.mustache.suffix=.html

可以参考 Spring Boot 应用程序属性概述—文档等等,因为还有其他设置选项。

src/main/java/com/example/SampleController.java 的路径

控制器类。

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;

@SpringBootApplication
@Controller
public class SampleController {

  public static void main(String[] args) {
    SpringApplication.run(SampleController.class, args);
  }

  @GetMapping("/mypage")
  public ModelAndView mypage() {
    SampleData sampleData = new SampleData();
    ModelAndView mav = new ModelAndView();
    mav.setViewName("my_template"); // テンプレートファイル名
    mav.addObject("mydata", sampleData); // データオブジェクトをセット
    return mav;
  }

  @GetMapping("/myerror")
  public ModelAndView myerror() {
    throw new RuntimeException("エラーを発生させる");
  }
}

src/main/java/com/example/SampleData.java 源文件中的SampleData.java

儿子的数据对象嵌入到小胡子模板中。

package com.example;

import java.util.List;
import java.util.Map;

public class SampleData {

  public String foo = "foo";

  public String getBar() {
    return "bar";
  }

  public String[] strings = {"S1", "S2", "S3"};

  public List list = List.of("L1", "L2", "L3");

  public Map map = Map.of("key1", "value1", "key2", "value2", "key3", "value3");
}

src/main/resources/templates/我的模板.html

用于显示数据对象内容的Mustache模板文件。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{{#mydata}}
foo: {{foo}}<br>
getBar(): {{bar}}<br>
{{/mydata}}
<br>
strings:<br>
{{#mydata.strings}}
value: {{.}}<br>
{{/mydata.strings}}
<br>
list:<br>
{{#mydata.list}}
value: {{.}}<br>
{{/mydata.list}}
<br>
map:<br>
{{#mydata.map}}
{{key1}}, {{key2}}, {{key3}}
{{/mydata.map}}
</body>
</html>

src/main/resources/templates/error/4xx.html 资源中的模板错误/4xx.html

发生4xx系错误时使用的Mustache模板文件。
可以根据需要将错误信息等数据嵌入其中。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>4xx</title>
</head>
<body>
<h1>4xx</h1>
<div>timestamp: {{#timestamp}}{{.}}{{/timestamp}}</div>
<div>status: {{#status}}{{.}}{{/status}}</div>
<div>error: {{#error}}{{.}}{{/error}}</div>
<div>exception: {{#exception}}{{.}}{{/exception}}</div>
<div>message: {{#message}}{{.}}{{/message}}</div>
<div>errors: {{#errors}}{{.}}{{/errors}}</div>
<div>trace: {{#trace}}{{.}}{{/trace}}</div>
<div>path: {{#path}}{{.}}{{/path}}</div>
</body>
</html>

src/main/resources/templates/error/5xx.html 请提供一个中文译本

在发生5xx系列错误时使用的Mustache模板文件。
可以根据需要嵌入错误信息等数据。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>5xx</title>
</head>
<body>
<h1>5xx</h1>
<div>timestamp: {{#timestamp}}{{.}}{{/timestamp}}</div>
<div>status: {{#status}}{{.}}{{/status}}</div>
<div>error: {{#error}}{{.}}{{/error}}</div>
<div>exception: {{#exception}}{{.}}{{/exception}}</div>
<div>message: {{#message}}{{.}}{{/message}}</div>
<div>errors: {{#errors}}{{.}}{{/errors}}</div>
<div>trace: {{#trace}}{{.}}{{/trace}}</div>
<div>path: {{#path}}{{.}}{{/path}}</div>
</body>
</html>

输出结果示例

用 curl 进行访问并确认响应结果。

当处于正常状态时

数据对象被嵌入到 Mustache 模板中并输出。

$ curl http://localhost:8080/mypage
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
foo: foo<br>
getBar(): bar<br>
<br>
strings:<br>
value: S1<br>
value: S2<br>
value: S3<br>
<br>
list:<br>
value: L1<br>
value: L2<br>
value: L3<br>
<br>
map:<br>
value1, value2, value3
</body>
</html>

当发生404错误时

由于发生4xx系列错误,错误信息已嵌入到Mustache模板文件中并输出。

$ curl --include -H "accept: text/html" http://localhost:8080/
HTTP/1.1 404 
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: text/html;charset=UTF-8
Content-Language: ja-JP
Content-Length: 321
Date: Fri, 07 Aug 2020 07:55:53 GMT

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>4xx</title>
</head>
<body>
<h1>4xx</h1>
<div>timestamp: Fri Aug 07 16:55:53 JST 2020</div>
<div>status: 404</div>
<div>error: Not Found</div>
<div>exception: </div>
<div>message: </div>
<div>errors: </div>
<div>trace: </div>
<div>path: /</div>
</body>
</html>

错误发生时

当发生 5xx 系错误时,Mustache 模板文件会将错误信息嵌入并输出。

$ curl --include -H "accept: text/html" http://localhost:8080/myerror
HTTP/1.1 500 
Content-Type: text/html;charset=UTF-8
Content-Language: ja-JP
Content-Length: 340
Date: Fri, 07 Aug 2020 07:55:47 GMT
Connection: close

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>5xx</title>
</head>
<body>
<h1>5xx</h1>
<div>timestamp: Fri Aug 07 16:55:47 JST 2020</div>
<div>status: 500</div>
<div>error: Internal Server Error</div>
<div>exception: </div>
<div>message: </div>
<div>errors: </div>
<div>trace: </div>
<div>path: /myerror</div>
</body>
</html>

请参考以下文献来源

Spring Boot “Usage” Guide – Japanese Translation of Official Documentation

如果要使用Mustache模板引擎,还有一个名为”mustacheViewResolver”的MustacheViewResolver可以使用。它通过在视图名称前后添加前缀和后缀来查找资源。前缀是spring.mustache.prefix,后缀是spring.mustache.suffix。默认情况下,前缀和后缀的值分别是”classpath:/templates/”和”.mustache”。您可以通过提供相同名称的Bean来覆盖MustacheViewResolver。

    • Spring Boot の機能 – 公式ドキュメントの日本語訳

 

    • Spring Boot アプリケーションプロパティ一覧 – ドキュメント

 

    • spring-boot/MustacheView.java at v2.3.2.RELEASE · spring-projects/spring-boot · GitHub

 

    • spring-boot/MustacheViewResolver.java at v2.3.2.RELEASE · spring-projects/spring-boot · GitHub

 

    • spring-boot/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/mustache at v2.3.2.RELEASE · spring-projects/spring-boot · GitHub

 

    • 7.2.6. エラー処理 – Spring Boot の機能 – 公式ドキュメントの日本語訳

 

    • DefaultErrorAttributes (Spring Boot 2.3.2.RELEASE API)

 

    Guide to Mustache with Spring Boot | Baeldung
广告
将在 10 秒后关闭
bannerAds