{% raw %}

JavaScript Mustache 教程

原文: http://zetcode.com/javascript/mustache/

在 JavaScript Mustache 教程中,我们展示了如何使用 Mustache 模板引擎。

Mustache

Mustache 是一个简单的 Web 模板系统。 它可用于许多编程语言,包括 JavaScript 和 Java。 Mustache 被描述为一种无逻辑的模板引擎,因为它没有任何明确的控制流语句,例如ifelse条件语句或for循环。 可以使用节标记处理列表和 lambda 来实现循环和条件评估。

JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。 人类很容易读写,机器也很容易解析和生成。 application/json是 JSON 的官方 Internet 媒体类型。 JSON 文件扩展名是.json

jQuery 是一个 JavaScript 库,用于处理 DOM。 使用 jQuery,我们可以查找,选择,遍历和操作 HTML 文档的各个部分。

  1. <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>

Mustache 是一个 JavaScript 库,可以从 CDN(内容交付网络)引用。

Mustache 基本模板示例

在第一个示例中,我们有一个基本的模板示例。

basic.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>JavaScript Mustache template</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  8. <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
  9. </head>
  10. <body>
  11. <div id="mypanel"></div>
  12. <button id="btn">Load</button>
  13. <script>
  14. $("#btn").on('click', function() {
  15. var data = { name: "Jonathan" };
  16. var template = "Hello {{ name }}";
  17. var text = Mustache.render(template, data);
  18. $("#mypanel").html(text);
  19. });
  20. </script>
  21. </body>
  22. </html>

单击该按钮,我们会在页面上写一条消息。

  1. <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  2. <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>

