文章目录

  • 1. 简介
  • 2. SpringMVC 整合 Freemarker
  • 2.1 配置pom.xml
  • 2.2 配置web.xml
  • 2.3 配置springmvc_freemarker.xml
  • 2.4 创建实体类User
  • 2.4 创建UserController
  • 2.4 创建userinfo.ftl模版文件
  • 2.6 运行web程序
  • 2.7 源码和文档
  • 3. Freemarker语法简介
  • 3.1 标签
  • 3.2 常用标签
  • 3.2.1 list遍历
  • 3.2.1 if else
  • 3.2.1 插入页面
  • 3.3 空值处理策略
  • 3.4 数据
  • 3.5 宏(自定义标签)
  • 3.5.1 定义宏 - 两个参数
  • 3.5.2 定义宏 - 带默认值的参数
  • 3.5.3 定义宏 - 嵌套结构


1. 简介

FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1] 。

2. SpringMVC 整合 Freemarker

2.1 配置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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.springmvc</groupId>
    <artifactId>springmvc-freemarker</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <properties>
      <spring.version>4.3.17.RELEASE</spring.version>
      <servlet.version>3.1.0</servlet.version>
      <freemarker.version>2.3.23</freemarker.version>
    </properties>

    <dependencies>
        <!-- Spring Begin -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <!-- Spring End -->

        <!-- Servlet Begin -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${servlet.version}</version>
        </dependency>
        <!-- Servlet End -->

        <!-- freemarker Begin -->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>${freemarker.version}</version>
        </dependency>
        <!-- freemarker End -->
    </dependencies>
</project>

2.2 配置web.xml

这里主要是springmvc的配置,不清楚的可以去看我的另两篇文章
《走向单体地狱(八):Spring MVC》《Spring MVC 的 xml 配置详解》

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

    <servlet>
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc_freemarker.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

2.3 配置springmvc_freemarker.xml

SpringMVC中整合Freemarker的具体配置

<?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-4.1.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
	<!-- 包扫描 -->
	<context:component-scan base-package="com.springmvc.freemarker"/>
	<!-- 开启spring注解支持 -->
	<mvc:annotation-driven/>

	<!-- 定义BeanNameViewResolver 可以用来提供自定义view输出,如pdf等,但是一般用类似千牛的DNS静态服务来代替
	     此处与freemarker无关,仅仅是介绍freemarker在多视图解析器下order的顺序
	-->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
		<property name="order" value="1" />
	</bean>
	<!-- 注册freemarker配置类 -->
	<bean id="freeMarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
		<!-- ftl模版文件路径  -->
		<property name="templateLoaderPath" value="/WEB-INF/view/"></property>
		<!-- 页面编码 -->
		<property name="defaultEncoding" value="utf-8" />
		<property name="freemarkerSettings">
			<props>
				<!-- 模版缓存刷新时间,不写单位默认为秒 -->
				<prop key="template_update_delay">0</prop>
				<!-- 时区 和 时间格式化 -->
				<prop key="locale">zh_CN</prop>
				<prop key="datetime_format">yyyy-MM-dd</prop>
				<prop key="date_format">yyyy-MM-dd</prop>
				<!-- 数字使用.来分隔 -->
				<prop key="number_format">#.##</prop>
			</props>
		</property>
	</bean>
  <!-- 注册freemarker视图解析器 -->
	<bean id="freeMarkerViewResolver"
		class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
		<!-- 视图解析顺序,排在其他视图解析器之后 数字越大优先级越低 -->
		<property name="order" value="2" />
        <!-- 开启模版缓存 -->
		<property name="cache" value="true" />
		<!-- 上面已经配了,这里就不用配啦 -->
		<property name="prefix" value="" />
		<!-- 配置文件后缀 -->
		<property name="suffix" value=".ftl" />
		<property name="contentType" value="text/html;charset=UTF-8" />
    <!-- 是否允许session属性覆盖模型数据,默认false -->
		<property name="allowSessionOverride" value="false" />
    <!-- 是否允许request属性覆盖模型数据,默认false -->
		<property name="allowRequestOverride" value="false" />
    <!-- 开启spring提供的宏帮助(macro) -->
		<property name="exposeSpringMacroHelpers" value="true" />
    <!-- 添加request attributes属性到ModelAndView中 -->
		<property name="exposeRequestAttributes" value="true" />
    <!-- 添加session attributes属性到ModelAndView中 -->
		<property name="exposeSessionAttributes" value="true" />
	</bean>
</beans>

2.4 创建实体类User

创建com.springmvc.freemarker 包,新建entity包然后创建User实体类

public class User implements Serializable {
    private static final long serialVersionUID = 1L;
    private String name;
    private Integer age;

