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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

006_基本指令

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 006_基本指令 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. FTL標簽

1.1. 開始標簽: <#directivename parameters>。

1.2. 結束標簽: </#directivename>。

1.3. 除了標簽以#開頭外, 其他都和html、xml的語法很相似。

1.4. 如果標簽沒有嵌套內容(在開始標簽和結束標簽之間的內容), 那么可以只使用開始標簽。例如: <#include something />指令沒有可嵌套的內容。

2. 指令分為預定義指令(FreeMarker定義的指令, 例如: if, list, include)和用戶自定義指令。

3. 用戶自定義的指令使用@來代替#。比如: <@mydirective parameters>...</@mydirective>。

4. if指令

4.1. 使用if指令可以有條件地跳過模板的一些片段。如果condition是false(布爾值), 那么介于<#if condition>和</#if>標簽中的內容會被略過。

<#-- 如果蘿卜比白菜便宜輸出內容, 反之不輸出。 --> <#if radish.price < cabbage.price>蘿卜比白菜便宜。 </#if>

4.2. 使用<#else>標簽可以指定當條件為false時程序所要執行的內容。

<#-- 如果蘿卜比白菜便宜輸出: 蘿卜比白菜便宜; 反之輸出: 白菜比蘿卜便宜。 --> <#if radish.price < cabbage.price>蘿卜比白菜便宜。 <#else>白菜比蘿卜便宜。 </#if>

4.3. if后面使用elseif增加判斷條件。

<#-- 如果蘿卜比白菜便宜輸出: 蘿卜比白菜便宜; 如果白菜比蘿卜便宜輸出: 白菜比蘿卜便宜; 反之輸出: 蘿卜和白菜一樣貴。 --> <#if radish.price < cabbage.price>蘿卜比白菜便宜。 <#elseif cabbage.price < radish.price>白菜比蘿卜便宜。 <#else>蘿卜和白菜一樣貴。 </#if>

4.4. elseif和else必須出現在if內部(也就是, 在if的開始標簽和結束標簽之間)。

4.5. if中可以包含任意數量的elseif(包括0個); 0個或1個else。

5. list指令

5.1. 當需要列表顯示內容時, list指令是必須的。

5.2. list指令的一般格式為: <#list sequence as loopVariable>repeatThis</#list>。repeatThis部分將會在給定的sequence遍歷時在每一項中重復, 從第一項開始, 一個接著一個。在所有的重復中, loopVariable將持有當前遍歷項的值。這個變量僅存在于<#list ...>和</#list>標簽內。

<ul> <#list misc.fruits as fruit><li>${fruit}</li> </#list> </ul>

5.3. 上面示例中的一個問題是如果我們有0個水果, 它仍然會輸出一個空的<ul></ul>, 而不是什么都沒有。要避免這樣的情況, 可以這么來使用list:

<#list misc.fruits as fruit><ul><li>${fruit}</li></ul> </#list>

5.4. 此時, list指令將列表視為一個整體, 如果我們有0個水果, 那么在list中的所有東西都被略過了, 因此就不會有ul標簽了。

5.5. 另一個列表相關的常見任務是: 使用一些分隔符來列出水果, 比如逗號:

<p>Fruits:</p> <#list misc.fruits as fruit>${fruit}<#sep>, </#sep></#list>

5.6. 被sep覆蓋的部分只有當還有下一項時才會被執行。因此最后一個水果后面不會有逗號。

5.7. 再次回到這個話題, 如果我們有0個水果, 會怎么樣?只是打印"Fruits:"也沒有什么不方便。list指令, 也像if指令那樣, 可以有else部分, 如果列表中有0個元素時就會被執行:

<p>Fruits:</p> <#list misc.fruits as fruit>${fruit}<#sep>, </#sep><#else>None</#list>

5.8. 請注意, 循環變量(fruit)在else標簽和list結束標簽中間不存在, 因為那部分不是循環中的部分。

5.9. 如果不得不在第一列表項之前或在最后一個列表項之后打印一些東西, 那么就要使用items指令, 但至少要有一項。

5.10. 所有的這些指令(list, items, sep, else)可以聯合起來使用:

<#list misc.fruits><p>Fruits:</p><ul><#items as fruit><li>${fruit}<#sep>, </#sep></li></#items></ul> <#else><p>We have no fruits.</p> </#list>

5.11. break指令在迭代的任意點退出。通常來說, break將僅存在于為每個迭代項調用的指令體中, 而且只能存在于這樣的指令中。不能在list的else部分使用break, 除非list內嵌到了其它可以break的指令中。如果list使用items指令迭代, 那么break指令必須放在items內部。

6. include指令

6.1. 使用include指令, 我們可以在模板中插入其他文件的內容。

6.2. 假設要在一些頁面中顯示版權聲明的信息。那么可以創建一個文件來單獨包含這些版權聲明, 之后在需要它的地方插入即可。比方說, 我們可以將版權信息單獨存放在頁面文件 copyright_footer.html中:

<i>? 1999–2015 The FreeMarker Project. All rights reserved.</i>

6.3. 當需要用到這個文件時, 可以使用include指令來插入:

<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>主頁</title></head><body><h1>歡迎來到我的個人主頁。</h1><#include "/copyright_footer.html"></body> </html>

