日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

017_指令

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

一. assign指令

1. 使用該指令你可以創建一個新的變量或者替換一個已經存在的變量。

2. 語法

<#assign name1=value1 name2=value2 ... nameN=valueN> 或 <#assign same as above... in namespacehash> 或 <#assign name>capture this </#assign> 或 <#assign name in namespacehash>capture this </#assign>

2.1. 變量的名字。

2.2. value: 存儲的值。是表達式。

2.3. namespacehash: (通過import)為命名空間創建的哈希表。是表達式。

3. 通常它在當前的命名空間(也就是和標簽所在模板關聯的命名空間)中創建變量。但如果你是用了in namespacehash, 那么你可以用另外一個命名空間來創建/替換變量。

<#import "/lib/copyright.html" as cr> <#assign dateStart = "2000" in cr> ${cr.dateStart}

4. assign的極端使用是當它捕捉它的開始標記和結束標記中間生成的輸出時。也就是說, 在標記之間打印的東西將不會在頁面上顯示, 但是會存儲在變量中。

<#assign names><#list ["張三", "李四", "王五"] as name>${name}<br /></#list> </#assign> ${names}

二. import指令

1. 引入一個庫。也就是說, 它創建一個新的空命名空間, 然后在那個命名空間中執行給定path參數中的模板, 所以模板用變量(宏, 函數等)填充命名空間。然后使得新創建的命名空間對哈希表的調用者可用。這個哈希表變量將會在命名空間中, 由import的調用者被創建成一個普通變量, 名字就是hash參數給定的。

2. 語法

<#import path as hash />

2.1. path: 模板的路徑。這是一個算作是字符串的表達式。

2.2. hash: 訪問命名空間的哈希表變量不帶引號的名字。不是表達式。

3. 命名空間由使用import指令中所寫的路徑來識別。如果想多次import這個路徑, 那么只會為第一次import引用創建命名空間并執行模板。后面相同路徑的import只是創建一個哈希表當作訪問相同命名空間的"門"。

copyright.html <#assign dateEnd = "2050">directive.html <#import "/lib/copyright.html" as cr> <#import "/lib/copyright.html" as cpyrgt> <#import "/lib/copyright.html" as copyright> ${cr.dateEnd}, ${cpyrgt.dateEnd}, ${copyright.dateEnd}<br /> <#assign dateEnd="2080" in cr> ${cr.dateEnd}, ${cpyrgt.dateEnd}, ${copyright.dateEnd}輸出: 2050, 2050, 2050 2080, 2080, 2080

4. path參數可以是一個相對路徑, 比如: "foo.ftl"和"../foo.ftl"或者是像"/foo.ftl"一樣的絕對路徑。相對路徑是相對于使用import指令模板的目錄。絕對路徑是程序員配置FreeMarker時定義的相對于根路徑的路徑。

三. macro, nested, return指令

1. 創建一個宏變量。

2. 語法

<#macro name param1 param2 ... paramN>...<#nested var1, var2, ..., varN>...<#return>... </#macro> 或 <#macro name param1 param2 paramN...>...<#nested var1, var2, ..., varN>...<#return>... </#macro>

2.1. name: 宏變量的名稱, 它不是表達式。它可以被寫成字符串的形式, 如果宏名稱中包含保留字符時, 這是很有用的。

2.2. param1, param2, ... paramN: 局部變量的名稱, 存儲參數的值(不是表達式)。局部變量可以跟等號, 在等號后面添加默認值。默認值也可以是另外一個參數, 比如: <#macro section title label=title>。

2.3. paramN, 最后一個參數, 可能會有三個點(...), 這就意味著宏接受可變數量的參數, 不匹配其它參數的參數可以作為最后一個參數(也被稱作籠統參數)。當宏被命名參數調用, paramN將會是包含宏的所有未聲明的鍵/值對的哈希表。當宏被位置參數調用, paramN將是額外參數的序列。

2.4. var1, var2, ..., varN是nested指令為嵌套內容創建的參數。這些都是表達式。

2.5. return和nested指令是可選的, 而且可以在<#macro ...>和</#macro>之間被用在任意位置和任意次數。

2.6. 沒有默認值的參數必須在有默認值參數(paramName=defaultValue)之前。

3. 宏變量存儲模板片段(稱為宏定義體)可以被用作自定義指令。這個變量也存儲自定義指令的被允許的參數名。當你將這個變量作為指令時, 你必須給所有參數賦值, 除了有默認值的參數。默認值當且僅當你調用宏而不給參數賦值時起作用。

4. 變量會在模板開始時被創建; 而不管macro指令放置在模板的什么位置。因此, 這樣也可以:

