版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版婚宴花卉租賃合同
- 2024版冷水機(jī)組安裝合同
- 2024年餐具批量采購(gòu)供應(yīng)協(xié)議一
- 2022年中考化學(xué)模擬卷1(廣東專用)
- 2024年高效能源渣石買賣協(xié)議3篇
- 2024版智能化產(chǎn)品OEM合作采購(gòu)協(xié)議樣本版B版
- 2024年環(huán)保項(xiàng)目投資借款轉(zhuǎn)換正式協(xié)議3篇
- 2024影視制作公司與演員藝人演藝經(jīng)紀(jì)合同
- 勞務(wù)派遣的保險(xiǎn)責(zé)任協(xié)議書
- 2024年門窗安裝協(xié)議詳細(xì)條款樣本版B版
- 2023年非標(biāo)自動(dòng)化工程師年度總結(jié)及來(lái)年計(jì)劃
- 水利機(jī)械施工方案
- 廣東省佛山市南海區(qū)大瀝鎮(zhèn)2023-2024學(xué)年九年級(jí)上學(xué)期期中物理試卷
- ESD內(nèi)部審核日程計(jì)劃表+內(nèi)審檢查表+內(nèi)審報(bào)告全套資料
- HSK標(biāo)準(zhǔn)教程5下-課件-L
- 電腦基礎(chǔ)知識(shí)
- 工程竣工預(yù)驗(yàn)收簽到表
- 靜鉆根植樁施工組織設(shè)計(jì)
- 工程精細(xì)化管理
- 小學(xué)音樂(lè)-(演唱)小拜年教學(xué)設(shè)計(jì)學(xué)情分析教材分析課后反思
- 醫(yī)院患者知情同意與告知制度
評(píng)論
0/150
提交評(píng)論