在示例中,我们使用 JQuery 和 Mustache JavaScript 库。

  1. $("#btn").on('click', function() {
  2. ...
  3. }

我们创建一个对按钮单击事件做出反应的处理器。

  1. var data = { name: "Jonathan" };

这是数据。

  1. var template = "Hello {{ name }}";

这是 Moustache 模板。 {{ name }}是一个 Moustache 标签,已被数据值替换。

  1. var text = Mustache.render(template, data);

最终输出使用Mustache.render()函数渲染。 模板引擎将模板与数据连接起来以生成输出。

  1. $("#mypanel").html(text);

呈现的文本将被写入面板元素。

Mustache 使用模板标签

在第二个示例中,我们使用模板标记。 当前使用的是<script type="text/template">,但是在不久的将来它将被<template>标签取代。 标记包含客户端内容,该内容不会在加载页面时呈现,而是在运行时使用 JavaScript 实例化。

json_url.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <title>JavaScript Mustache template</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  8. <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
  9. </head>
  10. <body>
  11. <script id="mp_template" type="text/template">
  12. Date: {{ time }}
  13. <br>
  14. Time: {{ date }}
  15. <br>
  16. Unix time: {{ milliseconds_since_epoch }}
  17. </script>
  18. <div id="mypanel"></div>
  19. <button id="btn">Load</button>
  20. <script>
  21. $(function() {
  22. $("#btn").on('click', function() {
  23. $.getJSON('http://time.jsontest.com', function(data) {
  24. var template = $("#mp_template").html();
  25. var text = Mustache.render(template, data);
  26. $("#mypanel").html(text);
  27. });
  28. });
  29. });
  30. </script>

在此示例中,我们向time.jsontest.com发送请求,该请求返回具有三个属性的 JSON 响应:timedatemilliseconds_since_epoch(Unix 时间)。

  1. <script id="mp_template" type="text/template">
  2. Date: {{ time }}
  3. <br>
  4. Time: {{ date }}
  5. <br>
  6. Unix time: {{ milliseconds_since_epoch }}
  7. </script>

我们在<script id="mp_template" type="text/template">标签内定义模板。

  1. $.getJSON('http://time.jsontest.com', function(data) {

使用$.getJSON(),我们使用 GET HTTP 请求从服务器加载 JSON 编码的数据。

  1. var template = $("#mp_template").html();

使用 JQuery 的html()方法,我们可以获得模板数据。

  1. var text = Mustache.render(template, data);

输出使用Mustache.render()呈现。

  1. $("#mypanel").html(text);

最终文本将写入面板元素。

带有 Java Servlet 的 Mustache

在第三个示例中,我们使用 servlet 创建一个 Java Web 应用。

  1. $ tree
  2. .
  3. ├── pom.xml
  4. └── src
  5. ├── main
  6. ├── java
  7. └── com
  8. └── zetcode
  9. ├── bean
  10. └── City.java
  11. └── web
  12. └── GetCities.java
  13. └── webapp
  14. ├── index.html
  15. ├── META-INF
  16. └── context.xml
  17. └── WEB-INF
  18. └── test
  19. └── java

这是项目结构。

pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  5. http://maven.apache.org/xsd/maven-4.0.0.xsd">
  6. <modelVersion>4.0.0</modelVersion>
  7. <groupId>com.zetcode</groupId>
  8. <artifactId>ServletJsonMustache</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <name>ServletJsonMustache</name>
  12. <properties>
  13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  14. <maven.compiler.source>1.8</maven.compiler.source>
  15. <maven.compiler.target>1.8</maven.compiler.target>
  16. </properties>
  17. <dependencies>
  18. <dependency>
  19. <groupId>javax.servlet</groupId>
  20. <artifactId>javax.servlet-api</artifactId>
  21. <version>3.1.0</version>
  22. <scope>provided</scope>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.google.code.gson</groupId>
  26. <artifactId>gson</artifactId>
  27. <version>2.8.0</version>
  28. </dependency>
  29. </dependencies>
  30. <build>
  31. <plugins>
  32. <plugin>
  33. <groupId>org.apache.maven.plugins</groupId>
  34. <artifactId>maven-war-plugin</artifactId>
  35. <version>2.3</version>
  36. <configuration>
  37. <failOnMissingWebXml>false</failOnMissingWebXml>
  38. </configuration>
  39. </plugin>
  40. </plugins>
  41. </build>
  42. </project>

这是 Maven POM 文件。 我们有两个工件:用于 Java servlet 的javax.servlet-api和用于 Java JSON 处理的gson

context.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <Context path="/ServletJsonMustache"/>

在 Tomcat context.xml文件中,我们定义了上下文路径。 它是 Web 应用的名称。

City.java

  1. package com.zetcode.bean;
  2. public class City {
  3. private Long id;
  4. private String name;
  5. private int population;
  6. public City() {
  7. }
  8. public City(Long id, String name, int population) {
  9. this.id = id;
  10. this.name = name;
  11. this.population = population;
  12. }
  13. public Long getId() {
  14. return id;
  15. }
  16. public void setId(Long id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public int getPopulation() {
  26. return population;
  27. }
  28. public void setPopulation(int population) {
  29. this.population = population;
  30. }
  31. @Override
  32. public String toString() {
  33. return "City{" + "id=" + id + ", name=" + name +
  34. ", population=" + population + '}';
  35. }
  36. }

这是City bean。 它具有三个属性:id,名称和人口。

GetCities.java

  1. package com.zetcode.web;
  2. import com.google.gson.Gson;
  3. import com.zetcode.bean.City;
  4. import java.io.IOException;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.ServletOutputStream;
  9. import javax.servlet.annotation.WebServlet;
  10. import javax.servlet.http.HttpServlet;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. @WebServlet(name = "GetCities", urlPatterns = {"/GetCities"})
  14. public class GetCities extends HttpServlet {
  15. private static final List<City> cities;
  16. static {
  17. cities = new ArrayList<>();
  18. cities.add(new City(1L, "Bratislava", 432000));
  19. cities.add(new City(2L, "Budapest", 1759000));
  20. cities.add(new City(3L, "Prague", 1280000));
  21. cities.add(new City(4L, "Warsaw", 1748000));
  22. cities.add(new City(5L, "Los Angeles", 3971000));
  23. cities.add(new City(6L, "New York", 8550000));
  24. cities.add(new City(7L, "Edinburgh", 464000));
  25. cities.add(new City(8L, "Berlin", 3671000));
  26. }
  27. @Override
  28. protected void doGet(HttpServletRequest request, HttpServletResponse response)
  29. throws ServletException, IOException {
  30. response.setContentType("application/json;charset=UTF-8");
  31. try (ServletOutputStream os = response.getOutputStream()) {
  32. os.print(new Gson().toJson(cities));
  33. }
  34. }
  35. }

这是GetCities servlet。

  1. response.setContentType("application/json;charset=UTF-8");

响应对象的内容类型设置为application/json

  1. try (ServletOutputStream os = response.getOutputStream()) {
  2. os.print(new Gson().toJson(cities));
  3. }

我们使用Gson库将 Java 列表转换为 JSON 数组。 将该数组写入响应输出流。 数组未命名。

index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Cities</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1">
  7. <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
  8. <script src="https://cdnjs.cloudflare.com/ajax/libs/mustache.js/2.3.0/mustache.min.js"></script>
  9. </head>
  10. <body>
  11. <script id="mp_template" type="text/template">
  12. <table>
  13. <thead>
  14. <tr>
  15. <th>Id</th>
  16. <th>Name</th>
  17. <th>Price</th>
  18. </tr>
  19. </thead>
  20. <tbody>
  21. {{#.}}
  22. <tr>
  23. <td>{{id}}</td>
  24. <td>{{name}}</td>
  25. <td>{{population}}</td>
  26. </tr>
  27. {{/.}}
  28. </tbody>
  29. </table>
  30. </script>
  31. <div id="mypanel"></div>
  32. <button id="btn">Load</button>
  33. <script>
  34. $(function () {
  35. $("#btn").on('click', function () {
  36. $.getJSON('http://localhost:8084/ServletJsonMustache/GetCities', function (cities) {
  37. var template = $("#mp_template").html();
  38. var text = Mustache.render(template, cities);
  39. $("#mypanel").html(text);
  40. });
  41. });
  42. });
  43. </script>
  44. </body>
  45. </html>

这是主页。

  1. <script id="mp_template" type="text/template">
  2. ...
  3. </script>

胡子模板放置在<script id="mp_template" type="text/template">标签中。

  1. <tbody>
  2. {{#.}}
  3. <tr>
  4. <td>{{id}}</td>
  5. <td>{{name}}</td>
  6. <td>{{population}}</td>
  7. </tr>
  8. {{/.}}
  9. </tbody>

使用{{#.}} {{/.}}语法,我们遍历了 servlet 返回的未命名 JSON 数组,并用值替换了 Mustache 标签。

  1. $.getJSON('http://localhost:8084/ServletJsonMustache/GetCities', function (cities) {

使用$.getJSON(),我们称为GetCities Servlet。 该 Servlet 返回 JSON 数据,并使用 Mustache 处理。

命名 JSON 数组

如果我们想命名返回的 JSON 数组,可以使用以下代码:

  1. Gson gson = new GsonBuilder().create();
  2. JsonArray jarray = gson.toJsonTree(cities).getAsJsonArray();
  3. JsonObject jsonObject = new JsonObject();
  4. jsonObject.add("cities", jarray);
  5. os.print(jsonObject.toString());

在 Servlet 中,我们将 JSON 数组放入另一个 JSON 对象中,并将属性命名为cities

  1. <tbody>
  2. {{#cities}}
  3. <tr>
  4. <td>{{id}}</td>
  5. <td>{{name}}</td>
  6. <td>{{population}}</td>
  7. </tr>
  8. {{/cities}}
  9. </tbody>

在 Mustache 模板中,我们使用以下语法:{{#cities}} {{/cities}}

71.md - 图1

图:使用 Mustache 从 Servlet 渲染JSON数据

在本教程中,我们使用了 Mustache 模板引擎。

您可能也对以下相关教程感兴趣: JSON 服务器教程从 JavaScript 中的 URL 读取 JSONJQuery 教程Node.js 教程jQuery 自动完成教程使用 jQuery DatePicker

{% endraw %}