Freemarker常用操作練習

	<body class="easyui-layout">

		<div data-options="region:'center'">
			<br />
			<hr />

				<@button id="tt" url="/demo/save" text="測試" icon="save" formid="ff"
				οnclick="test" oncomplete="alert('11');" /> <@select id="ss"
				style="width:80px;" value="${selectValue}" lableName="label"
				onSelect="alert(select.value);"> </@select> <#assign
				x=2.582/><#assign y=4/> #{x;M2} #{y;M2} #{x;m2} #{y;m2} #{x;m1M2}
				#{y;m1M2} ${'直接指定值'}<#--r標記直接輸出文本--> ${r"${foo}"}
				<br />
				<#--2,數值
				表達式中的數值直接輸出,不需要引號.小數點使用"."分隔,不能使用分組","符號.FreeMarker目前還不支持科學計數法,所以"1E3"是錯誤的.在FreeMarker表達式中使用數值需要注意以下幾點:1,數值不能省略小數點前面的0,所以".5"是錯誤的寫法;2,數值8
				, +8 , 8.00都是相同的;3,布爾值直接使用true和false,不使用引號.--> ${8} ${+8}
				${8.00}---- <#--集合使用--> <#list ["星期一","星期二","星期三"]as
				x>${x}</#list>****<#list [2+2,[1,2,3,4],"what"] as
				y></#list>****<#list 2..5 as z>${z}</#list>
				<br />
				<#--Map對象使用花括號包括,Map中的key-value對之間以英文冒號":"分隔,多組key-value對之間以英文逗號","分隔.-->
				{"語文":80,"數學":70}
				<#--FreeMarker的表達式輸出變量時,這些變量可以是頂層變量,也可以是Map對象中的變量,還可以是集合中的變量,並可以使用點(.)語法來訪問Java對象的屬性.-->
				<#-- 字符串連接有兩種語法:1,使用${..}或#{..}在字符串常量部分插入表達式的值,從而完成字符串連接.
				2,直接使用連接運算符+來連接字符串 3,${..}只能用於文本部分,不能用於表達式, --> ${"hello,
				${selectValue}!"} -- ${"hello, " + selectValue + "!"}

				${selectValue[0]}${selectValue[4]}--${selectValue[0..4]}

				<#--集合運算符是將兩個集合連接成一個新的集合,連接集合的運算符是+--> <#list
				['a','b','c']+['d','e'] as x>${x}</#list>
				<#--Map對象的連接運算符也是將兩個Map對象連接成一個新的Map對象,Map對象的連接運算符是+,如果兩個Map對象具有相同的key,則右邊的值替代左邊的值.-->
				<#assign scores={'a':90,'b':80}+{'c':70,'b':60}/>
				a=${scores.a},b=${scores.b},c=${scores.c} <#--
				FreeMarker表達式中完全支持算術運算,FreeMarker支持的算術運算符包括:+, - , * , / , %
				1,運算符兩邊的運算數字必須是數字 2,使用+運算符時,如果一邊是數字,一邊是字符串,就會自動將數字轉換爲字符串再連接,如:${3 +
				"5"},結果是:35 3,${ x /2 }=2.5 --> <#assign x=5/>
				${x/2},${x/2?int},${(x/2)?int},${-1.999?int} <#-- 比較運算符
				表達式中支持的比較運算符有如下幾個: 1,=或者==:判斷兩個值是否相等. 2,!=:判斷兩個值是否不等.
				3,>或者gt:判斷左邊值是否大於右邊值 4,>=或者gte:判斷左邊值是否大於等於右邊值 5,
				<或者lt:判斷左邊值是否小於右邊值6,<=或者lte:判斷左邊值是否小於等於右邊值
				注意:=和!=可以用於字符串,數值和日期來比較是否相等,但=和!=兩邊必須是相同類型的值,否則會產生錯誤,
				而且FreeMarker是精確比較,"x","x ","X"是不等的.其它的運行符可以作用於數字和日期,但不能作用於字符
				串,大部分的時候,使用gt等字母運算符代替>會有更好的效果,因爲FreeMarker會把>解釋成FTL標籤的結束字符,
				當然,也可以使用括號來避免這種情況,如:<#if (x>y)>
			-->
			<#assign x="a",y="b",c="a"/>
			--TEST:${(x=y)?string('yes','no')}${(x=c)?string('yes','no')}
			<#--邏輯運算符有如下幾個:
				邏輯與:&&
				邏輯或:||
				邏輯非:!
				邏輯運算符只能作用於布爾值,否則將產生錯誤-->
			<#--
				 內建函數
				FreeMarker還提供了一些內建函數來轉換輸出,可以在任何變量後緊跟?,?後緊跟內建函數,就可以通過內建函數來輪換輸出變量.下面是常用的內建的字符串函數:
				html:對字符串進行HTML編碼
				cap_first:使字符串第一個字母大寫
				lower_case:將字符串轉換成小寫
				upper_case:將字符串轉換成大寫
				trim:去掉字符串前後的空白字符
				下面是集合的常用內建函數
				size:獲取序列中元素的個數
				下面是數字值的常用內建函數
				int:取得數字的整數部分,結果帶符號
			-->	
			<#assign test='Tom&Jerry'/>
			${test?html}   ${test?upper_case?html}	
			
			<#--
				空值處理運算符
FreeMarker對空值的處理非常嚴格,FreeMarker的變量必須有值,沒有被賦值的變量就會拋出異常,因爲FreeMarker未賦值的變量強制出錯可以杜絕很多潛在的錯誤,如缺失潛在的變量命名,或者其他變量錯誤.這裏所說的空值,實際上也包括那些並不存在的變量,對於一個Java的null值而言,我們認爲這個變量是存在的,只是它的值爲null,但對於FreeMarker模板而言,它無法理解null值,null值和不存在的變量完全相同.
爲了處理缺失變量,FreeMarker提供了兩個運算符:
!:指定缺失變量的默認值
??:判斷某個變量是否存在
其中,!運算符的用法有如下兩種:
variable!或variable!defaultValue,第一種用法不給缺失的變量指定默認值,表明默認值是空字符串,長度爲0的集合,或者長度爲0的Map對象.
使用!指定默認值時,並不要求默認值的類型和變量類型相同.使用??運算符非常簡單,它總是返回一個布爾值,用法爲:variable??,如果該變量存在,返回true,否則返回false
			-->
			
			<#--
				運算符的優先級

FreeMarker中的運算符優先級如下(由高到低排列):
1,一元運算符:!
2,內建函數:?
3,乘除法:*, / , %
4,加減法:- , +
5,比較:> , < , >= , <= (lt , lte , gt , gte)
6,相等:== , = , !=
7,邏輯與:&&
8,邏輯或:||
9,數字範圍:..

實際上,我們在開發過程中應該使用括號來嚴格區分,這樣的可讀性好,出錯少
			-->
			
			<#--
		FreeMarker的常用指令
			-->	
			<#--if-->
			<#assign age=90/>
			<#if (age>60)>OID MAN;
			<#elseif (age>40)>STRONG MAN;
			<#else>YOUNGER MAN;
			</#if>
			<br>
			<#--switch , case , default , break指令-->
			<#assign value=50/>
			<#switch value>
			<#case 40>--is 40--<#break>
			<#case 50>--is 50--<#break>
			<#default>--is default--
			</#switch>
			<#--list, break指令

list指令是一個迭代輸出指令,用於迭代輸出數據模型中的集合,list指令的語法格式如下:
<#list sequence as item>
...
</#list>
上面的語法格式中,sequence就是一個集合對象,也可以是一個表達式,但該表達式將返回一個集合對象,而item是一個任意的名字,
就是被迭代輸出的集合元素.此外,迭代集合對象時,還包含兩個特殊的循環變量:
item_index:當前變量的索引值
item_has_next:是否存在下一個對象
也可以使用<#break>指令跳出迭代
			-->
			<#list ['a','b','c','d','e'] as x>
			${x_index+1}.${x}<#if x_has_next>--x_has_next--</#if>
			<#if x='d'><#break></#if>
			</#list>

			<#--
				include指令
include指令的作用類似於JSP的包含指令,用於包含指定頁.include指令的語法格式如下:
<#include filename [options]>
在上面的語法格式中,兩個參數的解釋如下:
filename:該參數指定被包含的模板文件
options:該參數可以省略,指定包含時的選項,包含encoding和parse兩個選項,其中encoding指定包含頁面時所用的解碼集,
而parse指定被包含文件是否作爲FTL文件來解析,如果省略了parse選項值,則該選項默認是true.
			-->
			<#--
				 import指令
該指令用於導入FreeMarker模板中的所有變量,並將該變量放置在指定的Map對象中,import指令的語法格式如下:
<#import "/lib/common.ftl" as com>
上面的代碼將導入/lib/common.ftl模板文件中的所有變量,並將這些變量放置在一個名爲com的Map對象中.
			-->
			
			<#--
				noparse指令
noparse指令指定FreeMarker不處理該指定裏包含的內容,該指令的語法格式如下:
<#noparse>...</#noparse>
			-->
			<#noparse>
				<#list	books as book>
					${book.name}
				</#list>
			</#noparse>
			
			<#--
			escape , noescape指令

			escape指令導致body區的插值都會被自動加上escape表達式,但不會影響字符串內的插值,只會影響到body內出現的插值,使用escape指令的語法格式如下:
			<#escape identifier as expression>...
			<#noescape>...</#noescape>
		</#escape>

			看如下的代碼:
			<#escape x as x?html>
			First name:${firstName}
			Last name:${lastName}
			Maiden name:${maidenName}
			</#escape>
			上面的代碼等同於:
			First name:${firstName?html}
			Last name:${lastName?html}
			Maiden name:${maidenName?html}

			escape指令在解析模板時起作用而不是在運行時起作用,除此之外,escape指令也嵌套使用,子escape繼承父escape的規則,如下例子:
			<#escape x as x?html>
			Customer Name:${customerName}
			Items to ship;
			<#escape x as itemCodeToNameMap[x]>
   			${itemCode1}
   			${itemCode2}
   			${itemCode3}
   			${itemCode4}
			</#escape>
			</#escape>
			上面的代碼類似於:
			Customer Name:${customerName?html}
			Items to ship;
			${itemCodeToNameMap[itemCode1]?html}
			${itemCodeToNameMap[itemCode2]?html}
			${itemCodeToNameMap[itemCode3]?html}
			${itemCodeToNameMap[itemCode4]?html}

			對於放在escape指令中所有的插值而言,這此插值將被自動加上escape表達式,如果需要指定escape指令中某些插值無需添加escape表達式,則應該使用noescape指令,放在noescape指令中的插值將不會添加escape表達式.
			-->
			
			<#--assign指令

assign指令在前面已經使用了多次,它用於爲該模板頁面創建或替換一個頂層變量,assign指令的用法有多種,包含創建或替換一個頂層變量,或者創建或替換多個變量等,它的最簡單的語法如下:<#assign name=value [in namespacehash]>,這個用法用於指定一個名爲name的變量,該變量的值爲value,此外,FreeMarker允許在使用assign指令裏增加in子句,in子句用於將創建的name變量放入namespacehash命名空間中.

assign指令還有如下用法:<#assign name1=value1 name2=value2 ... nameN=valueN [in namespacehash]>,這個語法可以同時創建或替換多個頂層變量,此外,還有一種複雜的用法,如果需要創建或替換的變量值是一個複雜的表達式,則可以使用如下語法格式:<#assign name [in namespacehash]>capture this</#assign>,在這個語法中,是指將assign指令的內容賦值給name變量.如下例子:
<#assign x>
<#list ["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期天"] as n>
${n}
</#list>
</#assign>
${x}
上面的代碼將產生如下輸出:星期一 星期二 星期三 星期四 星期五 星期六 星期天

雖然assign指定了這種複雜變量值的用法,但是我們也不要濫用這種用法,如下例子:<#assign x>Hello ${user}!</#assign>,以上代碼改爲如下寫法更合適:<#assign x="Hello ${user}!">
			-->
			
			<#--setting指令

該指令用於設置FreeMarker的運行環境,該指令的語法格式如下:<#setting name=value>,在這個格式中,name的取值範圍包含如下幾個:
locale:該選項指定該模板所用的國家/語言選項
number_format:指定格式化輸出數字的格式
boolean_format:指定兩個布爾值的語法格式,默認值是true,false
date_format,time_format,datetime_format:指定格式化輸出日期的格式
time_zone:設置格式化輸出日期時所使用的時區
			-->
			
			<#--
				*********************************************
				macro , nested , return指令

macro可以用於實現自定義指令,通過使用自定義指令,可以將一段模板片段定義成一個用戶指令,使用macro指令的語法格式如下:
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
在上面的格式片段中,包含了如下幾個部分:
name:name屬性指定的是該自定義指令的名字,使用自定義指令時可以傳入多個參數
paramX:該屬性就是指定使用自定義指令時報參數,使用該自定義指令時,必須爲這些參數傳入值
nested指令:nested標籤輸出使用自定義指令時的中間部分
nested指令中的循環變量:這此循環變量將由macro定義部分指定,傳給使用標籤的模板
return指令:該指令可用於隨時結束該自定義指令.

看如下的例子:
<#macro book>   //定義一個自定義指令
j2ee
</#macro>
<@book />    //使用剛纔定義的指令
上面的代碼輸出結果爲:j2ee

在上面的代碼中,可能很難看出自定義標籤的用處,因爲我們定義的book指令所包含的內容非常簡單,實際上,自定義標籤可包含非常多的內容,從而可以實現更好的代碼複用.此外,還可以在定義自定義指令時,爲自定義指令指定參數,看如下代碼:
<#macro book booklist>     //定義一個自定義指令booklist是參數
<#list booklist as book>
   ${book}
</#list>
</#macro>
<@book booklist=["spring","j2ee"] />   //使用剛剛定義的指令
上面的代碼爲book指令傳入了一個參數值,上面的代碼的輸出結果爲:spring j2ee

不僅如此,還可以在自定義指令時使用nested指令來輸出自定義指令的中間部分,看如下例子:
<#macro page title>
<html>
<head>
   <title>FreeMarker示例頁面 - ${title?html}</title>
</head>
<body>
   <h1>${title?html}</h1>
   <#nested>      //用於引入用戶自定義指令的標籤體
</body>
</html>
</#macro>
上面的代碼將一個HTML頁面模板定義成一個page指令,則可以在其他頁面中如此page指令:
<#import "/common.ftl" as com>     //假設上面的模板頁面名爲common.ftl,導入頁面
<@com.page title="book list">
<u1>
<li>spring</li>
<li>j2ee</li>
</ul>
</@com.page >

從上面的例子可以看出,使用macro和nested指令可以非常容易地實現頁面裝飾效果,此外,還可以在使用nested指令時,指定一個或多個循環變量,看如下代碼:
<#macro book>
<#nested 1>      //使用book指令時指定了一個循環變量值
<#nested 2>
</#macro>
<@book ;x> ${x} .圖書</@book >
當使用nested指令傳入變量值時,在使用該自定義指令時,就需要使用一個佔位符(如book指令後的;x).上面的代碼輸出文本如下:
1 .圖書    2 .圖書

在nested指令中使用循環變量時,可以使用多個循環變量,看如下代碼:
<#macro repeat count>
<#list 1..count as x>     //使用nested指令時指定了三個循環變量
   <#nested x, x/2, x==count>
</#list>
</#macro>
<@repeat count=4 ; c halfc last>
${c}. ${halfc}<#if last> Last! </#if>
</@repeat >
上面的輸出結果爲:
1. 0.5   2. 1   3. 1.5   4. 2 Last;

return指令用於結束macro指令,一旦在macro指令中執行了return指令,則FreeMarker不會繼續處理macro指令裏的內容,看如下代碼:
<#macro book>
spring
<#return>
j2ee
</#macro>
<@book />
上面的代碼輸出:spring,而j2ee位於return指令之後,不會輸出.
			-->
			
			<#--
				<#compress>
  				...
				</#compress>
				用來壓縮空白空間和空白的行
			-->
			
			<#compress>
  				1 2  3   4    5
  				test only

  				I said, test only
			</#compress>
			<br>
			<#--
				
			-->
			<#assign x>
  				<#list 1..3 as n>
    				${n}
  				</#list>
			</#assign>
			Number of words: ${x?word_list?size}
			${x}
			
			<#--給my namespage 賦予一個變量bgColor,下面可以通過my.bgColor來訪問這個變量
			<#import "/mylib.ftl" as my>
			<#assign bgColor="red" in my>-->
<#--
global
語法
<#global name=value>
or
<#global name1=value1 name2=value2 ... nameN=valueN>
or
<#global name>
  capture this
</#global>

全局賦值語法,利用這個語法給變量賦值,那麼這個變量在所有的namespace中是可見的,如果這個變量被當前的assign語法覆蓋
 如<#global x=2> <#assign x=1> 在當前頁面裏x=2將被隱藏,或者通過${.global.x}來訪問
-->			
	
<#--
t, lt, rt
語法
<#t> 去掉左右空白和回車換行

<#lt>去掉左邊空白和回車換行

<#rt>去掉右邊空白和回車換行

<#nt>取消上面的效果
-->		

<#--
給變量默認值
${var?default(“hello world<br>”)?html}如果var is null那麼將會被hello world<br>替代

判斷對象是不是null
    <#if mouse?exists>
      Mouse found
<#else>
也可以直接${mouse?if_exists})輸出布爾形