    public User() {
        super();
    }
    public User(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }

}

2.4 创建UserController

com.springmvc.freemarker包下新建Controller包创建UserController

@Controller
@RequestMapping(value = "/user")
public class UserController {

    @RequestMapping(value = "/info")
    public String testFreemarker(HttpServletRequest request, ModelMap modelMap) throws Exception {
        User user = new User("may", 21);
        
        List<String> list = new ArrayList<String>();
        list.add("Jack1");
        list.add("Jack2");
        list.add("Jack3");
        
        modelMap.addAttribute("list", list);
        modelMap.addAttribute("user", user);
        request.setAttribute("haha","哈哈");
        return "userinfo";
    }

}

2.4 创建userinfo.ftl模版文件

在上文配置好的路径/WEB-INF/view/下创建userinfo.ftl模版文件

List:<br/>
<#list list as item >
<font color="red">${item}</br></font>
</#list>

User:<br/>
${user.name}--->${user.age}<br/>

request:<br/>
${haha}

2.6 运行web程序

访问http://localhost:8080/user/info 显示如下结果既为成功

freemarker include 调用 后端 freemarker springmvc_mvc

2.7 源码和文档

源码 github 地址: https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-freemarker freemarker 文档:项目doc目录下
BeanNameViewResolver demo地址:https://github.com/JSONCat/demo-java/tree/master/hello-springmvc-beanresovler

3. Freemarker语法简介

Freemarker是区分大小写的 ,

3.1 标签

标签

说明

${}

插入标签,输出内部的变量,字符串,数字等值

${name}

变量

${"aa"}

字符串

<#...>

ftl的tags标签

<#include "inc/sidebar.ftl">

包含一段文本

<#assign seq = ["foo", "bar", "baz"]>

创建一个变量

<@...>

用户的自定义标签<@EventTabNav activeIndex=2 />

<div class="qrcode"><div>

和html相同的标签

3.2 常用标签

3.2.1 list遍历

<#list forumInfos as f>
    <option value="${f.id}" <#if f.id==fid>selected</#if>>${f.name}</option>
</#list>

3.2.1 if else

<#if o.order.state == 20 && o.order.activityStyleClassPayType == 'O'>
	1
<#elseif o.order.state == 0>
	2
</#if>

3.2.1 插入页面

<#include "inc/cfg.ftl">

3.3 空值处理策略

标签

说明

??

判断左侧的变量是否丢失返回布尔值,相当于java中的null的判断,

?has_content

?has_content非常像??,但是它同时也会对空字符串或空list或空map进行判断

!

用来给变量一个默认值,例如color!”no color”

?if_exists

是??的老写法,现在不推荐使用。

例子:
?,如果不存在返回false,存在返回true

<#if detailList?has_content>
	3
</#if>

!,如果为空,设置一个默认值

${otherPayNote!"" }

(a.b.c)! a,b,c任意一个不存在就为0

${(a.b.c)!0}

a.b.c c!0 仅当c不存在时为0,可能报错不建议这样用

${ a.b.c!0}

3.4 数据

数列[2,3,4,5],类似js数组

2..5						 类比[2,3,4,5]内存占用更少更快
5..2						 类比[5,4,3,2]
[1+1,[1,2,3],"three"]		 可以进行内嵌
  • 取值
    a = [2,3,4,5] b = a[0] b等于2
  • 切分
    a = [2,3,4,5] b = a[0…2] b等于[2,3,4]
  • 连接
    <#list [1,2]+[3,4] as i>

哈希表
拼接<#assign age = {“jack”:20}+{“jack”:30,“lucy”:27}>
拼接后重复的值取决于最右边的哈希表{“jack”:30,“lucy”:27}

3.5 宏(自定义标签)

3.5.1 定义宏 - 两个参数

<#macro greet person color>
	<font size="2" color="${color}">hello ${person}</font>
</#macro>

使用宏

<@greet person="lilei" color="red"/>

3.5.2 定义宏 - 带默认值的参数

<#macro greet person color="yellow">
	<font size="2" color="${color}">hello ${person}</font>
</#macro>

使用宏
使用时必须给全部的参数赋值,要么在定义时设置初始值,否则会报错

<@greet person="lilei"/>

3.5.3 定义宏 - 嵌套结构

<#macro greet color>
	<font size="2" color="${color}">
	   <#nested>
       <#nested>
	</font>
</#macro>

使用宏

<@greet color="red">
	hello world
</@greet>

结果
<#nested>代表使用时标签内的嵌套的内容,可以像上面那样被多次调用,在内嵌元素不能使用宏的局部变量




PS:博文仅作为个人学习笔记,如有错误欢迎指正~
更多内容详见:笔记分类导航目录