FreeMarker教程_第1頁(yè)
FreeMarker教程_第2頁(yè)
FreeMarker教程_第3頁(yè)
FreeMarker教程_第4頁(yè)
FreeMarker教程_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、FreeMarker教程一、什么是模板引擎,為什么要用模板引擎在B/S程式設(shè)計(jì)中,常常有美工和程序員二個(gè)角色,他們具有不同專業(yè)技能:美工專注于表現(xiàn)創(chuàng)建頁(yè)面、風(fēng)格、布局、效果等等可視元素;而程序員則忙于創(chuàng)建程式的商業(yè)流程,生成設(shè)計(jì)頁(yè)面要顯示的數(shù)據(jù)等等。很多時(shí)候,要顯示的資料在設(shè)計(jì)的時(shí)候并不存在,它們一般是在運(yùn)行時(shí)由程式產(chǎn)生的,比如執(zhí)行“價(jià)格不高于800NT的USB Disk”查詢的返回結(jié)果。這種技術(shù)需求產(chǎn)生了JSP等Scriptlet,JSP十分強(qiáng)大,但是也常常被濫用,并導(dǎo)致一些不良的后果1. 將邏輯和表現(xiàn)混合在一起。2. 破壞了美工和程序員職責(zé)的正常分解。3. 使JSP頁(yè)面難以閱讀和維護(hù)。模板

2、引擎就是為了解決上面的問(wèn)題而產(chǎn)生的。在設(shè)計(jì)HTML的時(shí)候,我們加入一些特定指令來(lái)指定要插入哪些數(shù)據(jù),這些加了特殊指令的HTML或者其他文本,我們稱為模板(Template)。而模板引擎會(huì)在輸出頁(yè)面時(shí),用適當(dāng)?shù)臄?shù)據(jù)替代這些代碼。模板和嵌入JSP的HTML是不同的,模板指令只有很有限的編程能力,可以避免混入商業(yè)邏輯。二、FreeMarker與JSP、Velocity的對(duì)比 FreeMarker優(yōu)點(diǎn):     1.      不能編寫Java代碼,可以實(shí)現(xiàn)嚴(yán)格的MVC分離2.  &

3、#160; 美工和技術(shù)的工作分離3.      頁(yè)面是靜態(tài)化的,這樣方便搜索引擎的收錄4.      模板可以存在數(shù)據(jù)庫(kù),可以實(shí)現(xiàn)cms定制功能5.      性能不錯(cuò),頁(yè)面顯示的速度非???,省去了JSP編譯的過(guò)程6.      內(nèi)置許多功能強(qiáng)大的標(biāo)記、以及大量常用的函數(shù)7.      帶有宏定義(

4、macro)功能,類似于JSP自定義標(biāo)簽,但是更加簡(jiǎn)單方便8.      支持JSP標(biāo)簽9.      Struts2對(duì)其支持效果不錯(cuò)10.  不一定非要在Servlet中去實(shí)現(xiàn)                                   &

5、#160;  FreeMarker缺點(diǎn):1.      性能沒(méi)有Velocity高,學(xué)習(xí)起來(lái)沒(méi)有Velocity簡(jiǎn)單2.      需要花費(fèi)時(shí)間重新學(xué)習(xí)3.      FreeMarker中不能讀取值為null的變量,會(huì)報(bào)錯(cuò),必須要設(shè)置默認(rèn)值或者判斷4.      模板修改之后,如果沒(méi)有更新模板生成的HTML,會(huì)看到過(guò)期的頁(yè)面5.   &

6、#160;  MyEclipseIDE插件的效果不太好三、一個(gè)簡(jiǎn)單的FreeMarkerDemo1.導(dǎo)入Jar包:     FreeMarker需要freemarker-2.3.19.jar包,Struts2里面有這個(gè)Jar包。2.編寫模板文件         FreeMarker的模板文件的后綴名是ftl。這里是我寫的一個(gè)Example.ftl,我把它放在WebRoot下的Template文件夾下。html view plaincopy1. &

