freemarker模板引擎的使用

  freemarker是一套前端模板引擎,在使用时,要先在web项目中添加freemarker.jar的依赖。

  我在这里主要演示spring-mvc整合freemarker模板引擎。项目案例的文件包结构示意图如下:

  首先,在工程的web.xml文件中进行配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
    <!--配置前端控制器-->
    <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>classpath:config/springmvc-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring-mvc</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>
    <!--配置编码格式为utf-8-->
    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

  然后配置springmvc-config.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"
       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">

    <context:component-scan base-package="com.itszt.controller"></context:component-scan>

    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
    <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>

    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
        <property name="defaultEncoding" value="UTF-8"></property>
        <property name="templateLoaderPath" value="/WEB-INF/templates/"></property>
    </bean>
    <!--spring-mvc整合freemarker-->
    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"></property>
        <property name="contentType" value="text/html;charset=UTF-8"></property>
        <property name="suffix" value=".ftl"></property>
    </bean>
</beans>

  网站首页如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <a href="/testController/test1.html">test1</a>
    <hr>
  <a href="/testController/test2.html">test2</a>
    <hr>
    <a href="/testController/test3.html">test3</a>
    <hr>
    <a href="/testController/test4.html">test4</a>
    <hr>
    <a href="/testController/test5.html">test5</a>
    <hr>
    <a href="/testController/test6.html">test6</a>
    <hr>
    <a href="/testController/test7.html">test7</a>
    <hr>
    <a href="/testController/test8.html">test8</a>
    <hr>
    <a href="/testController/test9.html">test9</a>
  </body>
</html>

  后台Java代码如下:

package com.itszt.domain;

import java.util.List;

/**
 * 实体类
 */
public class User {
    private String username,usersex;
    private int userage;
    private String nation,hometown;
    private List<String> userhbs;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getUsersex() {
        return usersex;
    }

    public void setUsersex(String usersex) {
        this.usersex = usersex;
    }

    public int getUserage() {
        return userage;
    }

    public void setUserage(int userage) {
        this.userage = userage;
    }

    public String getNation() {
        return nation;
    }

    public void setNation(String nation) {
        this.nation = nation;
    }

    public String getHometown() {
        return hometown;
    }

    public void setHometown(String hometown) {
        this.hometown = hometown;
    }

    public List<String> getUserhbs() {
        return userhbs;
    }

    public void setUserhbs(List<String> userhbs) {
        this.userhbs = userhbs;
    }
}
-----------------------------------------------
package com.itszt.controller;

import com.itszt.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.*;

/**
 * 控制器
 */
@RequestMapping("testController")
@Controller
public class TestController {
    @RequestMapping("test1")
    public String test1(HttpServletRequest request, HttpSession session){
        request.setAttribute("data1","dd");
        request.setAttribute("data2","ff");
        session.setAttribute("data3","vv");
        return "hello";
    }

    @RequestMapping("test2")
    public String test2(Model model){
        User user=new User();
        user.setUsername("张三");
        user.setUsersex("男");
        user.setUserage(18);
        user.setNation("汉族");
        user.setHometown("中国北京市通州");

        List<String> userhbs=new ArrayList<>();
        userhbs.add("爬山");
        userhbs.add("游泳");
        userhbs.add("滑冰");

        user.setUserhbs(userhbs);

        Date date=new Date();

        model.addAttribute("data1",user);
        model.addAttribute("data2",date);

        return "test2";
    }

    @RequestMapping("test3")
    public String test3(Model model){
        List<String> list=new ArrayList<>();
        list.add("爬山");
        list.add("游泳");
        list.add("打篮球");
        model.addAttribute("data1",list);

        Map<String,String> map=new HashMap();
        map.put("key1","value1");
        map.put("key2","value2");
        map.put("key3","value3");
        model.addAttribute("data2",map);

        return "test3";
    }

    @RequestMapping("test4")
    public String test4(Model model){
        User user1=new User();
        user1.setUsername("Jim");
        user1.setUsersex("male");
        user1.setUserage(18);

        User user2=new User();
        user2.setUsername("Tom");
        user2.setUsersex("female");
        user2.setUserage(19);

        User user3=new User();
        user3.setUsername("Stone");
        user3.setUsersex("male");
        user3.setUserage(20);

        List<User> users=new ArrayList<>();
        users.add(user1);
        users.add(user2);
        users.add(user3);

        model.addAttribute("users",users);

        return "test4";
    }

    @RequestMapping("test5")
    public String test5(Model model){
        model.addAttribute("str1","ABCD");
        model.addAttribute("str2","abcd");
        model.addAttribute("intData1",159);
        model.addAttribute("intData2",753);
        return "test5";
    }

    @RequestMapping("test6")
    public String test6(Model model){
        model.addAttribute("scoreMath",65);
        model.addAttribute("scoreJava",90);
        return "test6";
    }

    @RequestMapping("test7")
    public String test7(Model model){
        model.addAttribute("htmlData","<h3 stype='color:red;font-weight:bold;'>你好,霍金先生,请一路走好!</h3>");
        model.addAttribute("lowerData","ABCD");
        model.addAttribute("upperData","abcd");
        model.addAttribute("cfData","abcd");
        model.addAttribute("intData",123.456);
        return "test7";
    }


