betacode

Руководство Spring Boot и Mustache

  1. Что такое Mustache?
  2. Некоторые примеры с Mustache
  3. Создать проект Spring Boot
  4. Model, DAO
  5. Controller, Mustache Template
  6. Запуск приложения

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:

6. Запуск приложения

Нажать на правую кнопку мыши на проект, выбрать:
  • Run As/Spring Boot App
После этого, пройти по ссылке:

Руководства Spring Boot

Show More