7、lt;html>               2.     <head>  3.         <title>Example</title>  4.     </head>  

8、; 5.     <body >  6.         <h1>大家好,我的名字叫$name,我家住在$address,我今年$age歲了!</h1>  7.     </body>  8. </html>  3.模板的解析模板需要被解析之后才能生成最終的文件,F(xiàn)reeMark

9、er的數(shù)據(jù)模型也是在模板中配置的。ExampleResolution.javajava view plaincopy1. publicclass ExampleResolution   2.     publicvoid resolution()  3.         Writer out = null;  4.   

10、0;     /* 5.          *創(chuàng)建Configuration對(duì)象 6.          *設(shè)置模板文件的基路徑 7.          *設(shè)置讀取模板的編碼方式 8.     

11、60;    */  9.         Configuration cfg = new Configuration();  10.     cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(),"TemplateFiles");

12、  11.         cfg.setDefaultEncoding("UTF-8");  12.         /* 13.          *創(chuàng)建FreeMarker的數(shù)據(jù)模型 14.       

13、   */  15.         Map root = newHashMap();  16.         root.put("name","李鑫龍");  17.         root.p

14、ut("address","合肥市望江西路666號(hào)");  18.         root.put("age", 23);  19.         /* 20.          *設(shè)置生成的模板的位置 21. &#

15、160;        *合并數(shù)據(jù)模型與模板 22.          *生成最終的html頁(yè)面 23.          */  24.         try     

16、;   25.             Template template = cfg.getTemplate("Example.ftl");  26.             String path = ServletActio

17、nContext.getServletContext().getRealPath("/");  27.             File file = new File(path +"example.html");  28.           &#