直接調用java對象的方法
${object.methed(args)}  

html安全輸出
"abc<table>sdfsf"?html ---但是輸出結果跟原值沒區別,why

類似String.split的用法
 “abc;def;ghi”?split(“;”)返回sequence
將字符串按空格轉化成sequence,然後取sequence的長度
     var?word_list  效果同 var?split(“ ”)
 var?word_list?size

取得字符串長度
var?length

大寫輸出字符
var?upper_case

小寫輸出字符
var?lower_case

首字符大寫
var?cap_first

首字符小寫
var?uncap_first

去掉字符串前後空格
var?trim

每個單詞的首字符大寫
var?capitalize

類似String.indexof:
 “babcdabcd”?index_of(“abc”) 返回1
 “babcdabcd”?index_of(“abc”,2) 返回5
類似String.lastIndexOf
 last_index_of和String.lastIndexOf類似,同上
-->
${"abc<table>sdfsf"?html}<br>
<#list "abc;def;ghi"?split(";") as o>
${o}
</#list>

<#--
${s?replace(‘ba’, ‘XY’ , ‘規則參數’)}將s裏的所有的ba替換成xy 規則參數包含: i r m s c f 具體含義如下:
· i: 大小寫不區分.
· f: 只替換第一個出現被替換字符串的字符串
· r:  XY是正則表達式
· m: Multi-line mode for regular expressions. In multi-line mode the expressions ^ and $ match just after or just before, respectively, a line terminator or the end of the string. By default these expressions only match at the beginning and the end of the entire string.
· s: Enables dotall mode for regular expressions (same as Perl singe-line mode). In dotall mode, the expression . matches any character, including a line terminator. By default this expression does not match line terminators.
· c: Permits whitespace and comments in regular expressions.


freemarker在web開發中注意事項
freemarker與webwork整合
web中常用的幾個對象
Freemarker的ftl文件中直接使用內部對象:
${Request ["a"]}
${RequestParameters["a"]}
${Session ["a"]}
${Application ["a"]}
${JspTaglibs ["a"]}

與webwork整合之後 通過配置的servlet 已經把request,session等對象置入了數據模型中
在view中存在下面的對象
  我們可以在ftl中${req}來打印req對象
· req - the current HttpServletRequest
· res - the current HttpServletResponse
· stack - the current OgnlValueStack
· ognl - the OgnlTool instance
· webwork - an instance of FreemarkerWebWorkUtil
· action - the current WebWork action
· exception - optional the Exception instance, if the view is a JSP exception or Servlet exception view
view中值的搜索順序
${name}將會以下面的順序查找name值
· freemarker variables
· value stack
· request attributes
· session attributes
· servlet context attributes 
-->
	</div>
	<script type="text/javascript">

</script>

	</body>

發佈了43 篇原創文章 · 獲贊 168 · 訪問量 35萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章