Freemarker入門

寫在前面的話

從2016年開始工做到如今, 歷來沒有整理彙總過本身所學。 因此趁着如今在作新項目,打算把本身所接觸到的技術點經過文檔的形式記錄下來。 一方面是鞏固下以前所學,加深印象。另外一方面也是爲了造成本身的知識庫, 方便之後查看。html

那麼就先從Freemarker開始java

什麼是Freemarker

Freemarker是一款模板生成引擎, 是一種基於模板生成靜態文件的通用技術。好比生成靜態html文件, 代碼生成器中生成通用Java文件等等。如今也用來替代jsp進行數據展現web

Freemarker是採用Java語言編寫的spring

Freemarker 使用步驟

  1. 首先須要定義模板頁面 freemarker文件後綴爲.ftl
  2. 後臺讀取模板頁面,已鍵值對的形式給Freemarker傳遞數據替換模板中的取值表達式
  3. 根據配置的路徑生成靜態文件

實例代碼: 生成一個java文件

環境: maven生成的java項目apache

<!--依賴-->
<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>
複製代碼
  1. FreemarkerUtil 包含對Freemarker的配置和生成文件的工具
public class FreemarkerUtil {

    /**
     * 獲取Freemarker的Template
     *
     * @param fileName 模板名稱
     * @return
     * @throws IOException
     */
    public Template getTemplate(String fileName) throws IOException {
        Configuration cfg = new Configuration();

        // 定義模版的位置
        //從指定文件夾中獲取
        //cfg.setDirectoryForTemplateLoading(new File(""));
        //從類路徑中
        cfg.setClassForTemplateLoading(getClass(), "/templates");
        // 設置對象包裝器
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        // 設置異常處理器
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.IGNORE_HANDLER);

        return cfg.getTemplate(fileName);
    }

    /**
     * 輸出文件
     * @param fileName  模板名稱
     * @param map       數據
     * @param path      生成後的文件路徑
     */
    public void out(String fileName, Map<String, Object> map, String path) {
        PrintWriter printWriter = null;

        try {
            Template template = getTemplate(fileName);
            
            printWriter = new PrintWriter(new FileWriter(path));

            //生成文件
            template.process(map, printWriter);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            if (printWriter != null) {
                printWriter.close();
            }
        }
    }
}
複製代碼
  1. 在resources中新建templates文件夾, 在其中配置App.ftl模板文件
<#-- 我是freemarker中的註釋 -->
<#-- 生成文件 -->
public class App {
    public static void main(String[] args) {
        System.out.println("${name}");
    }
}
複製代碼

很簡單的java輸出文件spring-mvc

  1. Junit進行測試
public class App {

    FreemarkerUtil mFreemarkerUtil;

    @Before
    public void before() {
        mFreemarkerUtil = new FreemarkerUtil(); //初始化
    }

    @Test
    public void outFile() {
      //傳遞數據
      Map<String, Object> map = new HashMap<String, Object>() {{
        put("name", "hello world");
      }};

      //在D盤下生成App.java文件
      mFreemarkerUtil.out("App.ftl", map, "D:\\tmp\\App.java");
    }

}
複製代碼
  1. 展現:完美生成可執行的java文件。 就這樣簡單的小例子,先熟悉下Freemarker的用法

展現效果

Freemarker是經過鍵值對的方式傳遞數據, 因此在ftl中間中要展現後臺傳遞的數據 只須要${key}的形式便可 相似於jsp的EL表達式緩存

經常使用指令

list指令

對傳遞過來的集合數據進行迭代bash

語法mvc

//普通數據
<#list lists as item> //lists:集合數據 item:循環變量 item_index: 循環索引
  ${item}
</#list>

//循環map
<#list maps?keys as key>
  ${maps[key]}
</#list>

//循環集合中的對象
<#list lists as item>
  ${item.字段}
</#list>

//其餘屬性
${lists?size}   //獲取集合的長度
複製代碼

if else 指令

主要是作if判斷用的,要注意的是條件等式必須用括號括起來。app

語法

<#if 條件>
  //一個判斷
<#elseif 條件>
  //另一種判斷
<#else>
  //除以上以外的其餘判斷
</#if>
複製代碼

注意點:

  1. elseif 和 else 必須包含在 if 中
  2. if 中不是必須出現elseif 和else 也能夠單獨if 判斷,而後結束

小實例:結合list指令和if else指令 展現列表 並隔行換色

template1.ftl文件 (節省篇幅 只貼出有用代碼)

