用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