Spring FreeMarker
最后修改于 2023 年 10 月 18 日
Spring FreeMarker 教程展示了如何在经典的 Spring 应用程序中使用 FreeMarker 模板引擎。
Spring 是一个流行的 Java 应用程序框架,用于创建企业级应用程序。
FreeMarker
FreeMarker 是一个服务器端 Java 模板引擎,可用于 Web 和独立环境。模板使用 FreeMarker 模板语言 (FTL) 编写,这是一种简单、专业的语言。FreeMarker 模板具有 .ftlh
扩展名。
Spring FreeMarker 示例
以下应用程序使用 FreeMarker 来生成视图。
pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ ├───config │ │ │ MyWebInitializer.java │ │ │ WebConfig.java │ │ ├───controller │ │ │ MyController.java │ │ └───service │ │ WordService.java │ └───resources │ │ logback.xml │ └───templates │ index.ftlh │ showWords.ftlh └───test └───java
这是项目结构。
<?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>com.zetcode</groupId> <artifactId>springfreemarkerex</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> <spring-version>5.3.23</spring-version> </properties> <dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring-version}</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.4.49.v20220914</version> </plugin> </plugins> </build> </project>
在 pom.xml
中,我们有必要的依赖项。
<?xml version="1.0" encoding="UTF-8"?> <configuration> <logger name="org.springframework" level="ERROR"/> <logger name="com.zetcode" level="INFO"/> <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n </Pattern> </encoder> </appender> <root> <level value="INFO" /> <appender-ref ref="consoleAppender" /> </root> </configuration>
logback.xml
是 Logback 日志库的配置文件。
package com.zetcode.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @Configuration public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
MyWebInitializer
注册了 Spring DispatcherServlet
,它是 Spring Web 应用程序的前端控制器。
@Override protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; }
getServletConfigClasses
返回一个 Web 配置类。
package com.zetcode.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer; import org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver; @Configuration @EnableWebMvc @ComponentScan(basePackages = {"com.zetcode"}) public class WebConfig implements WebMvcConfigurer { @Bean public FreeMarkerViewResolver freemarkerViewResolver() { var resolver = new FreeMarkerViewResolver(); resolver.setCache(true); resolver.setSuffix(".ftlh"); return resolver; } @Bean public FreeMarkerConfigurer freemarkerConfig() { var freeMarkerConfigurer = new FreeMarkerConfigurer(); freeMarkerConfigurer.setTemplateLoaderPath("classpath:/templates/"); return freeMarkerConfigurer; } }
WebConfig
配置 FreeMarker 模板引擎。我们将模板文件的位置设置为类路径下的 templates
目录。(resources
目录位于类路径上。)
package com.zetcode.service; import org.springframework.stereotype.Service; import java.util.List; @Service public class WordService { private final List<String> words = List.of("pen", "sky", "rock", "forest", "falcon", "eagle"); public List<String> all() { return words; } }
WordService
返回一些单词。
package com.zetcode.controller; import com.zetcode.service.WordService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @Controller public class MyController { @GetMapping(value = "/") public String home() { return "index"; } @GetMapping(value = "/words") public String showWords(Model model, WordService wordService) { var words = wordService.all(); model.addAttribute("words", words); return "showWords"; } }
MyController
提供请求路径和处理程序方法之间的映射。我们有两个映射:home
页面和 showWords
页面。
var words = wordService.all(); model.addAttribute("words", words);
我们使用 wordService
检索所有单词,并将其放入模型中。模型将传递给 FreeMarker,它将处理模板中的数据。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home page</title> </head> <body> <p> <a href="words">Show words</a> </p> </body> </html>
主页包含一个显示所有单词的链接。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Show words</title> </head> <body> <h2>List of words</h2> <ul> <#list words as word> <li>${word}</li> </#list> </ul> </body> </html>
使用 FreeMarker 的 list
指令,我们在 HTML 列表中显示所有单词。
$ mvn jetty:run
我们运行服务器并访问 localhost:8080
来获取主页,其中包含链接。
在本文中,我们与经典的 Spring 应用程序中的 FreeMarker
模板引擎进行了交互。
作者
列出 所有 Spring 教程。