<@test/><#macro test>Test text </#macro>

5. 有參數的宏

<#macro paramTest foo bar baaz>ParamTest paramTest, and the params: ${foo}, ${bar}, ${baaz} </#macro> <@paramTest foo="a" bar="b" baaz=5*5-2/>

6. 有參數和默認值參數的宏

<#macro paramDefaultValueTest foo bar="Bar" baaz=-1>ParamDefaultValueTest paramDefaultValueTest, and the params: ${foo}, ${bar}, ${baaz} </#macro> <@paramDefaultValueTest foo="a" bar="b" baaz=5*5-2/><br /> <@paramDefaultValueTest foo="a" bar="b"/><br /> <@paramDefaultValueTest foo="a" baaz=5*5-2/><br /> <@paramDefaultValueTest foo="a"/>

7. 可變參數和命名參數的宏

<#macro img src extra...><img src="${src?html}" <#list extra?keys as attr>${attr}="${extra[attr]?html}"</#list>> </#macro> <@img src="images/01.png" width=113 height=113 alt="01.png"/>

8. 可變參數的宏, 不管是否使用命名

<#macro m a b ext...>a = ${a}<br />b = ${b}<br /><#if ext?is_sequence><#list ext as e>${e?index} = ${e}<br /></#list><#else><#list ext?keys as k>${k} = ${ext[k]}<br /></#list></#if> </#macro> <@m 1 2 3 4 5 /><br /> <@m a=1 b=2 c=3 d=4 e=5 data\-foo=6 myns\:bar=7 />

9. nested

9.1. nested指令執行宏定義體開始和結束標簽中間的模板片段。嵌套的片段可以包含模板中任意合法的內容: 插值, 指令等... 它在上下文環境中被執行, 也就是宏被調用的地方, 而不是宏定義體的上下文中。如果你沒有調用nested指令, 宏定義體開始和結束標記中的部分將會被忽略。

9.2. 嵌套內容沒有參數

<#macro do_twice><#nested><br /><#nested> </#macro> <@do_twice>something</@do_twice>

9.3. 嵌套內容使用參數

<#macro repeat count><#list 1..count as x><#nested x, x/2, x==count><br /></#list> </#macro> <@repeat count=4 ; c, halfc, last>${c}. ${halfc}<#if last> Last!</#if><br /> </@repeat>

10. return

10.1. 使用return指令, 你可以在任意位置終止一個宏或函數執行。

<#macro testReturn>TestReturn testReturn<#return>Will not be printed. </#macro> <@testReturn/>

四. t, lt, rt指令

1. <#t /><#lt /><#rt />忽略標記中行的特定的空白。

2. t(整體削減): 忽略本行中首和尾的所有空白。

3. lt(左側削減): 忽略本行中首部所有的空白。

4. rt(右側削減): 忽略本行中尾部所有的空白。

5. "首部空白"表示: 在第一個非空白字符之前, 本行所有空格和制表符。

6. "尾部空白"表示: 在最后一個非空白字符之后, 本行所有的空格和制表符, 還有行末尾的換行符。

7. 這些指令在行內的放置不重要。也就是說, 不管你是將它們放在行的開頭, 或是行的末尾, 或是在行的中間, 效果都是一樣的。

8. 理解這些檢查模板本身的指令是很重要的, 也就是說, 空白的移除發生在解析階段。

五. ftl指令

1. 語法

<#ftl param1=value1 param2=value2 ... paramN=valueN />

1.1. param1, param2等: 參數的名字, 不是表達式。允許的參數有: encoding, strip_whitespace, strip_text等。

1.2. ?value1, value2等: 參數的值。必須是一個常量表達式(如: true或"ISO-8859-5"或{x:1, y:2})。它不能用變量。

2. 告訴FreeMarker和其他工具關于模板的信息, 而且幫助程序員來自動檢測一個文本文件是否是FTL文件。該指令, 如果存在, 必須是模板的第一句代碼。該指令前的任何空白將被忽略。

3. ftl設置有最高的優先級, 也就是說, 它們直接作用于模板而不管其他任何FreeMarker的配置設置。

4. encoding參數: 使用它, 你可以在模板文件本身中為模板指定編碼方式(字符集)。

5. strip_whitespace參數: 這將開啟/關閉空白剝離。合法的值是布爾值常量true和false(為了向下兼容, 字符串"yes", "no", "true", "false"也是可以的)。默認值(也就是當你不使用這個參數時)是依賴于程序員對FreeMarker的配置, ?但是對新的項目還應該是true。

