原文: http://zetcode.com/spring/freemarker/

Spring FreeMarker 教程展示了如何在 Spring 应用中使用 FreeMarker 模板引擎。

Spring 是用于创建企业应用的流行 Java 应用框架。

FreeMarker

FreeMarker 是适用于 Web 和独立环境的服务器端 Java 模板引擎。 模板使用 FreeMarker 模板语言(FTL)编写,这是一种简单的专用语言。 FreeMarker 的模板有.ftl扩展。

Spring FreeMarker 示例

以下应用使用 FreeMarker 生成视图。

  1. pom.xml
  2. src
  3. ├───main
  4. ├───java
  5. └───com
  6. └───zetcode
  7. ├───config
  8. MyWebInitializer.java
  9. WebConfig.java
  10. ├───controller
  11. MyController.java
  12. └───service
  13. WordService.java
  14. └───resources
  15. logback.xml
  16. └───templates
  17. index.ftl
  18. showWords.ftl
  19. └───test
  20. └───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>springfreemarkerex</artifactId>
  9. <version>1.0-SNAPSHOT</version>
  10. <packaging>war</packaging>
  11. <properties>
  12. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  13. <maven.compiler.source>11</maven.compiler.source>
  14. <maven.compiler.target>11</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>ch.qos.logback</groupId>
  19. <artifactId>logback-classic</artifactId>
  20. <version>1.2.3</version>
  21. </dependency>
  22. <dependency>
  23. <groupId>org.springframework</groupId>
  24. <artifactId>spring-webmvc</artifactId>
  25. <version>5.1.3.RELEASE</version>
  26. </dependency>
  27. <dependency>
  28. <groupId>javax.servlet</groupId>
  29. <artifactId>javax.servlet-api</artifactId>
  30. <version>4.0.1</version>
  31. <scope>provided</scope>
  32. </dependency>
  33. <dependency>
  34. <groupId>org.springframework</groupId>
  35. <artifactId>spring-context-support</artifactId>
  36. <version>5.1.3.RELEASE</version>
  37. </dependency>
  38. <dependency>
  39. <groupId>org.freemarker</groupId>
  40. <artifactId>freemarker</artifactId>
  41. <version>2.3.28</version>
  42. </dependency>
  43. </dependencies>
  44. <build>
  45. <plugins>
  46. <plugin>
  47. <groupId>org.apache.maven.plugins</groupId>
  48. <artifactId>maven-war-plugin</artifactId>
  49. <version>3.2.2</version>
  50. </plugin>
  51. <plugin>
  52. <groupId>org.eclipse.jetty</groupId>
  53. <artifactId>jetty-maven-plugin</artifactId>
  54. <version>9.4.14.v20181114</version>
  55. </plugin>
  56. </plugins>
  57. </build>
  58. </project>

pom.xml中,我们具有必要的依赖项。

resources/logback.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3. <logger name="org.springframework" level="ERROR"/>
  4. <logger name="com.zetcode" level="INFO"/>
  5. <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
  6. <encoder>
  7. <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n
  8. </Pattern>
  9. </encoder>
  10. </appender>
  11. <root>
  12. <level value="INFO" />
  13. <appender-ref ref="consoleAppender" />
  14. </root>
  15. </configuration>

logback.xml是 Logback 日志库的配置文件。

com/zetcode/config/MyWebInitializer.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  4. @Configuration
  5. public class MyWebInitializer extends
  6. AbstractAnnotationConfigDispatcherServletInitializer {
  7. @Override
  8. protected Class<?>[] getRootConfigClasses() {
  9. return null;
  10. }
  11. @Override
  12. protected Class<?>[] getServletConfigClasses() {
  13. return new Class[]{WebConfig.class};
  14. }
  15. @Override
  16. protected String[] getServletMappings() {
  17. return new String[]{"/"};
  18. }
  19. }

MyWebInitializer注册 Spring DispatcherServlet,它是 Spring Web 应用的前端控制器。

  1. @Override
  2. protected Class<?>[] getServletConfigClasses() {
  3. return new Class[]{WebConfig.class};
  4. }

getServletConfigClasses()返回 Web 配置类。

com/zetcode/config/WebConfig.java

  1. package com.zetcode.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.ComponentScan;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.web.servlet.config.annotation.EnableWebMvc;
  6. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  7. import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
  8. import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver;
  9. @Configuration
  10. @EnableWebMvc
  11. @ComponentScan(basePackages = {"com.zetcode"})
  12. public class WebConfig implements WebMvcConfigurer {
  13. @Bean
  14. public FreeMarkerViewResolver freemarkerViewResolver() {
  15. var resolver = new FreeMarkerViewResolver();
  16. resolver.setCache(true);
  17. resolver.setSuffix(".ftl");
  18. return resolver;
  19. }
  20. @Bean
  21. public FreeMarkerConfigurer freemarkerConfig() {
  22. var freeMarkerConfigurer = new FreeMarkerConfigurer();
  23. freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/");
  24. return freeMarkerConfigurer;
  25. }
  26. }

WebConfig配置 FreeMarker 模板引擎。 我们将模板文件的位置设置为classpath上的templates目录。 (resources在类路径上。)

com/zetcode/service/WordService.java

  1. package com.zetcode.service;
  2. import org.springframework.stereotype.Service;
  3. import java.util.List;
  4. @Service
  5. public class WordService {
  6. private final List<String> words = List.of("pen", "sky",
  7. "rock", "forest", "falcon", "eagle");
  8. public List<String> all() {
  9. return words;
  10. }
  11. }

WordService返回几个字。

com/zetcode/controller/MyController.java

  1. package com.zetcode.controller;
  2. import com.zetcode.service.WordService;
  3. import org.springframework.stereotype.Controller;
  4. import org.springframework.ui.Model;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. @Controller
  7. public class MyController {
  8. @GetMapping(value = "/")
  9. public String home() {
  10. return "index";
  11. }
  12. @GetMapping(value = "/words")
  13. public String showWords(Model model, WordService wordService) {
  14. var words = wordService.all();
  15. model.addAttribute("words", words);
  16. return "showWords";
  17. }
  18. }

MyController提供请求路径和处理器方法之间的映射。 我们有两个映射:home页面和showWords页面。

  1. var words = wordService.all();
  2. model.addAttribute("words", words);

我们使用wordService检索所有单词并将其放入模型中。 该模型将传递到 FreeMarker,后者将处理模板中的数据。

resources/templates/index.ftl

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Home page</title>
  6. </head>
  7. <body>
  8. <p>
  9. <a href="words">Show words</a>
  10. </p>
  11. </body>
  12. </html>

主页包含显示所有单词的锚点。

resources/templates/showWords.ftl

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Show words</title>
  6. </head>
  7. <body>
  8. <h2>List of words</h2>
  9. <ul>
  10. <#list words as word>
  11. <li>${word}</li>
  12. </#list>
  13. </ul>
  14. </body>
  15. </html>

使用 FreeMarker 的list指令,我们可以显示 HTML 列表中的所有单词。

  1. $ mvn jetty:run

我们运行服务器并定位到localhost:8080以获取具有锚点的主页。

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

您可能也对这些相关教程感兴趣: Spring @Configuration教程Java 教程或列出所有 Spring 教程