




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、FreeMarker教程一、什么是模板引擎,為什么要用模板引擎在B/S程式設(shè)計中,常常有美工和程序員二個角色,他們具有不同專業(yè)技能:美工專注于表現(xiàn)創(chuàng)建頁面、風(fēng)格、布局、效果等等可視元素;而程序員則忙于創(chuàng)建程式的商業(yè)流程,生成設(shè)計頁面要顯示的數(shù)據(jù)等等。很多時候,要顯示的資料在設(shè)計的時候并不存在,它們一般是在運行時由程式產(chǎn)生的,比如執(zhí)行“價格不高于800NT的USB Disk”查詢的返回結(jié)果。這種技術(shù)需求產(chǎn)生了JSP等Scriptlet,JSP十分強大,但是也常常被濫用,并導(dǎo)致一些不良的后果1. 將邏輯和表現(xiàn)混合在一起。2. 破壞了美工和程序員職責(zé)的正常分解。3. 使JSP頁面難以閱讀和維護。模板
2、引擎就是為了解決上面的問題而產(chǎn)生的。在設(shè)計HTML的時候,我們加入一些特定指令來指定要插入哪些數(shù)據(jù),這些加了特殊指令的HTML或者其他文本,我們稱為模板(Template)。而模板引擎會在輸出頁面時,用適當(dāng)?shù)臄?shù)據(jù)替代這些代碼。模板和嵌入JSP的HTML是不同的,模板指令只有很有限的編程能力,可以避免混入商業(yè)邏輯。二、FreeMarker與JSP、Velocity的對比 FreeMarker優(yōu)點: 1. 不能編寫Java代碼,可以實現(xiàn)嚴格的MVC分離2. &
3、#160; 美工和技術(shù)的工作分離3. 頁面是靜態(tài)化的,這樣方便搜索引擎的收錄4. 模板可以存在數(shù)據(jù)庫,可以實現(xiàn)cms定制功能5. 性能不錯,頁面顯示的速度非???,省去了JSP編譯的過程6. 內(nèi)置許多功能強大的標(biāo)記、以及大量常用的函數(shù)7. 帶有宏定義(
4、macro)功能,類似于JSP自定義標(biāo)簽,但是更加簡單方便8. 支持JSP標(biāo)簽9. Struts2對其支持效果不錯10. 不一定非要在Servlet中去實現(xiàn) &
5、#160; FreeMarker缺點:1. 性能沒有Velocity高,學(xué)習(xí)起來沒有Velocity簡單2. 需要花費時間重新學(xué)習(xí)3. FreeMarker中不能讀取值為null的變量,會報錯,必須要設(shè)置默認值或者判斷4. 模板修改之后,如果沒有更新模板生成的HTML,會看到過期的頁面5. &
6、#160; MyEclipseIDE插件的效果不太好三、一個簡單的FreeMarkerDemo1.導(dǎo)入Jar包: FreeMarker需要freemarker-2.3.19.jar包,Struts2里面有這個Jar包。2.編寫模板文件 FreeMarker的模板文件的后綴名是ftl。這里是我寫的一個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對象 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號"); 18. root.put("age", 23); 19. /* 20. *設(shè)置生成的模板的位置 21.
15、160; *合并數(shù)據(jù)模型與模板 22. *生成最終的html頁面 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號,我今年23歲了!</h1> 7. </body> 8. </html> 四、FreeMarke
29、r的數(shù)據(jù)模型 數(shù)據(jù)模型是樹型結(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,包含保存下級變量的唯一的查詢名字 類似于文件的變量稱為scalars,保存單值 scalars保存的值有兩種類型:字符串(用
36、引號括起,可以是單引號或雙引號)和數(shù)字(不要用引號將數(shù)字括起,這會作為字符串處理) 另外一種變量是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、; 這種對scalars的訪問使用索引,如 這種對scalars的訪問使用索引,如五、模板的常用指令 在FreeMarker模板中可以包括下面幾個特定部分:1.$:稱為interpolations,F(xiàn)reeMarker會在輸出時用實際值進行替代。 1.1 $name可以取得root中key為name的value。 &
46、#160; 1.2 $可以取得成員變量為person的name屬性2.<#>:FTL標(biāo)記(FreeMarker模板語言標(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指令:用來遍歷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指令:用來引入另一個另一個ftl模板或者html頁面 <#include“TemplateF
60、iles/example.ftl”> 4、assign指令:用于為該模板頁面創(chuàng)建或替換一個頂層變量 變量為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對象中。 <#import "/libs/mylib.ftl"as my> 6.判斷為空: FreeMarker默認
63、是不允許值為空或者值不存在的,否則一定會報錯。所以我們需要一些方法來判斷是否為空或者是否存在 方法一:<h1>Welcome$user!"Anonymous"!</h1> 當(dāng)user為空或者不存在會默認為Ano
64、nymous. $user!這個當(dāng)user不存在或為空時候,不會報錯,也不會輸出。 方法二:<#if name?>name is exist</#if>
65、160; 這里會先判斷,若name為空或不存在則不會執(zhí)行if內(nèi)部的,也不會報錯七、內(nèi)建函數(shù): 使用方法類似于訪問散列的子變量,只是使用?代替.例如:$test?upper_case?html常用的內(nèi)建函數(shù)列舉如下: ?html: html字符轉(zhuǎn)義 ?cap_first
66、: 字符串的第一個字母變?yōu)榇髮懶问?#160; ?lower_case :字符串的小寫形式 ?upper_case :字符串的大寫形式 ?trim:去掉字符串首尾的空格 ?substring:截字符串 ?lenth: 取長度
67、0; ?size: 序列中元素的個數(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=”王曉樂”></#macro>最終可以在example2.ftl模板生成的頁面中得到 我的名字叫做王曉樂!3.關(guān)于關(guān)于嵌套指令<#nest
71、ed> <#macrogreet> <#nested> <#nested> </#m
72、acro>調(diào)用:<greet>hello!</greet>結(jié)果: hello! hello!九、通過Struts2設(shè)置type來訪問FreeMarker模板 1.WEB-INF/TemplateFiles/example.ftl模板文件html view plaincopy1. <span style=
73、"white-space:pre"> </span><html> 2. <head> 3. <title>這是一個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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國格子花呢上衣行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030中國柱塞升降機行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030中國有機姜黃提取物行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 2025-2030中國無車承運人行業(yè)市場發(fā)展現(xiàn)狀及市場格局與投資研究報告
- 生物氧化劑的分子對接與藥物設(shè)計-洞察闡釋
- 2025年人教版二年級語文上冊興趣小組計劃
- 2025-2030中國數(shù)字雜貨銷售行業(yè)市場發(fā)展趨勢與前景展望戰(zhàn)略研究報告
- 傳統(tǒng)工藝復(fù)興-洞察闡釋
- 實時視頻分析與目標(biāo)檢測-洞察闡釋
- 金融行業(yè)HSE管理措施及風(fēng)險控制
- 聯(lián)大學(xué)堂《人力資源管理薪酬管理(河南理工大學(xué))》題庫附答案
- 2025年下半年太原市招考社區(qū)專職社工人員易考易錯模擬試題(共500題)試卷后附參考答案
- 【KAWO科握】2025年中國社交媒體平臺指南報告
- 2025年財務(wù)會計師入職考試試題及答案
- 云南2025年云南省社會科學(xué)院中國(昆明)南亞東南亞研究院招聘筆試歷年參考題庫附帶答案詳解
- 健康教育在護理工作中的意義
- 2025年5月12日陜西省公務(wù)員面試真題及答案解析
- 【語文】第23課《“蛟龍”探?!氛n件 2024-2025學(xué)年統(tǒng)編版語文七年級下冊
- 23秋國家開放大學(xué)《小學(xué)語文教學(xué)研究》形考任務(wù)1-5參考答案
- 4例先天性高胰島素血癥患兒的護理
- 民辦學(xué)?;I設(shè)批準(zhǔn)書
評論
0/150
提交評論