Руководство Spring Boot и Mustache
1. Что такое Mustache?
Mustache это система Web Template (web шаблон), которая используется для комбинировния с данными уровня Model, чтобы создавать файлы HTML. Поддерживается разными языками как Java, ActionScript, C++, Clojure, CoffeeScript, ColdFusion, PHP, ....
Mustache описывается как нелогичная система (logic-less), так как она не имеет ясной команды контролирования потоками программы, например она не имеет команды if/else (if/else statement), и не имеет команды цикла, вместо этого она использует теги lambda и mustache tags (Тег mustache).
Например "employees" является списком, в данном контексте пары тегов открыть & закрыть: {{#employees}} & {{/employees}} будут соответствовать циклу в списке "employees".
Название "Mustache" (Усы) исходит из-за синтаксиса Mustache, который постоянно использует скобки { }, похожие на усы.
2. Некоторые примеры с Mustache
Возможно вы встретите некоторые проблемы и недопонимания с Mustache работая первый раз. Ниже являются некоторые примеры, которые показывают странность данной системы.
if/else?
Mustache просто не имеет команду условия if/else, поэтому вам нужно самим создать для него logic.
Java Code:
boolean kiss = true;
boolean hug = true;
boolean slap = false;
Mustache Template:
{{#kiss}}
Kiss ...
{{/kiss}}
{{#hug}}
Hug ...
{{/hug}}
{{#slap}}
Hic Hic ...
{{/slap}}
Результат:
Kiss ...
Hug ...
{{.}}
В Mustache, {{.}} является особенным тегом (tag), посмотрим на пример:
Если вы имеете следующие данные:
int[] numbers = new int[] {1, 2, 3, 4, 5};
String string = "Wheee!";
Mustache Template:
{{# numbers }}
* {{ . }}
{{/ numbers }}
-----
{{# string }}
{{ . }}
{{/ string }}
Полученный результат:
* 1
* 2
* 3
* 4
* 5
----
Wheee!
3. Создать проект Spring Boot
На Eclipse создать проект Spring Boot:
Чтобы использовать Mustache для уровня View вам нужно объявить зависимые spring-boot-starter-mustache в файле pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
Полное содержание файла pom.xml:
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>org.o7planning</groupId>
<artifactId>SpringBootMustache</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringBootMustache</name>
<description>Spring Boot + Groovy</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mustache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
SpringBootMustacheApplication.java
package org.o7planning.sbmustache;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringBootMustacheApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMustacheApplication.class, args);
}
}
4. Model, DAO
Employee.java
package org.o7planning.sbmustache.model;
import java.util.Date;
public class Employee {
private Long empId;
private String empNo;
private String empName;
private Date hireDate;
public Employee() {
}
public Employee(Long empId, String empNo,
String empName, Date hireDate) {
this.empId = empId;
this.empNo = empNo;
this.empName = empName;
this.hireDate = hireDate;
}
public Long getEmpId() {
return empId;
}
public void setEmpId(Long empId) {
this.empId = empId;
}
public String getEmpNo() {
return empNo;
}
public void setEmpNo(String empNo) {
this.empNo = empNo;
}
public String getEmpName() {
return empName;
}
public void setEmpName(String empName) {
this.empName = empName;
}
public Date getHireDate() {
return hireDate;
}
public void setHireDate(Date hireDate) {
this.hireDate = hireDate;
}
}
EmployeeDAO.java
package org.o7planning.sbmustache.dao;
import java.sql.Date;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.o7planning.sbmustache.model.Employee;
import org.springframework.stereotype.Repository;
@Repository
public class EmployeeDAO {
public List<Employee> getEmployees() {
Date hireDate1= Date.valueOf(LocalDate.parse("2000-12-11"));
Employee e1= new Employee(1L, "E01", "Tom", hireDate1);
Date hireDate2= Date.valueOf(LocalDate.parse("2001-12-21"));
Employee e2= new Employee(2L, "E02", "Jerry", hireDate2);
List<Employee> list= new ArrayList<Employee>();
list.add(e1);
list.add(e2);
return list;
}
}
5. Controller, Mustache Template
MainController.java
package org.o7planning.sbmustache.controller;
import java.util.List;
import org.o7planning.sbmustache.dao.EmployeeDAO;
import org.o7planning.sbmustache.model.Employee;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class MainController {
@Autowired
private EmployeeDAO employeeDAO;
@RequestMapping("/")
public String handleRequest(Model model) {
List<Employee> employees = employeeDAO.getEmployees();
model.addAttribute("employees", employees);
return "employee";
}
}
Создать файл employee.mustache расположенный в файле resources/templates проекта.
Примечание: Если вы используете Spring Boot < 2.x то файлы Mustache Template должны иметь окончание html, таким образом вам нужно создать файл employee.html.
employee.mustache
<html>
<head>
<title>Spring Boot Mustache</title>
<style>
table {
border-collapse: collapse;
}
table, td, th {
border: 1px solid #999;
padding: 5px;
}
</style>
</head>
<body>
<h2>Employees</h2>
<table>
<tr>
<th>Emp Id</th>
<th>Emp No</th>
<th>Emp Name</th>
<th>Hire Date</th>
</tr>
{{#employees}}
<tr>
<td>{{empId}}</td>
<td>{{empNo}}</td>
<td>{{empName}}</td>
<td>{{hireDate}}</td>
</tr>
{{/employees}}
</table>
</body>
</html>
Spring Boot 2.x автоматически конфигурирует Mustache со следующими свойствами по умолчанию:
application.properties (Default by Spring Boot)
spring.mustache.prefix=classpath:/templates/
spring.mustache.suffix=.mustache
Изображение описывающее поток приложения и связь между Controller и Mustache View:
Руководства Spring Boot
- Установите Spring Tool Suite для Eclipse
- Руководство Spring для начинающих
- Руководство Spring Boot для начинающих
- Общие свойства Spring Boot
- Руководство Spring Boot и Thymeleaf
- Руководство Spring Boot и FreeMarker
- Руководство Spring Boot и Groovy
- Руководство Spring Boot и Mustache
- Руководство Spring Boot и JSP
- Руководство Spring Boot, Apache Tiles, JSP
- Используйте Logging в Spring Boot
- Мониторинг приложений с помощью Spring Boot Actuator
- Создание веб-приложения с несколькими языками с помощью Spring Boot
- Используйте несколько ViewResolver в Spring Boot
- Используйте Twitter Bootstrap в Spring Boot
- Руководство Spring Boot Interceptor
- Руководство Spring Boot, Spring JDBC и Spring Transaction
- Руководство Spring JDBC
- Руководство Spring Boot, JPA и Spring Transaction
- Руководство Spring Boot и Spring Data JPA
- Руководство Spring Boot, Hibernate и Spring Transaction
- Интеграция Spring Boot, JPA и H2 Database
- Руководство Spring Boot и MongoDB
- Используйте несколько DataSources с Spring Boot и JPA
- Используйте несколько DataSource с Spring Boot и RoutingDataSource
- Создайте приложение для входа с Spring Boot, Spring Security, Spring JDBC
- Создайте приложение для входа с Spring Boot, Spring Security, JPA
- Создайте приложение регистрации пользователей с помощью Spring Boot, Spring Form Validation
- Пример OAuth2 Social Login в Spring Boot.
- Запускать фоновые запланированные задачи в Spring
- Пример CRUD Restful Web Service c Spring Boot
- Пример Spring Boot Restful Client c RestTemplate
- Пример CRUD с Spring Boot, REST и AngularJS
- Защита Spring Boot RESTful Service используя Basic Authentication
- Защита Spring Boot RESTful Service используя Auth0 JWT
- Пример Upload file c Spring Boot
- Пример Download file c Spring Boot
- Пример Upload file c Spring Boot и jQuery Ajax
- Пример Upload file c Spring Boot и AngularJS
- Создание веб-приложения для корзины покупок с помощью Spring Boot, Hibernate
- Руководство Spring Email
- Создайте простое приложение Chat с Spring Boot и Websocket
- Разверните приложение Spring Boot на Tomcat Server
- Развертывание приложения Spring Boot на Oracle WebLogic Server
- Установите бесплатный сертификат Let's Encrypt SSL для Spring Boot
- Настройте Spring Boot для перенаправления HTTP на HTTPS
Show More