以下是 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 {@Beanpublic FreeMarkerConfigurer freemarkerConfig() {FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();configurer.setTemplateLoaderPath("/WEB-INF/views/"); // 模板路徑configurer.setDefaultEncoding("UTF-8"); // 編碼return configurer;}@Beanpublic 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 的無縫整合,實現動態模板渲染。