18、160; out = new BufferedWriter(new OutputStreamWriter(newFileOutputStream(file);  29.             cess(root, out);  30.          catch

19、 (IOException e)   31.             e.printStackTrace();  32.          catch (TemplateException e)   33.      &

20、#160;      e.printStackTrace();  34.         finally  35.             try   36.          &

21、#160;      out.flush();  37.                 out.close();  38.              catch (IOException 

22、e)   39.                 e.printStackTrace();  40.               41.          &#

23、160;42.       43.   4.Action配置java view plaincopy1. publicclass ServiceActionimplements Action   2.     Override  3.     public String execute()throws Exception 

24、;  4.         ExampleResolution er = new ExampleResolution();  5.         er.resolution();  6.         return Action.SUCCESS;

25、  7.       8.   5.struts.xml配置html view plaincopy1. <packagenamepackagename="default" namespace="/"extends="struts-default,json-default">  2.         <

26、action name="example"class="com.lubby.action.ServiceAction">  3.             <resulttyperesulttype="redirect">/example.html</result>  4.      

27、60;  </action>  5. </package>  6.效果顯示html view plaincopy1. </html>  2.     <head>  3.         <title>Example</title>  4.    

28、 </head>  5.     <body >  6.         <h1>大家好,我的名字叫李鑫龍,我家住在合肥市望江西路666號(hào),我今年23歲了!</h1>  7.     </body>  8. </html>  四、FreeMarke

29、r的數(shù)據(jù)模型 數(shù)據(jù)模型是樹(shù)型結(jié)構(gòu),可以任意復(fù)雜和深層次,如下面的例子:html view plaincopy1. (root)  2.   |  3.   +- animals  4.   |   |  5.   |   +- mouse  6.   |   |

30、0; |    7.   |   |   +-size = "small"  8.   |   |  |    9.   |   |   +-price = 50  10. 

31、60; |   |  11.   |   +- elephant  12.   |   |  |    13.   |   |   +-size = "large"  14.   |

32、0;  |  |    15.   |   |   +-price = 5000  16.   |   |  17.   |   +- python  18.   |     &#

33、160; |    19.   |       +- size = "medium"  20.   |       |    21.   |       +- 

34、price = 4999  22.   |  23.   +- test ="It is a test"  24.   |  25.   +- whatnot  26.       |  27.    

35、0;  +-because = "don't know"          類似于目錄的變量稱為hashes,包含保存下級(jí)變量的唯一的查詢名字        類似于文件的變量稱為scalars,保存單值        scalars保存的值有兩種類型:字符串(用

36、引號(hào)括起,可以是單引號(hào)或雙引號(hào))和數(shù)字(不要用引號(hào)將數(shù)字括起,這會(huì)作為字符串處理)         另外一種變量是sequences,和hashes類似,只是不使用變量名字,而使用數(shù)字索引,如下面的例子:html view plaincopy1. (root)  2.   |  3.   +- animals  4.   |   |

37、60; 5.   |   +- (1st)  6.   |   |   |  7.   |   |   +-name = "mouse"  8.   |   |   |  

38、;9.   |   |   +-size = "small"  10.   |   |   |  11.   |   |   +-price = 50  12.   |   | &

39、#160;13.   |   +- (2nd)  14.   |   |   |  15.   |   |   +-name = "elephant"  16.   |   |   | &#

40、160;17.   |   |   +-size = "large"  18.   |   |   |  19.   |   |   +-price = 5000  20.   |   |&

41、#160; 21.   |   +- (3rd)  22.   |       |  23.   |       +- name = "python"  24.   |    &#

42、160;  |  25.   |       +- size = "medium"  26.   |       |  27.   |       +- price = 

43、4999  28.   |  29.   +- whatnot  30.       |  31.       +- fruits  32.           |  33.   

44、        +- (1st)= "orange"  34.           |  35.           +- (2nd)= "banana"    

45、; 這種對(duì)scalars的訪問(wèn)使用索引,如        這種對(duì)scalars的訪問(wèn)使用索引,如五、模板的常用指令   在FreeMarker模板中可以包括下面幾個(gè)特定部分:1.$:稱為interpolations,F(xiàn)reeMarker會(huì)在輸出時(shí)用實(shí)際值進(jìn)行替代。       1.1 $name可以取得root中key為name的value。 &

46、#160;     1.2 $可以取得成員變量為person的name屬性2.<#>:FTL標(biāo)記(FreeMarker模板語(yǔ)言標(biāo)記):類似于HTML標(biāo)記,為了與HTML標(biāo)記區(qū)分3.<>:宏,自定義標(biāo)簽4.注釋:包含在<#-和->(而不是<!-和->)之間六.常用的FTL標(biāo)記:1、if指令:用于判斷的指令               

47、60;     <#if (2>3)>                                          二比三大   

48、60;                        <#else>                           

49、60;         三比二大                     </#if>       2、list指令:用來(lái)遍歷Map和List的        

50、;      2.1遍歷List的數(shù)據(jù)                     <#list arrList as item>                   &#

51、160;        $item                     </#list>              2.2遍歷Map的數(shù)據(jù)     

52、60;               <#listmyMap?keys as item>                            $item-à$myMap

53、item                     </#list>          2.3 item_has_next:判斷l(xiāng)ist是否還有值,              &l

54、t;#listarrList as item>                     <#if item_has_next>more,                     &#

55、160;      <#else>end.                     </#if>                    

56、                   </#list>              2.4<#break />指令可以跳出循環(huán)            

57、;         <#listarrList as item>                            <#if!item_has_nex>end. <#break />  &#

58、160;                         </#if>                     more,  &

59、#160;                  </#list>       3、include指令:用來(lái)引入另一個(gè)另一個(gè)ftl模板或者h(yuǎn)tml頁(yè)面              <#include“TemplateF

60、iles/example.ftl”>         4、assign指令:用于為該模板頁(yè)面創(chuàng)建或替換一個(gè)頂層變量       變量為String      <#assign address=”上?!?gt;            我家住在$address 

61、       結(jié)果:    我家住在上海變量為map:  <#assign person="name":"Tom","age":20,"address":"上海" >       我的名字叫$,我今年$person.age,我家住在$person.address  

62、     結(jié)果:我的名字叫Tom,我今年20,我家住在上海       5、import指令:用于導(dǎo)入FreeMarker模板中的所有變量,并將該變量放置在指定的Map對(duì)象中。       <#import "/libs/mylib.ftl"as my>       6.判斷為空: FreeMarker默認(rèn)

63、是不允許值為空或者值不存在的,否則一定會(huì)報(bào)錯(cuò)。所以我們需要一些方法來(lái)判斷是否為空或者是否存在         方法一:<h1>Welcome$user!"Anonymous"!</h1>                     當(dāng)user為空或者不存在會(huì)默認(rèn)為Ano

64、nymous.                     $user!這個(gè)當(dāng)user不存在或?yàn)榭諘r(shí)候,不會(huì)報(bào)錯(cuò),也不會(huì)輸出。         方法二:<#if name?>name is exist</#if>       &#