    @RequestMapping("test8")
    public String test8(Model model){
        return "test8_1";
    }

    @RequestMapping("test9")
    public String test9(Model model){
        model.addAttribute("data1","我是后台返回的一个数据");
        return "test9";
    }


}

  WEB-INF/templates下的模板文件如下:

hello.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我是第一个FreeMarker
<hr>
动态数据展示1:${data1}
<hr>
动态数据展示2:${data2}
<hr>
动态数据展示2:${data3}
</body>
</html>
-----------------------------------------
test2.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示javabean和日期
<hr>
动态数据展示1:${data1.username}--${data1.usersex}--${data1.userage}--${data1.nation}--${data1.hometown}
<hr>
动态数据展示2:${data2?string("yyyy-MM-dd HH:mm:ss")}

</body>
</html>
----------------------------------------------
test3.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示javabean和日期
<hr>
动态数据展示1:
该集合中元素的个数:${data1?size} 个
<#list data1 as hb>
    <h3>
        ${hb_index}.${hb}
    </h3>
</#list>
<hr>
动态数据展示2:
该集合中元素的个数:${data2?size} 个
<#list data2?keys as mapKey>
   <h3>
   ${mapKey}--${data2[mapKey]}
   </h3>
</#list>
</body>
</html>
---------------------------------------------
test4.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
动态数据展示:
该集合中共有 : ${users?size}  个
<#list users as user >
    <h4>${user_index+1}. ${user.username}  ${user.usersex} ${user.userage}</h4>
</#list>
</body>
</html>
---------------------------------------------------
test5.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
<h3>演示字符串拼接</h3>
${"前面的东西${str1}"}
<br>
${"${str2}后面的东西"}
<br>
${intData1}
</body>
</html>
-------------------------------------------------
test6.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
<#if scoreMath gt 90>
    数学优秀
<#elseif scoreMath gte 60>
数学一般
<#else>
数学不及格
</#if>
<hr>
<#if (scoreMath+scoreJava) gt 160>
    优秀学生
<#elseif (scoreMath+scoreJava) gte 120>
一般学生
<#else >
不及格学生
</#if>
</body>
</html>
------------------------------------------------
test7.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
你好啊。。我来显示date和javabean的FreeMarker
<hr>
${htmlData}
<hr>
${htmlData?html}
<hr>
${upperData?upper_case}
<hr>
${lowerData?lower_case}
<hr>
${cfData?cap_first}
<hr>
${intData?int}
</body>
</html>
----------------------------------------
test8_1.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
我是8-1的东西。。。。嘻嘻哈哈
<#include "test8_2.ftl">
</body>
</html>
---------------------------------------
test8_2.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
我是8-2的东西。。。。
</body>
</html>
------------------------------------------
test9.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
演示macro自定义标签:
<#import "test10.ftl" as xgk />
1
<#--<@xgk.tag1 data="${data1}">xxxxxxxxx</@xgk.tag1>-->

<@xgk.tag1 data="${data1}">xxxxxxxxx</@xgk.tag1>

<hr><hr>
</body>
</html>
-----------------------------------------
test10.ftl
<html>
<head>
    <title>$Title$</title>
</head>
<body>
<hr>
<#--<#macro tag1 data>
    <hr>
    <hr>
    <h3 style="color: red">我是一个自定义的标签的效果,展示后台传来的数据:</h3>
    <h5>${data} <#nested /></h5>
    <hr>
    <hr>
</#macro>-->

<#macro tag1 data>
<hr>
<hr>
<h3 style="color: red;">
    我是test10.ftl
</h3>
<h5>
    ${data} <#nested />
</h5>
<hr>
<hr>
</#macro>
</body>
</html>

  总的来说,在在.ftl的页面里,可以这样操作传递过来的数据:

	直接显示数据或数据的hashcode	${dataName}
	显示自定义类型对象的属性	${dataName.username}
	显示日期型数据	${dateData?String("yyyy-MM-dd HH:mm:ss")}
	显示List型数据	${listData?size}	
			<#list listData? as hb>
				${hb_index}	${hb}
			</#list>
	显示Map型数据	${mapData?size}
			<#list mapData?keys as mapKey>
				${mapKey}	${mapData[mapKey]}
			</#list>
	显示自定义类型对象的list集合:
			<#list users as user>
				${user_index}	${user.username}
			</#list>
	字符串拼接	${"前面的东西${strData}"}
	if判断	<#if scoreMath gt 90>
			数学优秀
			<#elseif scoreMath gte 60>
			数学一般
			<#else>
			数学不及格
		</#if>
	其他函数	${htmlData?html}
			${upperData?upper_case}
			${lowerData?lower_case}
			${cfData?cap_first}
			${intData?int}
	引入其他.ftl页面	在test1.ftl中写入
				<#include "test2.ftl">
	macro自定义标签	test2.ftl页面中写:
				<#macro tag1 data>
				${data} <#nested />
				</#macro>
			test1.ftl页面中写:
				<#import "test2.ftl" as xgk />
				<@xgk.tag1 data="${dataParam}">haha</xgk.tag1>
posted @ 2018-03-21 18:58  奔跑在梦想的道路上  阅读(3306)  评论(0编辑  收藏  举报