6.4. 此時, 輸出的內容為:

<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>主頁</title></head><body><h1>歡迎來到我的個人主頁。</h1><i>? 1999–2015 The FreeMarker Project. All rights reserved.</i></body> </html>

6.5. 當修改了copyright_footer.html文件, 那么訪問者在所有頁面都會看到版權聲明的新內容。

6.6. include指令還可以包含以下參數

6.6.1. parse: 如果它為true, 那么被包含的文件將會當作FTL來解析, 否則整個文件將被視為簡單文本。如果你忽略了這個選項, 那么它默認是true。

6.6.2. encoding: 被包含文件從包含它的文件繼承的編碼方式(實際就是字符集), 除非你用這個選項來指定編碼方式。合法的名字有: ISO-8859-2, UTF-8, Shift_JIS, Big5, EUC-KR, GB2312。

6.6.3. ignore_missing: 當為true, 模板引用為空時壓制錯誤, 而<#include ...>不會輸出任何東西。當為false時, 如果模板不存在, 那么模板處理就會發生錯誤并停止。如果忽略這個選項, 那么它的默認值是false。

6.6.4. 實例: <#include "/foo.ftl" parse=true encoding="UTF-8" ignore_missing=false>

7. 例子

7.1. 新建一個名為FMDirective的動態Web工程, 同時添加相關jar包。

7.2. 編寫FMFactory.java

package com.fm.util;import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import freemarker.template.Configuration; import freemarker.template.TemplateExceptionHandler;public class FMFactory {private final static FMFactory instance = new FMFactory();private FMFactory() {}public static FMFactory getInstance() {return instance;}private Map<String, Configuration> map = new ConcurrentHashMap<String, Configuration>();// 創建單個Configuration實例public synchronized Configuration getCfg(Object servletContext, String path) {if(null != map.get(path)) {return map.get(path);}Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);cfg.setServletContextForTemplateLoading(servletContext, path);cfg.setDefaultEncoding("utf-8");cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);map.put(path, cfg);return cfg;}}

7.3. 編寫Vegetable.java

package com.fm.model;import java.io.Serializable;public class Vegetable implements Serializable {private static final long serialVersionUID = 1L;private Float price; // 動物售價public Vegetable() {}public Vegetable(Float price) {this.price = price;}public Float getPrice() {return price;}public void setPrice(Float price) {this.price = price;}}

7.4. 編寫BaseDirective.java

package com.fm.action;import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.fm.model.Vegetable; import com.fm.util.FMFactory; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;public class BaseDirective extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Configuration cfg = FMFactory.getInstance().getCfg(req.getServletContext(), "/WEB-INF/templates");Vegetable radish = new Vegetable(6F);Vegetable cabbage = new Vegetable(1F);Map<String, Object> root = new HashMap<String, Object>();root.put("radish", radish);root.put("cabbage", cabbage);List<String> fruits = new ArrayList<String>();fruits.add("香蕉");fruits.add("蘋果");fruits.add("梨子");root.put("fruits", fruits);// 獲取模板Template temp = cfg.getTemplate("vegetable.html");Writer out = new OutputStreamWriter(resp.getOutputStream());try {// 合并模板和數據模型temp.process(root, out);} catch (TemplateException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }

7.5. 修改web.xml

?

7.6. 在/WEB-INF/templates目錄下編寫vegetable.html

<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>基本指令</title></head><body><#-- 如果蘿卜比白菜便宜輸出內容, 反之不輸出。 --><#if radish.price < cabbage.price>蘿卜比白菜便宜。</#if>蘿卜: ¥${radish.price}<br />白菜: ¥${cabbage.price}<hr /><#-- 如果蘿卜比白菜便宜輸出: 蘿卜比白菜便宜; 反之輸出: 白菜比蘿卜便宜。 --><#if radish.price < cabbage.price>蘿卜比白菜便宜。<#else>白菜比蘿卜便宜。</#if><hr /><#-- 如果蘿卜比白菜便宜輸出: 蘿卜比白菜便宜; 如果白菜比蘿卜便宜輸出: 白菜比蘿卜便宜; 反之輸出: 蘿卜和白菜一樣貴。 --><#if radish.price < cabbage.price>蘿卜比白菜便宜。<#elseif cabbage.price < radish.price>白菜比蘿卜便宜。<#else>蘿卜和白菜一樣貴。</#if><hr style="background-color: red; height:1px; border:none;" /><ul><#list fruits as fruit><li>${fruit}</li></#list></ul><hr /><#list fruits><ul><#items as fruit><li>${fruit}</li></#items></ul></#list><hr /><#list fruits><p>Fruits:</p><ul><#items as fruit><li>${fruit}<#sep> ,</#sep></li></#items></ul><#else><p>我們沒有庫存水果了。</p></#list><hr style="background-color: red; height:1px; border:none;" /><#include "/copyright_footer.html" /></body> </html>

7.7. 在/WEB-INF/templates目錄下編寫copyright_footer.html

<i>? 1999–2015 The FreeMarker Project. All rights reserved.</i>

7.8. 運行項目

?

總結

以上是生活随笔為你收集整理的006_基本指令的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。