Spring MVC 与 FreeMarker 整合

以下是 Spring MVC 与 FreeMarker 整合的详细步骤,包含配置和代码示例:


1. 添加依赖

pom.xml 中引入 Spring MVC 和 FreeMarker 的依赖(以 Maven 为例):

xml 复制代码
<!-- 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:

xml 复制代码
<!-- 配置 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 配置类完成整合:

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):

html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>Hello FreeMarker</title>
</head>
<body>
    <h1>${message}</h1> <!-- 显示从 Controller 传递的数据 -->
</body>
</html>

4. 编写 Controller

创建一个 Controller 返回视图名称和模型数据:

java 复制代码
@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 已正确配置:

xml 复制代码
<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!

常见问题与解决

  1. 模板文件找不到

    • 检查 templateLoaderPath 是否配置正确(注意末尾的 /)。
    • 确保模板文件位于 /WEB-INF/views/ 目录下。
  2. 中文乱码

    • FreeMarkerConfigurerViewResolver 中设置 defaultEncodingcontentTypeUTF-8
  3. 静态资源访问

    • 如果静态资源(CSS/JS)无法加载,在 web.xml 中配置默认 Servlet 处理:

      xml 复制代码
      <servlet-mapping>
          <servlet-name>default</servlet-name>
          <url-pattern>/static/*</url-pattern>
      </servlet-mapping>

高级配置

  • 自定义 FreeMarker 设置

    freemarkerConfig 中设置变量或共享函数:

    java 复制代码
    @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 标签库:

    html 复制代码
    <#import "spring.ftl" as spring>
    <@spring.message "welcome.message"/>

通过以上步骤,即可完成 Spring MVC 与 FreeMarker 的无缝整合,实现动态模板渲染。

相关推荐
indexsunny2 小时前
互联网大厂Java求职面试实战:Spring Boot微服务与Redis缓存场景解析
java·spring boot·redis·缓存·微服务·消息队列·电商
无心水2 小时前
【分布式利器:腾讯TSF】7、TSF高级部署策略全解析:蓝绿/灰度发布落地+Jenkins CI/CD集成(Java微服务实战)
java·人工智能·分布式·ci/cd·微服务·jenkins·腾讯tsf
28岁青春痘老男孩7 小时前
JDK8+SpringBoot2.x 升级 JDK 17 + Spring Boot 3.x
java·spring boot
方璧7 小时前
限流的算法
java·开发语言
元Y亨H7 小时前
Nacos - 服务注册
java·微服务
曲莫终8 小时前
Java VarHandle全面详解:从入门到精通
java·开发语言
一心赚狗粮的宇叔8 小时前
中级软件开发工程师2025年度总结
java·大数据·oracle·c#
奋进的芋圆8 小时前
DataSyncManager 详解与 Spring Boot 迁移指南
java·spring boot·后端
计算机程序设计小李同学8 小时前
个人数据管理系统
java·vue.js·spring boot·后端·web安全
小途软件9 小时前
用于机器人电池电量预测的Sarsa强化学习混合集成方法
java·人工智能·pytorch·python·深度学习·语言模型