日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Freemarker模版详细介绍

發(fā)布時間:2024/1/18 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Freemarker模版详细介绍 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

FreeMarker

1.主要內(nèi)容

2. FreeMarker概述

2.1.FreeMarker概念

FreeMarker 是一款 模板引擎: 即一種基于模板和要改變的數(shù)據(jù),并用來生成輸出文本(HTML網(wǎng)頁,電子郵件,配置文件,源代碼等)的通用工具。 是一個Java類庫。

FreeMarker 被設(shè)計用來生成 HTML Web 頁面,特別是基于 MVC模式的應(yīng)用程序,將視圖從業(yè)務(wù)邏輯中抽離處理,業(yè)務(wù)中不再包括視圖的展示,而是將視圖交給 FreeMarker 來輸出。雖然FreeMarker 具有一些編程的能力,但通常由 Java 程序準備要顯示的數(shù)據(jù),由 FreeMarker 生成頁面,通過模板顯示準備的數(shù)據(jù)(如下圖):


FreeMarker不是一個Web應(yīng)用框架,而適合作為Web應(yīng)用框架一個組件。

FreeMarker與容器無關(guān),因為它并不知道HTTP或Servlet。

FreeMarker同樣可以應(yīng)用于非Web應(yīng)用程序環(huán)境。

FreeMarker更適合作為Model2框架(如Struts)的視圖組件,你也可以在模板中使用JSP標記庫。

2.2FreeMarker的特性

2.2.1. 通用目標

能夠生成各種文本:HTML、XML、RTF、Java 源代碼等等易于嵌入到你的產(chǎn)品中:輕量級;不需要 Servlet 環(huán)境插件式模板載入器:可以從任何源載入模板,如本地文件、數(shù)據(jù)庫等等;

2.2.2 強大的模板語言

所有常用的指令:include、if/elseif/else、循環(huán)結(jié)構(gòu)在模板中創(chuàng)建和改變變量幾乎在任何地方都可以使用復(fù)雜表達式來指定值命名的宏,可以具有位置參數(shù)和嵌套內(nèi)容名字空間有助于建立和維護可重用的宏庫,或?qū)⒋蠊こ谭殖赡K,而不必擔心名字沖突。

2.2.3. 通用數(shù)據(jù)模型

FreeMarker不是直接反射到Java對象,Java對象通過插件式對象封裝,以變量方式在模板中顯示你可以使用抽象(接口)方式表示對象(JavaBean、XML文檔、SQL查詢結(jié)果集等等),告訴模板開發(fā)者使用方法,使其不受技術(shù)細節(jié)的打擾

2.2.4. 為Web準備

在模板語言中內(nèi)建處理典型Web相關(guān)任務(wù)(如HTML轉(zhuǎn)義)的結(jié)構(gòu)能夠集成到Model2 Web應(yīng)用框架中作為JSP的替代
支持JSP標記庫為MVC模式設(shè)計:分離可視化設(shè)計和應(yīng)用程序邏輯;分離頁面設(shè)計員和程序員

2.2.5. 智能的國際化和本地化

字符集智能化(內(nèi)部使用UNICODE)
數(shù)字格式本地化敏感
日期和時間格式本地化敏感
非US字符集可以用作標識(如變量名)
多種不同語言的相同模板

2.2.6. 強大的XML處理能力

<#recurse> 和 <#visit> 指令(2.3版本)用于遞歸遍歷XML樹。在模板中清楚和直接的訪問XML對象模型。開源論壇 JForum 就是使用了 FreeMarker 做為頁面模板。

2.3. FreeMarker環(huán)境搭建

2.3.1. 新建 Maven Web項目


2.3.2. 配置坐標依賴和部署插件

pom.xml

