[Spring MVC]学習ノート-フリーマーカーの使用

32731 ワード

この例を先に貼り付けてgithubに保存します.
https://github.com/lemonbar/spring-mvc-freemarker
 
SpingFrameworkの公式文書は、単にspring-mvcでfreemarkをどのように使うかを示しているが、これに対して提供される情報や例が少ないので、詳細な例を示している.
注:mavenをベースにした構築です.多くの説明はコードに加えられていますので、できるだけコードを貼ります.
Free Marker 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.GreeingController.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>