# Jtwig 教程 原文:http://zetcode.com/java/jtwig/ 这是 Jtwig Java 模板引擎的入门教程。 我们介绍 Jtwig 模板引擎,并创建几个控制台和 Web 应用。 Maven 用于构建我们的示例。 NetBeans 用于管理应用。 Jtwig 是 Java 编程语言的现代模板引擎。 它是模块化,可配置且易于使用的模板引擎。 它的灵感来自 Django 的模板引擎。 Jtwig 的主页是 [jtwig.org](http://jtwig.org) 。 模板引擎将静态数据与动态数据结合起来以产生内容。 模板是内容的中间表示。 它指定如何生成输出。 模板引擎的优点是: * 关注点分离, * 避免重复代码, * 更容易在视图之间切换, * 可重用性。 Jtwig 不限于 HTML 页面的模板; 它也可以用于纯文本。 ## 控制台应用 前四个应用是控制台应用。 我们在 NetBeans 中创建新的 Maven Java 应用。 他们使用以下 Maven 构建文件: `Excerpt from pom.xml` ```java jcenter https://jcenter.bintray.com/ org.jtwig jtwig-core 5.58 org.slf4j slf4j-simple 1.7.21 ``` 在 Maven `pom.xml`文件中,我们为 Jtwig 和`jtwig-core`和`slf4j-simple`依赖项指定仓库。 ### 变量 在第一个应用中,我们探索 Jtwig `set`命令。 `set`命令允许在 Jtwig 模板中指定分配操作。 它将表达式的结果分配给指定的变量。 ![Java console project structure in NetBeans](img/f8c70008e6fde2b0e3a9e712b00214a4.jpg) 图:NetBeans 中的 Java 控制台项目结构 这是 NetBeans 中的项目结构。 `ConsoleJtwigEx.java` ```java package com.zetcode.client; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; public class ConsoleJtwigEx { public static void main(String[] args) { JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/simple.twig"); JtwigModel model = JtwigModel.newModel(); template.render(model, System.out); } } ``` 我们创建一个处理 Jtwig 模板文件的 Java 控制台应用。 ```java JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/simple.twig"); ``` 创建了`JtwigTemplate`。 它加载位于`src/main/java/resources/templates`目录中的`simple.twig`模板文件。 ```java JtwigModel model = JtwigModel.newModel(); ``` `JtwigModel`已创建。 该模型是键和值对的容器,这些键和值对与模板结合生成输出。 ```java template.render(model, System.out); ``` `render()`方法创建最终输出。 它使用模型并将其输出到系统输出。 `simple.twig` ```java {% set v = 3 + 3 %} {{ v -}} {% set a = [1, 2, 3] %} {{ a[1] -}} {% set m = { k1: "apple", k2: "banana"} %} {{ m["k1"] }} ``` 在`simple.twig`文件中,我们使用`set`命令定义三个变量并显示它们。 ```java {% set v = 3 + 3 %} ``` Jtwig 代码岛以`{%`开头,以`%}`结尾。 ```java {{ v -}} ``` Jtwig 使用`{{`和`}}`显示表达式和变量的值。 `-`是可选的空格控制字符。 在这里,它删除了代码岛后的空白。 ```java 6 2 apple ``` 这是应用的输出。 ### 你好应用 在第二个应用中,我们将一个变量传递给模板。 `ConsoleJtwigEx2.java` ```java package com.zetcode.client; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; public class ConsoleJtwigEx2 { public static void main(String[] args) { JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/hello.twig"); JtwigModel model = JtwigModel.newModel().with("name", "Peter"); template.render(model, System.out); } } ``` 使用`with()`方法,我们将变量传递给模板文件。 `hello.twig` ```java Hello {{ name }} ``` 在模板中,我们显示变量。 ```java Hello Peter ``` 这是示例的输出。 ### 传递列表 在下一个应用中,我们将值列表传递给模板。 `Excerpt from pom.xml` ```java org.jtwig jtwig-core 5.58 org.slf4j slf4j-simple 1.7.21 com.google.guava guava 19.0 ``` 除了`jtwi-core`和`slf4j-simple`库外,我们还将`guava`库添加到项目依赖项中。 `ConsoleJtwigEx3.java` ```java package com.zetcode.client; import com.google.common.collect.Lists; import java.util.List; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; public class ConsoleJtwigEx3 { public static void main(String[] args) { List names = Lists.newArrayList("Jan", "Peter", "Jane"); JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/friends.twig"); JtwigModel model = JtwigModel.newModel().with("names", names); template.render(model, System.out); } } ``` 在代码示例中,我们将名称列表传递给模板。 ```java List names = Lists.newArrayList("Jan", "Peter", "Jane"); ``` 使用 Google Guava,我们创建了一个名称列表。 ```java JtwigModel model = JtwigModel.newModel().with("names", names); ``` 该列表将传递到模板。 `friends.twig` ```java {% for name in names %} {{ name }} {% endfor %} ``` 使用`for`命令,我们浏览列表并显示其元素。 ### 包含模板 使用`include`命令,我们可以包含其他模板文件。 ![Java console project structure in NetBeans 2](img/adc8d8718185a41b0c93dcd678870654.jpg) 图:NetBeans 中的 Java 控制台项目结构 2 `templates`目录中有三个文件。 `ConsoleEx4.java` ```java package com.zetcode.client; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; public class ConsoleJtwigEx4 { public static void main(String[] args) { JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/main.twig"); JtwigModel model = JtwigModel.newModel(); template.render(model, System.out); } } ``` 该示例加载`main.twig`模板,其中包括其他两个模板。 `foot.twig` ```java Footer. ``` 这是`foot.twig`模板。 `head.twig` ```java Header. ``` 这是`head.twig`模板。 `main.twig` ```java {% include "classpath:/templates/head.twig" ignore missing %} Main content. {% include 'classpath:/templates/foot.twig' ignore missing %} ``` 这是`main.twig`模板。 它包括`foot.twig`和`head.twig`模板。 ```java Header. Main content. Footer. ``` This is the output of the example. ## Jtwig servlet 示例 在下面的示例中,我们在标准 Java Web 应用中使用 Jtwig。 该应用打包到`war`文件中,并部署在 NetBeans 的内置 Tomcat 服务器上。 在 NetBeans 中,我们创建一个新的 Maven Web 应用。 ![Jtwig servlet project structure in NetBeans](img/67763bc28098863e4b80de638f046024.jpg) 图:NetBeans 中的 Jtwig servlet 项目结构 这是 NetBeans 中 Jtwig servlet 示例的项目结构。 `context.xml` ```java ``` 这是`context.xml`文件。 `pom.xml` ```java 4.0.0 com.zetcode ServletJtwigEx 1.0-SNAPSHOT war UTF-8 1.8 1.8 ServletJtwigEx jcenter https://jcenter.bintray.com/ javax javaee-web-api 7.0 provided org.jtwig jtwig-web 1.52 org.apache.maven.plugins maven-war-plugin 2.3 false ``` 这是`pom.xml`文件。 我们使用`jtwig-web`依赖项。 `JtwigServlet.java` ```java package com.zetcode; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.jtwig.web.servlet.JtwigRenderer; @WebServlet(name = "JtwigServlet", urlPatterns = {""}) public class JtwigServlet extends HttpServlet { private final JtwigRenderer renderer = JtwigRenderer.defaultRenderer(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { renderer.dispatcherFor("/WEB-INF/templates/index.twig.html") .with("greet", "Jtwig servlet example") .render(request, response); } } ``` 我们设置 servlet 并将其分发到模板文件。 我们将`greet`变量传递给模板。 ```java @WebServlet(name = "JtwigServlet", urlPatterns = {""}) ``` `JtwigServlet`映射到应用的上下文根。 `index.twig.html` ```java {{ greet }} ``` `index.twig.html`文件位于`WEB-INF/templates`目录中。 模板显示`greet`变量。 ![Jtwig servlet example](img/6bb9a392d367ed59f48b503343a24b58.jpg) 图:Jtwig servlet 示例 我们在 Opera 网络浏览器中显示应用输出。 NetBeans 中的内置 Tomcat 在 8084 端口上运行。 ## Spring Boot Spring 是流行的 Java 应用框架。 Spring Boot 是通过最小的努力来创建独立的,生产级的基于 Spring 的应用的产物。 ### Spring Boot 命令行应用 在下一个应用中,我们将 Jtwig 集成到 Spring Boot 命令行应用中。 它是放置在 Spring Boot 框架中的控制台应用。 ![Spring Boot project structure in NetBeans](img/a6a3468335e2a752e45b22bb66271602.jpg) 图:NetBeans 中的 Spring Boot 项目结构 这是在 NetBeans 中使用 Jtwig 的 Spring Boot 应用的项目结构。 `pom.xml` ```java 4.0.0 com.zetcode SpringBootJtwigConsoleEx 1.0-SNAPSHOT jar UTF-8 1.8 1.8 jcenter https://jcenter.bintray.com/ org.springframework.boot spring-boot-starter-parent 1.3.5.RELEASE org.jtwig jtwig-core 5.58 org.springframework.boot spring-boot-starter SpringBootJtwigConsoleEx ``` 这是 Maven 构建文件。 它包括 Spring Boot 和 Jtwig 的依赖项。 `SpringBootClient.java` ```java package com.zetcode.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @ComponentScan(basePackages="com.zetcode") public class SpringBootClient { public static void main(String[] args) { SpringApplication.run(SpringBootClient.class, args); } } ``` `SpringBootClient`设置 Spring Boot 应用。 `@EnableAutoConfiguration`注解启用 Spring Application Context 的自动配置,尝试猜测和配置我们可能需要的 bean。 `MyRunner.java` ```java package com.zetcode.client; import org.jtwig.JtwigModel; import org.jtwig.JtwigTemplate; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class MyRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { JtwigTemplate template = JtwigTemplate.classpathTemplate("templates/greet.twig"); JtwigModel model = JtwigModel.newModel().with("name", "Peter"); template.render(model, System.out); } } ``` `MyRunner`是 Spring Boot 应用的命令行运行程序。 我们加载并渲染模板。 `greet.twig` ```java Hello {{name}}! ``` 这是`greet.twig`模板文件。 ```java Hello Peter! ``` This is the output of the application. ### Spring Boot Web 应用 本教程的最后一个示例使用 Jtwig 模板引擎创建了一个 Spring Boot Web 应用。 请注意,我们正在 NetBeans 中创建 Java SE Maven 应用,而不是 Java Web Maven 应用。 这是因为我们已将 Tomcat 嵌入到我们的 JAR 文件中。 `pom.xml` ```java 4.0.0 com.zetcode SpringBootJtwigWebEx 1.0-SNAPSHOT jar UTF-8 1.8 1.8 jcenter https://jcenter.bintray.com/ org.springframework.boot spring-boot-starter-parent 1.3.5.RELEASE org.springframework.boot spring-boot-starter org.springframework spring-web org.jtwig jtwig-spring-boot-starter 5.55 org.slf4j slf4j-simple 1.7.21 ``` 在`pom.xml`文件中,我们具有以下依赖项:`spring-boot-starter`,`spring-web`,`jtwig-spring-boot-starter`和`slf4j-simple`。 `MyController.java` ```java package com.zetcode.controller; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controller @EnableAutoConfiguration public class MyController { @RequestMapping("/{name}") public String indexAction (ModelMap model, @PathVariable("name") String name) { model.addAttribute("name", name); return "index"; } public static void main(String[] args) throws Exception { SpringApplication.run(MyController.class, args); } } ``` 这是 Spring Boot Web 应用的控制器类。 控制器从请求中读取一个属性,并将其放入模型中。 然后,控制器将映射解析为模板文件。 `index.twig` ```java Hello {{name}}! ``` 这是`index.twig`文件。 ![Spring Boot web example](img/0e950b8b9011192999ab8428f16f1ec6.jpg) 图:Spring Boot Web 示例 Spring Boot 启动一个嵌入式 Tomcat 服务器,监听端口 8080。 本教程专门针对 Jtwig 模板引擎。 您可能也对相关教程感兴趣: [FreeMarker 教程](/java/freemarker/), [Java 教程](/lang/java/),[游戏简介](/java/play/), [Spark 简介](/java/spark/)或 [Stripes 介绍](/java/stripes/)。