<?xml version="1.0" encoding="UTF-8"?><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.xxxx</groupId><artifactId>freemarker</artifactId><version>1.0-SNAPSHOT</version><packaging>war</packaging><name>freemarker Maven Webapp</name><!-- FIXME change it to the project's website --><url>http://www.example.com</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><!-- freemarker的坐標依賴 --><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.23</version></dependency><!-- servlet-api的坐標依賴 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.0.1</version></dependency></dependencies><build><finalName>freemarker</finalName><plugins><!-- 配置jetty插件 --><plugin><groupId>org.eclipse.jetty</groupId><artifactId>jetty-maven-plugin</artifactId><version>9.2.1.v20140609</version></plugin></plugins></build> </project>

2.3.3. 修改配置文件 web.xml

在項目的webapp/WEB-INF目錄下的web.xml文件中,添加freemarker 相關(guān) servlet 配置

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!-- FreeMarkerServlet配置 --><servlet><servlet-name>freemarker</servlet-name><servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class><init-param><!-- 模板路徑 --><param-name>TemplatePath</param-name><!-- 默認在webapp目錄下查找對應(yīng)的模板文件 --><param-value>/</param-value></init-param><init-param><!-- 模板默認的編碼:UTF-8 --><param-name>default_encoding</param-name><param-value>UTF-8</param-value></init-param></servlet><!-- 處理所有以.ftl結(jié)尾的文件;ftl是freemarker默認的文件后綴 --><servlet-mapping><servlet-name>freemarker</servlet-name><url-pattern>*.ftl</url-pattern></servlet-mapping></web-app>

2.3.4. 編寫Servlet類

package com.xxxx.controller;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/f01") public class Servlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//添加數(shù)據(jù)req.setAttribute("msg","Hello Freemarker!!");//請求轉(zhuǎn)發(fā)到ftl文件中req.getRequestDispatcher("template/f01.ftl").forward(req,resp);} }

2.3.5. 新建模板文件 ftl

2.3.6. 啟動項目


2.3.7. 訪問項目
瀏覽器地址欄輸入:http://localhost:8989/f01

3. FreeMarker 數(shù)據(jù)類型

Freemarker 模板中的數(shù)據(jù)類型由如下幾種:

  • 布爾型:等價于 Java 的 Boolean 類型,不同的是不能直接輸 出,可轉(zhuǎn)換為字符串輸出
  • 日期型:等價于 java 的 Date類型,不同的是不能直接輸出, 需要轉(zhuǎn)換成字符串再輸出
  • 數(shù)值型:等價于 java 中的 int,float,double 等數(shù)值類型有三種顯示形式:數(shù)值型(默認)、貨幣型、百分比型
  • 字符型:等價于 java 中的字符串,有很多內(nèi)置函數(shù)
  • sequence 類型:等價于java 中的數(shù)組,list,set 等集合類型
  • hash 類型:等價于 java 中的 Map 類型