65、160;       這里會(huì)先判斷,若name為空或不存在則不會(huì)執(zhí)行if內(nèi)部的,也不會(huì)報(bào)錯(cuò)七、內(nèi)建函數(shù):       使用方法類似于訪問(wèn)散列的子變量,只是使用?代替.例如:$test?upper_case?html常用的內(nèi)建函數(shù)列舉如下:       ?html:   html字符轉(zhuǎn)義       ?cap_first

66、: 字符串的第一個(gè)字母變?yōu)榇髮懶问?#160;      ?lower_case :字符串的小寫形式       ?upper_case :字符串的大寫形式       ?trim:去掉字符串首尾的空格       ?substring:截字符串       ?lenth: 取長(zhǎng)度

67、0;      ?size: 序列中元素的個(gè)數(shù)       ?int : 數(shù)字的整數(shù)部分(比如- 1.9?int 就是- 1)       ?replace:字符串替換       一些示例:       $username?0,10   

68、    $appHtml?replace('<ponent/>', "AK47test")八、FreeMarker macro(宏)的使用1.example1.ftl 設(shè)置宏              <#macroname >            

69、0;               我的名字叫做$name!              </#macro>2.example2.ftl 調(diào)用example1.ftl的宏           

70、   <#inclue“example1.ftl”>              <#macroname=”王曉樂(lè)”></#macro>最終可以在example2.ftl模板生成的頁(yè)面中得到              我的名字叫做王曉樂(lè)!3.關(guān)于關(guān)于嵌套指令<#nest

71、ed>   <#macrogreet>              <#nested>              <#nested>            </#m

72、acro>調(diào)用:<greet>hello!</greet>結(jié)果:  hello!              hello!九、通過(guò)Struts2設(shè)置type來(lái)訪問(wèn)FreeMarker模板       1.WEB-INF/TemplateFiles/example.ftl模板文件html view plaincopy1. <span style=

73、"white-space:pre">  </span><html>  2.             <head>  3.                 <title>這是一個(gè)Examp

74、le</title>  4.             </head>  5.             <body>  6.            

75、0;    大家好,我的名字叫王媛媛!  7.             </body>  8.     </html>  2.action配置java view plaincopy1. public String example() throws Exception

76、   2.         System.out.println("example is requested.");  3. ActionContext.getContext().getSession().put("name", "劉德華");  4.         retur

77、n Action.SUCCESS;  5.       3.struts.xml配置 result的type要設(shè)置為freeMarkerjava view plaincopy1. <action name="*" class="com.lubby.action.ServiceAction" method="1">  2.    

78、0;    <result type="freemarker">/WEB-INF/TemplateFiles/1.ftl</result>  3.     </action>  3.struts.xml配置 result的type要設(shè)置為freeMarkerjava view plaincopy1. <action name="*" class="com.lubby.action.ServiceAction&qu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論