6. strip_text參數: 當開啟它時, 當模板被解析時模板中所有頂級文本被移除。這個不會影響宏, 指令或插值中的文本。合法值是布爾值常量true和false(為了向下兼容, 字符串"yes", "no", "true", "false"也是可以的)。默認值(也就是當你不使用這個參數時)是false。

7. strict_syntax參數: 這會開啟/關閉"嚴格的語法"。合法值是布爾值常量true和false(為了向下兼容, 字符串"yes", "no", "true", "false"也是可以的)。默認值(也就是當你不使用這個參數時)是依賴于程序員對FreeMarker的配置, 但是對新的項目還應該是true。

8. ns_prefixes參數: 這是關聯結點命名空間前綴的哈希表。這通常是用于XML處理的。

9. attributes參數: 這是關聯模板任意屬性(名-值對)的哈希表。屬性的值可以是任意類型(字符串, 數字, 序列等)。FreeMarker不會嘗試去理解屬性的含義。它是由封裝FreeMarker(比如Web應用框架)的應用程序決定的。因此, 允許的屬性的設置是它們依賴的應用(Web應用框架)的語義。程序員: 你可以通過關聯Template對象的getCustomAttributeNames和getCustomAttribute方法(從freemarker.core.Configurable繼承而來)獲得屬性。如當模板被解析時, 關聯Template對象的模板屬性, 屬性可以在任意時間被讀取, 而模板不需要被執行。上面提到的方法返回未包裝的屬性值, 也就是說, 使用FreeMarker獨立的類型, 如java.util.List。

. compress指令

1. 語法

<#compress> ... </#compress>

2. 當你使用了對空白不敏感的格式時壓縮指令對于移除多余的空白是很有用的。它捕捉在指令體(也就是在開始標簽和結束標簽中)中生成的內容, 然后縮小所有不間斷的空白序列到一個單獨的空白字符。如果被替代的序列包含換行符或是一段空間, 那么被插入的字符也會是一個換行符。開頭和結尾的不間斷的空白序列將會完全被移除。

六. global指令

1. 語法

<#global name1=value1 name2=value2 ... nameN=valueN>或 <#global name>capture this </#global>

1.1. name: 變量的名稱。它不是表達式。但它可以被寫作是字符串形式, 如果變量名包含保留字符這是很有用的, 比如: <#global "foo-bar" = 1 />。

1.2. value: 存儲的值, 是表達式。

2. 該指令和assign相似, 但是被創建的變量在所有的命名空間中都可見, 但又不會存在于任何一個命名空間之中。因此, 這個變量是全局的。

3. 如果在數據模型中, 一個相同名稱的變量存在的話, 它會被使用該指令創建的變量隱藏(數據模型中的數據隱藏)。

4. 如果在當前的命名空間中, 一個相同名稱的變量存在的話, 那么會隱藏由global指令創建的變量。

5. 如果全局變量被當前命名空間中一個相同名稱的變量隱藏, 你可以使用 特殊變量globals, 比如: ${.globals.x}。

七. local指令

1. 語法

<#local name1=value1 name2=value2 ... nameN=valueN> 或 <#local name>capture this </#local>

1.1. name: 局部變量的名稱。它不是一個表達式。但它可以被寫作是字符串形式, 如果變量名包含保留字符, 這是很有用的, 比如: <#local "foo-bar" = 1 />。

1.2. value: 存儲的值, 是表達式。

2. 它和assign指令類似, 但是它創建或替換局部變量。這僅僅在宏和方法的內部定義才會有作用。

八. function, return指令

1. 語法

<#function name param1 param2 ... paramN>...<#return returnValue>... </#function> 或 <#function name param1 param2 paramN...>...<#return returnValue>... </#function>

1.1. name: 方法變量的名稱(不是表達式)

1.2. param1 param2 ... paramN: 局部變量的名稱, 存儲參數的值(不是表達式), 在=號后面和默認值(是表達式)是可選的。

1.3. paramN...: 最后一個參數, 可以可選的包含一個尾部省略(...), 這就意味著方法接受可變的參數數量。局部變量paramN將是額外參數的序列。

1.4. returnValue: 計算方法調用值的表達式。

1.5. return指令可以在<#function ...>和</#function>之間被用在任意位置和任意次數。

1.6. 沒有默認值的參數必須在有默認值參數(paramName=defaultValue)之前。

2. 創建一個方法變量(在當前命名空間中, 如果你知道命名空間的特性)。這個指令和macro指令的工作方式一樣, 除了return指令必須有一個參數來指定方法的返回值, 而且視圖寫入輸出的將會被忽略。

. 例子

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

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;}}

3. 編寫Directive.java

