{% raw %}
Spring Boot Moustache 教程
在 Spring Boot Mustache 教程中,我们将使用 Mustache 模板引擎和 HSQLDB 数据库创建一个简单的 Spring Boot Web 应用。
Spring 是流行的 Java 应用框架。 Spring Boot 致力于创建独立的,基于生产级别的基于 Spring 的应用,而无任何麻烦。
HSQLDB 是完全用 Java 创建的开源关系数据库管理系统。 它提供了一个小型,快速的多线程事务型数据库引擎,具有基于内存和基于磁盘的表,并支持嵌入式和服务器模式。 它包括一个功能强大的命令行 SQL 工具和简单的 GUI 查询工具。
Moustache
Moustache 是一个简单的 Web 模板系统。 它可用于许多编程语言,包括 Java。 由于没有任何显式的控制流语句(例如if
和else
条件语句或for
循环),因此,Mustache 被描述为无逻辑的。 可以使用节标记处理列表和 lambda 来实现循环和条件评估。
Spring Boot Moustache 示例
以下示例是使用 Mustache 模板引擎的 Spring Boot Web 应用。 应用的数据位于 HSQLDB 数据库中。
$ tree
.
├── pom.xml
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── zetcode
│ │ ├── Application.java
│ │ ├── bean
│ │ │ └── Car.java
│ │ ├── controller
│ │ │ └── MyController.java
│ │ └── service
│ │ ├── CarService.java
│ │ └── ICarService.java
│ └── resources
│ ├── application.yml
│ ├── data-hsqldb.sql
│ ├── schema-hsqldb.sql
│ ├── static
│ │ └── css
│ │ └── style.css
│ └── templates
│ ├── index.html
│ └── showCars.html
└── test
└── java
这是项目结构。 模板文件的后缀为.html
。 它们默认位于src/main/resources/template
目录中。 当在 Maven POM 文件中找到依赖项时,Spring Boot 会自动配置 Mustache。
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zetcode</groupId>
<artifactId>SpringBootMustache</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
这是 Maven 构建文件。 spring-boot-devtools
启用热插拔,禁用模板缓存并启用实时重新加载。 spring-boot-starter-mustache
是用于使用 Mustache 构建 Spring MVC 应用的入门程序。 hsqldb
是 HSQLDB 的驱动程序。 spring-boot-starter-jdbc
是在 Spring Boot 中使用 JDBC 的入门工具。
Car.java
package com.zetcode.bean;
public class Car {
private Long id;
private String name;
private int price;
public Car() {}
public Car(Long id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" + "id=" + id + ", name=" + name + ", price=" + price + '}';
}
}
这是Car
bean 类。 它包含汽车 ID,名称和价格字段。
application.yml
server:
context-path: /myapp
spring:
main:
banner-mode: "off"
datasource:
platform: hsqldb
logging:
level:
org:
springframework: ERROR
application.yml
是主要的 Spring Boot 配置文件。 context-path
定义 Web 应用的名称。 我们通过localhost:8080/myapp/
URL 访问我们的应用。 使用banner-mode
属性,我们可以关闭 Spring 横幅。 该平台值用于 SQL 初始化脚本:schema-${platform}.sql
和data-${platform}.sql
中。 另外,我们将 spring 框架的日志记录级别设置为ERROR
。
注意,我们没有配置数据源。 如果没有配置数据,Spring 会以内存模式自动配置 HSQLDB。 我们希望有一个内存数据库,因此我们让 Spring 进行自动配置。
schema-hsqldb.sql
CREATE TABLE CARS(ID BIGINT IDENTITY PRIMARY KEY,
NAME VARCHAR(30), PRICE INT);
该 SQL 脚本创建CARS
表。 HSQLDB 使用IDENTITY
子句创建自动增加的列。 默认情况下,id 从零开始。
data-hsqldb.sql
INSERT INTO CARS(NAME, PRICE) VALUES('Audi', 52642);
INSERT INTO CARS(NAME, PRICE) VALUES('Mercedes', 57127);
INSERT INTO CARS(NAME, PRICE) VALUES('Skoda', 9000);
INSERT INTO CARS(NAME, PRICE) VALUES('Volvo', 29000);
INSERT INTO CARS(NAME, PRICE) VALUES('Bentley', 350000);
INSERT INTO CARS(NAME, PRICE) VALUES('Citroen', 21000);
INSERT INTO CARS(NAME, PRICE) VALUES('Hummer', 41400);
INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
该脚本用数据填充表。 这两个脚本都位于类路径的根目录中。
ICarService.java
package com.zetcode.service;
import com.zetcode.bean.Car;
import java.util.List;
public interface ICarService {
public List<Car> findAll();
}
ICarService
提供了一种从数据源获取所有城市的契约方法。
CarService.java
package com.zetcode.service;
import com.zetcode.bean.Car;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class CarService implements ICarService {
@Autowired
private JdbcTemplate jtm;
@Override
public List<Car> findAll() {
String sql = "SELECT * FROM CARS";
List<Car> cars = jtm.query(sql, new BeanPropertyRowMapper(Car.class));
return cars;
}
}
CarService
包含findAll()
方法的实现。 我们借助JdbcTemplate
从CARS
表中检索所有汽车。
@Autowired
private JdbcTemplate jtm;
注入JdbcTemplate
。
String sql = "SELECT * FROM CARS";
这是要执行的 SQL。 我们从CARS
表中选择所有汽车。
List<Car> cars = jtm.query(sql, new BeanPropertyRowMapper(Car.class));
BeanPropertyRowMapper
将一行转换为指定映射目标类的新实例。
MyController.java
package com.zetcode.controller;
import com.zetcode.bean.Car;
import com.zetcode.service.ICarService;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
@Autowired
private ICarService carService;
@RequestMapping("/")
public String index(Model model) {
return "index";
}
@RequestMapping("/showCars")
public ModelAndView showCars() {
List<Car> cars = carService.findAll();
Map<String, Object> params = new HashMap<>();
params.put("cars", cars);
return new ModelAndView("showCars", params);
}
}
这是 Spring Boot Web 应用的控制器类。 控制器被饰以@Controller
注解。 控制器具有两个映射:一个用于主页的映射,一个用于列出所有汽车的映射。 当 Spring Boot 在 Maven POM 文件中检测到 Mustache 启动程序时,它会自动配置 Mustache 视图。
@Autowired
private ICarService carService;
我们将ICarService
注入到带有@Autowired
注解的字段中。
@RequestMapping("/")
public String index(Model model) {
return "index";
}
"index"
是位于预定义template
目录中的视图的名称。
@RequestMapping("/showCars")
public ModelAndView showCars() {
List<Car> cars = carService.findAll();
Map<String, Object> params = new HashMap<>();
params.put("cars", cars);
return new ModelAndView("showCars", params);
}
该控制器方法可提供汽车清单。 我们从汽车服务中找到所有汽车对象,并将结果列表放入参数中。 Spring 将找到名为showCars
的 Mustache 视图,并让引擎将模板与数据结合在一起。
style.css
h2 {color: blue}
td:nth-child(3) {
text-align: right;
}
style.css
是位于src/main/resources/static/css
目录中的静态文件。 它将h2
标签设置为蓝色,并右对齐第三列的数据。
index.html
<!DOCTYPE html>
<html>
<head>
<title>Home page</title>
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<a href="showCars">Show cars</a>
</body>
</html>
index.html
模板文件是应用的主页。 它包含一个检索所有汽车对象的链接。
showCars.html
<!DOCTYPE html>
<html>
<head>
<title>Cars</title>
<link rel="stylesheet" href="css/style.css" />
<meta charset="UTF-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
</head>
<body>
<h2>List of cars</h2>
<table>
<tr>
<th>Id</th>
<th>Name</th>
<th>Price</th>
</tr>
{{#cars}}
<tr>
<td>{{id}}</td>
<td>{{name}}</td>
<td>{{price}}</td>
</tr>
{{/cars}}
</table>
</body>
</html>
showCars.html
是 Moustache 模板文件,其中包含要用来自模型的数据填充的占位符。 小 Moustache 使用{{}}
语法。
<link rel="stylesheet" href="css/style.css" />
我们包括静态 CSS 文件。
{{#cars}}
<tr>
<td>{{id}}</td>
<td>{{name}}</td>
<td>{{price}}</td>
</tr>
{{/cars}}
{{#cars}}
语法称为段。 部分根据当前上下文中键的值,将文本块渲染一次或多次。 一节以{{#name}}
开头,以{{/name}}
结束。 如果该值是非空列表,则该部分将显示多次。 在每种情况下,该节的上下文都将设置为列表中的元素。
Application.java
package com.zetcode;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
我们设置了 Spring Boot 应用。 @SpringBootApplication
注解启用自动配置和组件扫描。
图:列出汽车
该应用部署在内置的 Tomcat 服务器上,该服务器监听端口 8080。
在本教程中,我们使用 Mustache 和 HSQLDB 创建了一个 Spring Boot Web 应用。 您可能也对相关教程感兴趣: Spring Boot Thymeleaf 配置, Spring Boot FreeMarker 教程, Spring Boot Thymeleaf 教程, Spring Boot Swing 集成教程, Spring Web 应用简介,独立的 Spring 应用, FreeMarker 教程, Java 教程,游戏简介或 Strips 简介。
{% endraw %}