3.1. 布爾類型

  • 在Servlet中設(shè)置布爾類型的數(shù)據(jù)
  • //設(shè)置布爾類型 req.setAttribute("flag",true);
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型布爾類型在freemarker頁面中不能直接輸出,如果要輸出需要轉(zhuǎn)換成字符串方式一: ?c方式二: ?string 或 ?string('為true時顯示的內(nèi)容','false時顯示的內(nèi)容') --> <h5>布爾類型</h5> ${flag?c} <br> ${flag?string} <br> ${flag?string('yes','no')} <br> ${flag?string('喜歡','不喜歡')} <br>

    3.2. 日期類型

  • 在Servlet中設(shè)置日期類型的數(shù)據(jù)
  • // 日期類型 request.setAttribute("createDate",new Date());
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型日期類型在freemarker中日期類型不能直接輸出,需要轉(zhuǎn)換成日期型或字符串1. 年月日 ?date2. 時分秒 ?time3. 年月日時分秒 ?datetime4. 自定義格式 ?string("自定義")y:年 M:月 d:日H:時 m:分 s:秒 --> <hr> <h5>日期類型</h5> ${createDate?date} <br> ${createDate?time} <br> ${createDate?datetime} <br> ${createDate?string("yyyy/MM/dd HH:mm:ss")} <br>

    3.3. 數(shù)值類型

  • 在Servlet設(shè)置數(shù)值型的數(shù)據(jù)
  • /* 數(shù)值類型 */req.setAttribute("age",18);req.setAttribute("num",10000);req.setAttribute("avg",5.5467);
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型數(shù)值類型在freemarker中數(shù)值類型可以直接輸出;1. 轉(zhuǎn)字符串普通字符串 ?c貨幣型字符串 ?string.currency百分比型字符串 ?string.percent2. 浮點型的數(shù)值轉(zhuǎn)換成指定小數(shù)位輸出 (#表示小數(shù)位)?string["0.##"] (保留兩位) --> <h5>數(shù)值類型</h5> ${age} <br> ${num} <br> ${avg} <br> <#-- 將數(shù)值轉(zhuǎn)換成字符串類型 --> ${num?c} <br> <#-- 將數(shù)值轉(zhuǎn)換成貨幣類型字符串 --> ${num?string.currency} <br> <#-- 將數(shù)值轉(zhuǎn)換成百分比類型的字符串 --> ${avg?string.percent} <br> <#-- 將浮點型的數(shù)值轉(zhuǎn)換成指定小數(shù)位輸出 --> ${avg?string["0.##"]}<br> <hr>

    3.4. 字符串類型

  • 在Servlet中設(shè)置字符串類型的數(shù)據(jù)
  • /* 字符串類型 */ req.setAttribute("msg","Hello"); req.setAttribute("msg2","freemarker");
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型字符串類型在freemarker中字符串類型可以直接輸出;1. 截取字符串(左閉右開) ?substring(start,end)2. 首字母小寫輸出 ?uncap_first3. 首字母大寫輸出 ?cap_first4. 字母轉(zhuǎn)小寫輸出 ?lower_case5. 字母轉(zhuǎn)大寫輸出 ?upper_case6. 獲取字符串長度 ?length7. 是否以指定字符開頭(boolean類型) ?starts_with("xx")?string8. 是否以指定字符結(jié)尾(boolean類型) ?ends_with("xx")?string9. 獲取指定字符的索引 ?index_of("xx")10. 去除字符串前后空格 ?trim11. 替換指定字符串 ?replace("xx","xx") --> <h5>字符串類型</h5> ${msg} -- ${msg2} <br> ${msg?string} -- ${msg2?string} <br> <#-- 1. 截取字符串(左閉右開) ?substring(start,end) --> ${msg?substring(0,2)} <br> <#-- 2. 首字母小寫輸出 ?uncap_first --> ${msg?uncap_first} <br> <#-- 3. 首字母大寫輸出 ?cap_first --> ${msg2?cap_first} <br> <#-- 4. 字母轉(zhuǎn)小寫輸出 ?lower_case --> ${msg?lower_case} <br> <#-- 5. 字母轉(zhuǎn)大寫輸出 ?upper_case --> ${msg2?upper_case} <br> <#--6. 獲取字符串長度 ?length--> ${msg?length} <br> <#--7. 是否以指定字符開頭(boolean類型) ?starts_with("xx")?string--> ${msg?starts_with("a")?string} <br> <#--8. 是否以指定字符結(jié)尾(boolean類型) ?ends_with("xx")?string--> ${msg?ends_with("o")?string} <br> <#--9. 獲取指定字符的索引 ?index_of("xx")--> ${msg2?index_of("m")} <br> <#--10. 去除字符串前后空格 ?trim--> ${msg2?trim}<br> <#--11. 替換指定字符串 ?replace("xx","xx")--> ${msg?replace("He","We")}<br> <hr>

    3.4.1字符串空值情況處理

    FreeMarker 的變量必須賦值,否則就會拋出異常。而對于FreeMarker 來說,null值和不存在的變量是完全一樣的,因為FreeMarker 無法理解 null 值。
    FreeMarker 提供兩個運算符來避免空值:
    !:指定缺失變量的默認值 ${value!}:如果value值為空,則默認值是空字符串
    ${value!“默認值”}:如果value值為空,則默認值是字符串"默認值"
    ② ?? :判斷變量是否存在 如果變量存在,返回true,否則返回 false
    ${(value??)?string}

    <#-- 如果值不存在,直接輸出會報錯 --> <#--${str}--> <#-- 使用!,當值不存在時,默認顯示空字符串 --> ${str!}<br> <#-- 使用!"xx",當值不存在時,默認顯示指定字符串 --> ${str!"這是一個默認值"}<br> <#-- 使用??,判斷字符串是否為空;返回布爾類型。如果想要輸 出,需要將布爾類型轉(zhuǎn)換成字符串 --> ${(str??)?string}<br>

    3.5. sequence類型

  • 在Servlet中設(shè)置字符串類型的數(shù)據(jù)
  • /* 序列類型 (數(shù)組、List、Set) */// 數(shù)組String[] stars = new String[]{"周杰倫","林俊杰","五月天","陳奕迅"};req.setAttribute("stars",stars);// List操作List<String> citys = Arrays.asList("上海","北京","杭州","深圳");req.setAttribute("cityList",citys);// JavaBean集合List<User> userList = new ArrayList<>();userList.add(new User(1,"zhangsan",22));userList.add(new User(2,"lisi",18));userList.add(new User(3,"wangwu",20));req.setAttribute("userList",userList);
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型序列類型(數(shù)組、ListSet)通過list指令輸出序列<#list 序列名 as 元素名>${元素名}</#list>獲取序列的長度 ${序列名?size}獲取序列元素的下標 ${元素名?index}獲取第一個元素 ${序列名?first}獲取最后一個元素 ${序列名?last}倒序輸出 序列名?reverse升序輸出 序列名?sort降序輸出 序列名?sort?reverse指定字段名排序 序列名?sort_by("字段名")注:一般是JavaBean集合,對應(yīng)的字段名需要提供get方法--> <#-- 數(shù)組操作 --> <#list stars as star>下標:${star?index} - 姓名:${star} <br> </#list> 獲取序列的長度:${stars?size} <br> 獲取第一個元素:${stars?first} <br> 獲取最后一個元素: ${stars?last} <br> <hr> <#-- List操作 --> <#list cityList as city>${city} - </#list> <br> <#--倒序輸出 序列名?reverse--> <#list cityList?reverse as city>${city} - </#list> <br> <#--升序輸出 序列名?sort--> <#list cityList?sort as city>${city} - </#list> <br> <#--降序輸出 序列名?sort?reverse--> <#list cityList?sort?reverse as city>${city} - </#list> <br> <hr> <#list userList as user >編號:${user.userId} &nbsp; 姓名:${user.uname} &nbsp; ${user.uage} <br> </#list> <br> <#-- 按照指定字段名排序 --> <#list userList?sort_by("uage") as user > 編號:${user.userId} &nbsp; 姓名:${user.uname} &nbsp; ${user.uage} <br> </#list> <br> <hr>

    3.6. hash 類型

  • 在Servlet中設(shè)置hash類型的數(shù)據(jù)
  • // Map操作Map<String,String> cityMap = new HashMap<>();cityMap.put("sh","上海");cityMap.put("bj","北京");cityMap.put("sz","深圳");req.setAttribute("cityMap",cityMap);
  • 獲取數(shù)據(jù)
  • <#--FreeMarker 數(shù)據(jù)類型hash類型通過list指令輸出獲取map的key及key對應(yīng)的value<#list hash?keys as key>${key} - ${hash[key]}</#list>獲取map的value<#list hash?values as value>${value}</#list> --> <#list cityMap?keys as key>${key} - ${cityMap[key]} <br> </#list> <br> <#list cityMap?values as value>${value} </#list>

    4.FreeMarker 常見指令

    4.1. assign 自定義變量指令

    使用 assign 指令你可以創(chuàng)建一個新的變量, 或者替換一個已經(jīng)存在的變量。

    <#--assign 自定義變量指令語法:<#assign 變量名=><#assign 變量名=值 變量名=> (定義多個變量) --> <#assign str="hello"> ${str} <br> <#assign num=1 names= ["zhangsan","lisi","wangwu"] > ${num} -- ${names?join(",")}

    4.2. if elseif else 邏輯判斷指令

    可以使用 if , elseif 和 else 指令來條件判斷是否滿足某些條件。

    <-- if, else, elseif 邏輯判斷指令格式:<#if condition>...<#elseif condition2>...<#elseif condition3>...<#else>...</#if>注:1. condition, condition2等:將被計算成布爾值的表達式。2. elseif 和 else 指令 是可選的。--> <h5> 2. if, else, elseif 邏輯判斷指令</h5> <#assign score = 60> <#if score lt 60 ><h6>你個小渣渣!</h6><#elseif score == 80><h6>分不在高,及格就行!</h6><#elseif score gt 60 && score lt 80 ><h6>革命尚未成功,同志仍需努力!</h6><#else ><h6>哎喲不錯哦!</h6> </#if> <#assign list=""> <#if list??>數(shù)據(jù)存在<#else >數(shù)據(jù)不存在 </#if> <br> <#if list2??>數(shù)據(jù)存在 <#else >數(shù)據(jù)不存在 </#if> <br><hr>

    4.3. list 遍歷指令

    可以使用 list 指令來對序列進行遍歷。

    <-- 3. list指令格式1<#list sequence as item></#list>格式2<#list sequence as item><#else>當沒有選項時,執(zhí)行else指令</#list>注:1. else 部分是可選的2. sequence: 想要迭代的項,可以是序列或集合的表達式3. item: 循環(huán)變量 的名稱4. 當沒有迭代項時,才使用 else 指令, 可以輸出一些特殊的內(nèi)容而不只是空在那里 --> <h5>3. list指令</h5> <#assign users = ["張三","李四","王五"]> <#list users as user>${user} | </#list> <br> <#--判斷數(shù)據(jù)不為空,再執(zhí)行遍歷 (如果序列不存在,直接遍歷會報錯)--> <#if users2??><#list users2 as user>${user}</#list> </#if> <br> <#-- 當序列沒有數(shù)據(jù)項時,使用默認信息 --> <#assign users3 = []> <#list users3 as user>${user} |<#else >用戶數(shù)據(jù)不存在! </#list> <hr>

    4.4. macro 自定義指令

    可以使用 macro 指令來自定義一些自定義指令。

    <--4. macro 自定義指令 (宏)1. 基本使用格式:<#macro 指令名>指令內(nèi)容</#macro>使用:<@指令名></@指令名>2. 有參數(shù)的自定義指令格式:<#macro 指令名 參數(shù)名1 參數(shù)名2>指令內(nèi)容</#macro>使用:<@指令名 參數(shù)名1=參數(shù)值1 參數(shù)名2=參數(shù)值2></@指令名>注:1. 指令可以被多次使用。2. 自定義指令中可以包含字符串,也可包含內(nèi)置指令--> <h5>4. macro 自定義指令</h5> <#-- 自定義指定 --> <#macro address>? 19992015 The FreeMarker Project. All rights reserved. </#macro> <#-- 使用自定義指令 --> <@address></@address> <#macro address02><h3> ? 19992015 The FreeMarker Project. All rights reserved.</h3> </#macro> <@address02></@address02> <@address02></@address02> <@address02></@address02> <#-- 自定義有參數(shù)的指令 --> <#macro queryUserByName uname>通過用戶名查詢用戶對象 - ${uname} </#macro> <@queryUserByName uname="admin"></@queryUserByName> <br> <#macro queryUserByName02 uname upwd phone>多條件查詢用戶對象 - ${uname} - ${upwd} - ${phone} </#macro> <@queryUserByName02 uname="zhangsan" upwd="123456" phone="1587656789"></@queryUserByName02> <hr> <#-- 自定義指令中包含內(nèi)置指令 --> <#macro cfb><#list 1..9 as i><#list 1..i as j>${j} * ${i} = ${j*i} &nbsp;</#list><br></#list> </#macro> <@cfb></@cfb> <@cfb></@cfb> <hr> <#macro cfb02 num><#list 1..num as i><#list 1..i as j>${j} * ${i} = ${j*i} &nbsp;</#list><br></#list> </#macro> <@cfb02 num=5></@cfb02> <@cfb02 num=7></@cfb02> <hr>

    4.5. nested 占位指令

    nested 指令執(zhí)行自定義指令開始和結(jié)束標簽中間的模板片段。嵌套的片段可以包含模板中任意合法的內(nèi)容。

    <#--nested 占位指令nested 相當于占位符,一般結(jié)合macro指令一起使用。可以將自定義指令中的內(nèi)容通過nested指令占位,當使用自定義指令時,會將占位內(nèi)容顯示。 --> <#macro test>這是一段文本!<#nested><#nested> </#macro> <@test><h4>這是文本后面的內(nèi)容!</h4></@test>

    4.6. import 導(dǎo)入指令

    import 指令可以引入一個庫。也就是說,它創(chuàng)建一個新的命名空間, 然后在那個命名空間中執(zhí)行給定路徑的模板。可以使用引入的空間中的指令。

    commons.ftl

    <#macro cfb> <#list 1..9 as i> <#list 1..i as j> ${j}*${i}=${j*i}&nbsp; </#list> <br> </#list> </#macro>

    在其他ftl頁面中通過import導(dǎo)入commons.ftl的命名空間,使用該命名空間中的指令

    test.ftl

    <#-- 導(dǎo)入命名空間 --> <#import "commons.ftl" as common> <#-- 使用命名空間中的指令 --> <@common.cfb></@common.cfb>

    4.7. include 包含指令

    可以使用 include 指令在你的模板中插入另外一個 FreeMarker模板文件 。 被包含模板的輸出格式是在 include 標簽出現(xiàn)的位置插入的。 被包含的文件和包含它的模板共享變量,就像是被復(fù)制粘貼進去的一樣。

    <#--包含指令(引入其他頁面文件) include--> <#--html文件--> <#include "test.html"> <#--freemarker文件--> <#include "test.ftl"> <#--text文件--> <#include "test.txt">

    5. FreeMarker 頁面靜態(tài)化

    通過上述介紹可知 Freemarker 是一種基于模板的、用來生成輸出文本的通用工具,所以 我們必須要定制符合自己業(yè)務(wù)的模板,然后生成自己的 html 頁面。Freemarker 是通過freemarker.template.Configuration 這個對象對模板進行加載的(它也處理創(chuàng)建和緩存預(yù) 解析模板的工作),然后我們通過getTemplate 方法獲得你想要的模板,有一點要記住freemarker.template.Configuration 在你整個應(yīng)用必須保證唯一實例。

    5.1. 定義模板

    news.ftl

    <#-- 新聞標題 --> <h1>${title}</h1> <p> 新聞來源:${source} &nbsp; 發(fā)布時間:${pubTime? sring("yyyy-MM-dd HH:mm")} </p> <#-- 新聞內(nèi)容 --> <p> ${content} </p>

    5.2. 加載模板

    package com.xxxx.servlet;import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map;@WebServlet("/news") public class NewsServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 實例化模板對象Configuration configuration = new Configuration();// 設(shè)置加載模板的上下文 以及加載模板的路徑 (模板存放路徑)configuration.setServletContextForTemplateLoading(getServletContext(),"/template");// 設(shè)置模板的編碼格式configuration.setDefaultEncoding("UTF-8");// 加載模板文件 獲取模板對象Template template = configuration.getTemplate("news.ftl");// 設(shè)置數(shù)據(jù)模型Map<String,Object> map = new HashMap<>();map.put("title","【戰(zhàn)“疫”說理】良好的公民素養(yǎng)和國民心態(tài)是“硬核”力量");map.put("source","經(jīng)濟日報-中國經(jīng)濟網(wǎng)");map.put("pubTime","2020年03月16日 10:00");map.put("content","公共性的社會大事件,是檢驗和透視公民素養(yǎng)和國民心態(tài)的一個重要窗口。" +"在突襲而至的新冠肺炎疫情面前,一方面,抗擊疫情的過程就是淬煉公民素養(yǎng)和國民心態(tài)的熔爐;另一方面,良好的公民素養(yǎng)和國民心態(tài)也是疫情防控的“硬核”力量,更是推動戰(zhàn)“疫”積極向好態(tài)勢不斷拓展的精神之盾。\n" +"\n疫情防控,既是大戰(zhàn),也是大考。涵養(yǎng)良好的公民素養(yǎng)和國民心態(tài),是疫情期間擺在我們面前的考題,同時也是提升國家治理能力過程中需要面對的課題。\n" +"\n著眼三個方面 提升科學素養(yǎng)\n\n疫情面前,每個人都是防控鏈條中的重要一環(huán)。做好自我保護,既是對自己、家人負責,也是對社會負責。有效做好科學防控,每個人都應(yīng)具備必要的科學素養(yǎng)。");// 獲取項目的根目錄String basePath = req.getServletContext().getRealPath("/");// 設(shè)置html的存放路徑File htmlFile = new File(basePath + "/html");// 判斷文件(目錄)是否存在if (!htmlFile.exists()) {// 如果文件目錄不存在,則新建文件目錄htmlFile.mkdir();}// 得到生成的文件名 (生成隨機不重復(fù)的文件名)String fileName = System.currentTimeMillis() + ".html";// 創(chuàng)建html文件File file = new File(htmlFile,fileName);// 獲取文件輸出流FileWriter writer = new FileWriter(file);// 生成html (將數(shù)據(jù)模型填充到模板中)try {template.process(map,writer);} catch (TemplateException e) {e.printStackTrace();} finally {// 關(guān)閉資源writer.flush();writer.close();}} }

    5.3. 生成對應(yīng)的html文件

    瀏覽器地址欄輸入:http://localhost:8989/news
    生成的文件存放在當前項目的webapp目錄下的html目錄中。

    6. FreeMarker 運算符

    6.1. 算術(shù)運算符

    <!-- 算術(shù)運算 +-*/% --> <#assign a1 = 8 a2 = 2 > ${a1} + ${a2} = ${a1 + a2} <br/> ${a1} - ${a2} = ${a1 - a2} <br/> ${a1} * ${a2} = ${a1 * a2} <br/> ${a1} / ${a2} = ${a1 / a2} <br/> ${a1} % ${a2} = ${a1 % a2} <br/> <!--字符串運算--> ${"hello" + "," + "freemarker"}

    6.2. 邏輯運算符

    <#-- 邏輯運算符 &&||! -->

    6.3. 比較運算符

    <#-- 比較運算符 > (gt): 大于號,推薦使用 gt < (lt): 小于號,推薦使用 lt >= (gte): 大于等于, 推薦是用 gte <= (lte): 小于等于,推薦使用 lte == : 等于 != : 不等于 -->

    6.4. 空值運算符

    <#-- 空值運算符 1. ??:判斷是否為空,返回布爾類型 如果不為空返回 false, 如果為空返回 true,不能 直接輸出 ${(name??)?string} 2. !: 設(shè)置默認值,如果為空,則設(shè)置默認值 1. 設(shè)置默認為空字符串: ${name!} 2. 設(shè)置指定默認值 ${name!'zhangsan'} -->

    總結(jié)

    以上是生活随笔為你收集整理的Freemarker模版详细介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。