[Spring MVC]学习笔记--FreeMarker的使用

还是先贴出该例子存于github上的位置

https://github.com/lemonbar/spring-mvc-freemarker

Sping-Framework 的官方文档简单列出了在spring-mvc中如何使用freemarker, 但是相对来说提供的信息和例子太少, 所以在这给出一个详细的例子.

注:我是在maven基础上进行的构建, 很多解释已经在代码中加了, 所以尽量贴代码.

FreeMarker Site: http://freemarker.org/

1. 整个文件夹结构

src
    main
        java
            com.lemon.spring.controller
                GreetingController
        webapp
            WEB-INF
                ftl
                    footer.ftl
                    header.ftl
                    login.ftl
                    welcome.ftl
                root-context.xml
                web.xml
pom.xml

2. pom.xml内容

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.lemon.spring</groupId>
    <artifactId>spring-mvc-freemarker</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>spring-mvc-freemarker Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <properties>
        <spring.framework.version>4.0.6.RELEASE</spring.framework.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>
        <!--context-support should be included for freemarker bean definition.-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.framework.version}</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.20</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>spring-mvc-freemarker</finalName>
    </build>
</project>

3. web.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>WEB-INF/root-context.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value></param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>

4. root-context.xml内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.lemon.spring"/>
    <!-- 添加注解驱动 -->
    <mvc:annotation-driven enable-matrix-variables="true"/>
    <!--<context:annotation-config/>-->
    <!-- 允许对静态资源文件的访问 -->
    <mvc:default-servlet-handler />

    <!--freemarker config-->
    <bean id="freemarkerConfig"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="templateLoaderPath" value="/WEB-INF/ftl/"/>
    </bean>

    <!--
    View resolvers can also be configured with ResourceBundles or XML files.
    If you need different view resolving based on Locale, you have to use the resource bundle resolver.
    -->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="cache" value="true"/>
        <property name="prefix" value=""/>
        <property name="suffix" value=".ftl"/>
    </bean>

</beans>

5. GreetingController.java内容

/* 
 * Copyright (c) 2014 General Electric Company. All rights reserved. 
 * 
 * The copyright to the computer software herein is the property of 
 * General Electric Company. The software may be used and/or copied only 
 * with the written permission of General Electric Company or in accordance 
 * with the terms and conditions stipulated in the agreement/contract 
 * under which the software has been supplied. 
 */
package com.lemon.spring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import java.util.Arrays;
import java.util.List;

@Controller
public class GreetingController {

    @RequestMapping(value = "/greeting/{user}", method = RequestMethod.GET)
    public String greeting(@PathVariable String user, Model model) {
        List<String> userList = Arrays.asList(user.split("-"));
        //userList is the variable name, used in ftl file.
        model.addAttribute("userList", userList);
        return "welcome";
    }

    @RequestMapping(value = "/greeting", method = RequestMethod.POST)
    public ModelAndView greeting(@RequestParam("user") String user) {
        List<String> userList = Arrays.asList(user.split("-"));
        ModelAndView result = new ModelAndView("welcome");
        //userList is the variable name, used in ftl file.
        result.addObject("userList", userList);
        return result;
    }

    @RequestMapping("/login")
    public String login() {
        return "login";
    }
}

6. welcome.ftl

<html>
<head>
    <title>Welcome!</title>
</head>
<body>
<#include "./header.ftl"/>
<table border="1">
    <tr><th>Name</th><th>Price</th></tr>
    <#list userList as user>
        <tr><th>${user}</th><th>1.0</th></tr>
    </#list>
</table>
<!--use include to include another ftl file content in this file.-->
<#include "./footer.ftl"/>
</body>
</html>

7. login.ftl

<#import "/spring.ftl" as spring/>
<html>
<head>
    <title>Please input your names, seperator with '-' char.</title>
</head>
<body>
<#include "./header.ftl"/>
<form action="greeting" method="POST">
    Names:
    <input type="text" name="user"/><br>
    <input type="submit" value="submit"/>
</form>
<!--use include to include another ftl file content in this file.-->
<#include "./footer.ftl"/>
</body>
</html>

8. footer.ftl

<hr>
<i>
    Copyright (c) 2014 <a href="http://www.acmee.com">Acmee
    Inc</a>,
    <br>
    All Rights Reserved.
</i>

9. header.ftl

<h1>
    This is header!
</h1>
<hr>
原文地址:https://www.cnblogs.com/lemonbar/p/3912252.html