以下是 Spring MVC 与 FreeMarker 整合的详细步骤,包含配置和代码示例:
1. 添加依赖
在 pom.xml
中引入 Spring MVC 和 FreeMarker 的依赖(以 Maven 为例):
<!-- Spring Web MVC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.23</version>
</dependency>
<!-- FreeMarker 模板引擎 -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.32</version>
</dependency>
2. 配置 Spring MVC 和 FreeMarker
方式一:XML 配置
在 spring-mvc-servlet.xml
中配置视图解析器和 FreeMarker:
<!-- 配置 FreeMarker 的模板加载器和编码 -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/views/" /> <!-- 模板路径 -->
<property name="defaultEncoding" value="UTF-8" /> <!-- 编码 -->
</bean>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value="" /> <!-- 模板路径前缀(与 FreeMarkerConfigurer 一致) -->
<property name="suffix" value=".ftl" /> <!-- 模板后缀 -->
<property name="contentType" value="text/html;charset=UTF-8" /> <!-- 内容类型 -->
</bean>
方式二:Java 配置
通过 Java 配置类完成整合:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.example.controller")
public class WebConfig implements WebMvcConfigurer {
@Bean
public FreeMarkerConfigurer freemarkerConfig() {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPath("/WEB-INF/views/"); // 模板路径
configurer.setDefaultEncoding("UTF-8"); // 编码
return configurer;
}
@Bean
public ViewResolver viewResolver() {
FreeMarkerViewResolver resolver = new FreeMarkerViewResolver();
resolver.setPrefix(""); // 模板路径前缀
resolver.setSuffix(".ftl"); // 模板后缀
resolver.setContentType("text/html;charset=UTF-8"); // 内容类型
return resolver;
}
}
3. 创建 FreeMarker 模板文件
在 /WEB-INF/views/
目录下创建 .ftl
文件(如 hello.ftl
):
<!DOCTYPE html>
<html>
<head>
<title>Hello FreeMarker</title>
</head>
<body>
<h1>${message}</h1> <!-- 显示从 Controller 传递的数据 -->
</body>
</html>
4. 编写 Controller
创建一个 Controller 返回视图名称和模型数据:
@Controller
public class HelloController {
@RequestMapping("/hello")
public ModelAndView hello() {
ModelAndView mav = new ModelAndView("hello"); // 视图名称(对应 hello.ftl)
mav.addObject("message", "Hello, FreeMarker with Spring MVC!"); // 传递数据
return mav;
}
}
5. 配置 web.xml
确保 DispatcherServlet
已正确配置:
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-mvc-servlet.xml</param-value> <!-- XML 配置路径 -->
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
6. 测试
启动应用,访问 http://localhost:8080/your-app-context/hello
,页面应显示:
Hello, FreeMarker with Spring MVC!
常见问题与解决
模板文件找不到
- 检查
templateLoaderPath
是否配置正确(注意末尾的/
)。 - 确保模板文件位于
/WEB-INF/views/
目录下。
- 检查
中文乱码
- 在
FreeMarkerConfigurer
和ViewResolver
中设置defaultEncoding
和contentType
为UTF-8
。
- 在
静态资源访问
- 如果静态资源(CSS/JS)无法加载,在
web.xml
中配置默认 Servlet 处理:<servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/static/*</url-pattern> </servlet-mapping>
- 如果静态资源(CSS/JS)无法加载,在
高级配置
自定义 FreeMarker 设置
在freemarkerConfig
中设置变量或共享函数:@Bean public FreeMarkerConfigurer freemarkerConfig() { FreeMarkerConfigurer configurer = new FreeMarkerConfigurer(); configurer.setTemplateLoaderPath("/WEB-INF/views/"); Properties settings = new Properties(); settings.put("datetime_format", "yyyy-MM-dd HH:mm:ss"); // 设置日期格式 configurer.setFreemarkerSettings(settings); return configurer; }
在模板中使用 Spring 标签
在.ftl
文件中引入 Spring 标签库:<#import "spring.ftl" as spring> <@spring.message "welcome.message"/>
通过以上步骤,即可完成 Spring MVC 与 FreeMarker 的无缝整合,实现动态模板渲染。