<head>
  <style>
      li { background: #FFF; color: #000; }
      li.active { background: #F00; color: antiquewhite; }
      li.primary { background: #FF0; color: aqua; }
  </style>
</head>
<body>
<ul>
  <#-- 我是freemarker中的註釋 -->
  <#--循環-->
  <#list list as l> 
  <#if (l_index + 1) % 2 == 0> <#--判斷 循環索引於2的餘數是否爲0-->
  <li class="active">
  <#elseif (l_index + 1) % 3 == 0> <#--判斷 循環索引於3的餘數是否爲0-->
  <li class="primary">
  <#else>
  <li>
  </#if>
    ${l}- ${l_index + 1}
  </li>
  </#list>
</ul>
</body>
</html>
複製代碼

java代碼

@Test
public void template1() {
    List<String> list = new ArrayList<String>();
    for (int i = 'A'; i <= 'z'; i++) {
        list.add((char) i + "");
    }

    mRoot.put("list", list);

    //對應上的例子的FreemarkerUtil
    mFreemarkerUtil.out("template1.ftl", mRoot, "D:\\tmp\\template1.html");
}
複製代碼

展現效果

HTML展現效果

能夠看到在html生成成功, 打開按照if 判斷的形式循環展現 (-_- 完美)

include 指令

該指令表示導入其餘的文件或者freemarker文件, 通常用於導入公共文件, 如網站的頭部, 公共資源文件,版權信息等

語法

//這裏的path表明文件的路徑
<#include path>
複製代碼

import 指令

該指令相似於include, 不一樣的是import導入進來後, 能夠在該文件中使用被導入文件的宏組件

語法

// path 文件路徑  p 別名

<#import path as p>
複製代碼

小實例: include 和 import 展現其區別

include和import區別展現效果

setting 指令

該指令用於動態設置freeMarker的運行環境。

語法

<#setting name=value>
複製代碼

name的取值範圍包括:

  1. locale: 指定該模板所用的國家/語言選項
  2. number_format: 定格式化輸出數字的格式
  3. boolean_format: 指定兩個布爾值的語法格式,默認值是true,false
  4. date_format, time_format, datetime_format: 指定顯示的時間格式
  5. time_zone:設置格式化輸出日期時所使用的時區

插值

插值就是${...}或#{...}格式的部分,將使用數據模型中的部分替代輸出

字符串插值

${name} //直接輸出

數字值

經過setting配置數字顯示格式

<#setting number_format="0.##">
${150}  -->>>   150.00  
${150.568}  -->>>   150.57  //四捨五入的形式
複製代碼

經過string指令

${150?string("0.##")}  -->>>   150.00  //一樣的展現效果
複製代碼

日期展現, 一樣可使用兩種形式來配置, 這裏只展現經過string指令來展現的效果

${.now?string("yyyy-MM-dd HH:mm:ss")}  ->>  2019-07-16 15:57:40 //展現當前時間 
複製代碼

字符串爲空或者爲null判斷

${prices!"111"} //若是prices沒有定義或者爲null 那麼就顯示111 不然就顯示prices的值

關於更多的的指令的描述和學習, 能夠 點擊這裏查看中文在線手冊

SpringMVC + Freemarker整合使用

前面說到Freemarker不僅是模板引擎, 還能夠替代jsp當作界面展現效果, 那麼咱們來看下和SpringMVC的整合

maven 配置 Freemarker的jar包

<dependency>
  <groupId>org.freemarker</groupId>
  <artifactId>freemarker</artifactId>
  <version>2.3.23</version>
</dependency>
<!-- ui.freemarker -->
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.18.RELEASE</version>
</dependency>
複製代碼

spring-mvc.xml

<!--視圖解析器-->
<!--配置試圖解析器  -->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
  <property name="order" value="1"></property>
  <property name="suffix" value=".ftl"></property>
  <property name="contentType" value="text/html;charset=utf-8"></property>
  <property name="viewClass">
    <value>org.springframework.web.servlet.view.freemarker.FreeMarkerView</value>
  </property>
  <property name="requestContextAttribute" value="request"></property>
</bean>
<!--加載freemarker屬性  -->
<bean id="propertySetting" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <property name="locations">
    <list>
      <value>classpath:freemarker.properties</value>
    </list>
  </property>
</bean>
<!--freemarker配置  -->
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name="templateLoaderPath">
    <value>/WEB-INF/ftl/</value>
  </property>
  <property name="freemarkerSettings" ref="propertySetting"></property>
</bean>
複製代碼

freemarker.properties

#設置標籤類型:square_bracket:[] auto_detect:[]<>
tag_syntax=auto_detect
#模版緩存時間,單位:秒
template_update_delay=0
default_encoding=UTF-8
output_encoding=UTF-8
locale=zh_CN
#設置數字格式 ,防止出現 000.00
number_format=\#
#變量爲空時,不會報錯
classic_compatible=true
date_format=yyyy-MM-dd 
time_format=HH\:mm\:ss 
datetime_format=yyyy-MM-dd HH\:mm\:ss
複製代碼

controller中使用

@RequestMapping("/center")
public String center(HttpServletRequest request, ModelMap map) {

    map.put("name", "Hello World");

    //完整路徑: /WEB-INF/ftl/index.ftl
    return "/index";
}
複製代碼

到此 關於SpringMVC + Freemarker整合就已經完成。

該內容只是講解關於Freemarker簡單的內容, 更多相關內容參考

  1. Freemarker官方文檔
  2. Freemarker中文在線手冊

預告

經過本章節Freemarker算是簡單入門, 那麼下一節經過實戰來加深對Freemarker的印象

實戰演練, Freemarker + MyBatis 配合開發咱們的代碼生成器

相關文章
相關標籤/搜索