Contents

FreeMarker 与 Spring MVC 集成

1. 概述

FreeMarker是来自 Apache Software Foundation 的基于 Java 的模板引擎。与其他模板引擎一样,FreeMarker 旨在支持遵循 MVC 模式的应用程序中的 HTML 网页。本教程说明了如何配置 FreeMarker 以在 Spring MVC中作为 JSP 的替代方案使用。 本文不会讨论 Spring MVC 使用的基础知识。如需深入了解,请参阅本文 。此外,这并不是要详细介绍 FreeMarker 的广泛功能。有关 FreeMarker 用法和语法的更多信息,请访问其网站

2. Maven依赖

由于这是一个基于 Maven 的项目,我们首先将所需的依赖项添加到pom.xml中:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>${spring.version}</version>
</dependency>

3. 配置

现在让我们深入了解项目的配置。这是一个基于注解的 Spring 项目,所以我们不会演示基于 XML 的配置。

3.1. Spring配置

让我们创建一个类来配置 Web 组件。为此,我们需要使用*@EnableWebMvc*、@Configuration和*@ComponentScan*来注解类。

@EnableWebMvc
@Configuration
@ComponentScan({"com.blogdemo.freemarker"})
public class SpringWebConfig extends WebMvcConfigurerAdapter {
    // All web configuration will go here.
}

3.2. 配置ViewResolver

Spring MVC 框架提供ViewResolver 接口,将视图名称映射到实际视图。我们将创建一个FreeMarkerViewResolver的实例,它属于spring-webmvc依赖项。

该对象需要使用将在运行时使用的所需值进行配置。例如,我们将配置视图解析器以使用 FreeMarker 来处理以***.ftl***结尾的视图:

@Bean 
public FreeMarkerViewResolver freemarkerViewResolver() { 
    FreeMarkerViewResolver resolver = new FreeMarkerViewResolver(); 
    resolver.setCache(true); 
    resolver.setPrefix(""); 
    resolver.setSuffix(".ftl"); 
    return resolver; 
}

另外,请注意我们如何在这里控制缓存模式——这应该只在调试和开发时禁用。

3.3. FreeMarker 模板路径配置

接下来,我们将设置模板路径,它指示模板在 Web 上下文中的位置:

@Bean 
public FreeMarkerConfigurer freemarkerConfig() { 
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer(); 
    freeMarkerConfigurer.setTemplateLoaderPath("/WEB-INF/views/ftl/");
    return freeMarkerConfigurer; 
}

3.4. Spring控制器配置

现在我们可以使用 Spring Controller 来处理 FreeMarker 模板以进行 display。这只是一个传统的 Spring Controller:

@RequestMapping(value = "/cars", method = RequestMethod.GET)
public String init(@ModelAttribute("model") ModelMap model) {
    model.addAttribute("carList", carList);
    return "index";
}

之前定义的FreeMarkerViewResolver和路径配置将负责将视图名称index转换为正确的 FreeMarker 视图。

4. FreeMarker HTML 模板

4.1. 创建简单的 HTML 模板视图

现在是时候使用 FreeMarker 创建 HTML 模板了。在我们的示例中,我们向模型添加了汽车列表。FreeMarker 可以访问该列表并通过迭代其内容来显示它。

当请求*/cars* URI 时,Spring 将使用它提供的模型处理模板。在我们的模板中, #list指令指示 FreeMarker 应该遍历模型中的carList对象**,使用car来引用当前元素并呈现该块中的内容。

以下代码还包含FreeMarker表达式来引用carList中每个元素的属性;或者例如,要显示当前汽车元素的make属性,我们使用表达式*${car.make}*。

<div id="header">
  <h2>FreeMarker Spring MVC Hello World</h2>
</div>
<div id="content">
  <fieldset>
    <legend>Add Car</legend>
    <form name="car" action="add" method="post">
      Make : <input type="text" name="make" /><br/>
      Model: <input type="text" name="model" /><br/>
      <input type="submit" value="Save" />
    </form>
  </fieldset>
  <br/>
  <table class="datatable">
    <tr>
      <th>Make</th>
      <th>Model</th>
    </tr>
    <#list model["carList"] as car>
      <tr>
        <td>${car.make}</td>
        <td>${car.model}</td>
      </tr>
    </#list>
  </table>
</div>

在使用 CSS 设置输出样式后,处理后的 FreeMarker 模板会生成一个表格和汽车列表:

/uploads/freemarker_in_spring_mvc_tutorial/1.png

5. Spring Boot

如果我们使用 Spring Boot,我们可以简单地导入spring-boot-starter-freemarker依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

然后,我们只需在src/main/resources/templates下添加我们的模板文件。Spring Boot 负责其他默认配置,例如FreeMarkerConfigurerFreeMarkerViewResolver