package com.fm.action;import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; 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.util.FMFactory; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException;public class Directive 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");Template template = cfg.getTemplate("directive.html");Map<String, Object> root = new HashMap<String, Object>();root.put("name", "張三");Writer out = new OutputStreamWriter(resp.getOutputStream());try {template.process(root, out);cfg.getTemplate("ws.ftl").process(root, new OutputStreamWriter(System.out));} catch (TemplateException e) {e.printStackTrace();}}@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doGet(req, resp);} }

4. 修改web.xml

5. 在/WEB-INF/templates目錄下編寫directive.html

<!DOCTYPE html> <html><head><meta charset="UTF-8" /><title>指令</title></head><body><h2>assign指令</h2><#import "/lib/copyright.html" as cr><#assign dateStart = "2000" in cr>${cr.dateStart}<br /><br /><#assign names><#list ["張三", "李四", "王五"] as name>${name}<br /></#list></#assign>${names}<h2>import指令</h2><#import "/lib/copyright.html" as cpyrgt><#import "/lib/copyright.html" as copyright>${cr.dateEnd}, ${cpyrgt.dateEnd}, ${copyright.dateEnd}<br /><#assign dateEnd="2080" in cr>${cr.dateEnd}, ${cpyrgt.dateEnd}, ${copyright.dateEnd}<h2>macro, nested, return指令</h2><h4>沒有參數的宏:</h4><@test/><#macro test>Test text</#macro><h4>有參數的宏:</h4><#macro paramTest foo bar baaz>ParamTest paramTest, and the params: ${foo}, ${bar}, ${baaz}</#macro><@paramTest foo="a" bar="b" baaz=5*5-2/><h4>有參數和默認值參數的宏:</h4><#macro paramDefaultValueTest foo bar="Bar" baaz=-1>ParamDefaultValueTest paramDefaultValueTest, and the params: ${foo}, ${bar}, ${baaz}</#macro><@paramDefaultValueTest foo="a" bar="b" baaz=5*5-2/><br /><@paramDefaultValueTest foo="a" bar="b"/><br /><@paramDefaultValueTest foo="a" baaz=5*5-2/><br /><@paramDefaultValueTest foo="a"/><h4>可變參數和命名參數的宏:</h4><#macro img src extra...><img src="${src?html}" <#list extra?keys as attr>${attr}="${extra[attr]?html}"</#list>></#macro><@img src="images/01.png" width=113 height=113 alt="01.png"/><h4>可變參數的宏, 不管是否使用命名:</h4><#macro m a b ext...>a = ${a}<br />b = ${b}<br /><#if ext?is_sequence><#list ext as e>${e?index} = ${e}<br /></#list><#else><#list ext?keys as k>${k} = ${ext[k]}<br /></#list></#if></#macro><@m 1 2 3 4 5 /><br /><@m a=1 b=2 c=3 d=4 e=5 data\-foo=6 myns\:bar=7 /><h4>嵌套內容沒有參數:</h4><#macro do_twice><#nested><br /><#nested></#macro><@do_twice>something</@do_twice><h4>嵌套內容使用參數:</h4><#macro repeat count><#list 1..count as x><#nested x, x/2, x==count><br /></#list></#macro><@repeat count=4 ; c, halfc, last>${c}. ${halfc}<#if last> Last!</#if></@repeat><h2>return指令</h2><#macro testReturn>TestReturn testReturn<#return>Will not be printed.</#macro><@testReturn/></body> </html>

6. 在/WEB-INF/templates/lib目錄下編寫copyright.html

<#assign dateEnd = "2050" />

7. 在/WEB-INF/templates目錄下編寫ws.ftl

<#ftl encoding="utf-8" strip_whitespace=true strip_text=false /> 默認輸出: [ t(整體削減): 忽略本行中首和尾的所有空白。 ][ lt(左側削減): 忽略本行中首部所有的空白。 ] [ rt(右側削減): 忽略本行中尾部所有的空白。 ] t, lt, rt指令: [ t(整體削減): 忽略本行中首和尾的所有空白。<#t /> ][ lt(左側削減): 忽略本行中首部所有的空白。<#lt /> ] [ rt(右側削減): 忽略本行中尾部所有的空白。<#rt /> ]默認輸出: [ 我我 我我我我的心好痛。 ] compress指令: [<#compress> 我我 我我我我的心好痛。 </#compress>]全局變量: <#assign name="王五" /> <#global name="李四" /> ${name} ${.globals.name}<#global saveCode> 全局變量儲存中間的代碼片段。 </#global> ${saveCode}方法指令: <#function avg x y><#local z = 20 /><#return (x + y + z) / 2 /> </#function> ${avg(10, 20)}

8. 運行項目, 瀏覽器輸出

9. 運行項目, 控制臺輸出

?

總結

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

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