版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、FreeMarker教程一、什么是模板引擎,为什么要用模板引擎在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果1. 将逻辑和表现混合在一起。2. 破坏了美工和程序员职责的正常分解。3. 使JSP页面难以阅读和维护。模板
2、引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码。模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。二、FreeMarker与JSP、Velocity的对比 FreeMarker优点: 1. 不能编写Java代码,可以实现严格的MVC分离2. &
3、#160; 美工和技术的工作分离3. 页面是静态化的,这样方便搜索引擎的收录4. 模板可以存在数据库,可以实现cms定制功能5. 性能不错,页面显示的速度非常快,省去了JSP编译的过程6. 内置许多功能强大的标记、以及大量常用的函数7. 带有宏定义(
4、macro)功能,类似于JSP自定义标签,但是更加简单方便8. 支持JSP标签9. Struts2对其支持效果不错10. 不一定非要在Servlet中去实现 &
5、#160; FreeMarker缺点:1. 性能没有Velocity高,学习起来没有Velocity简单2. 需要花费时间重新学习3. FreeMarker中不能读取值为null的变量,会报错,必须要设置默认值或者判断4. 模板修改之后,如果没有更新模板生成的HTML,会看到过期的页面5. &
6、#160; MyEclipseIDE插件的效果不太好三、一个简单的FreeMarkerDemo1.导入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.模板的解析模板需要被解析之后才能生成最终的文件,FreeMark
9、er的数据模型也是在模板中配置的。ExampleResolution.javajava view plaincopy1. publicclass ExampleResolution 2. publicvoid resolution() 3. Writer out = null; 4.
10、0; /* 5. *创建Configuration对象 6. *设置模板文件的基路径 7. *设置读取模板的编码方式 8.
11、60; */ 9. Configuration cfg = new Configuration(); 10. cfg.setServletContextForTemplateLoading(ServletActionContext.getServletContext(),"TemplateFiles");
12、 11. cfg.setDefaultEncoding("UTF-8"); 12. /* 13. *创建FreeMarker的数据模型 14.
13、 */ 15. Map root = newHashMap(); 16. root.put("name","李鑫龙"); 17. root.p
14、ut("address","合肥市望江西路666号"); 18. root.put("age", 23); 19. /* 20. *设置生成的模板的位置 21.
15、160; *合并数据模型与模板 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的数据模型 数据模型是树型结构,可以任意复杂和深层次,如下面的例子: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、引号括起,可以是单引号或双引号)和数字(不要用引号将数字括起,这会作为字符串处理) 另外一种变量是sequences,和hashes类似,只是不使用变量名字,而使用数字索引,如下面的例子: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,FreeMarker会在输出时用实际值进行替代。 1.1 $name可以取得root中key为name的value。 &
46、#160; 1.2 $可以取得成员变量为person的name属性2.<#>:FTL标记(FreeMarker模板语言标记):类似于HTML标记,为了与HTML标记区分3.<>:宏,自定义标签4.注释:包含在<#-和->(而不是<!-和->)之间六.常用的FTL标记:1、if指令:用于判断的指令
47、60; <#if (2>3)> 二比三大
48、60; <#else>
49、60; 三比二大 </#if> 2、list指令:用来遍历Map和List的
50、; 2.1遍历List的数据 <#list arrList as item>
51、160; $item </#list> 2.2遍历Map的数据
52、60; <#listmyMap?keys as item> $item-à$myMap
53、item </#list> 2.3 item_has_next:判断list是否还有值, &l
54、t;#listarrList as item> <#if item_has_next>more,
55、160; <#else>end. </#if>
56、 </#list> 2.4<#break />指令可以跳出循环
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指令:用于为该模板页面创建或替换一个顶层变量 变量为String <#assign address=”上海”> 我家住在$address
61、 结果: 我家住在上海变量为map: <#assign person="name":"Tom","age":20,"address":"上海" > 我的名字叫$,我今年$person.age,我家住在$person.address
62、 结果:我的名字叫Tom,我今年20,我家住在上海 5、import指令:用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中。 <#import "/libs/mylib.ftl"as my> 6.判断为空: FreeMarker默认
63、是不允许值为空或者值不存在的,否则一定会报错。所以我们需要一些方法来判断是否为空或者是否存在 方法一:<h1>Welcome$user!"Anonymous"!</h1> 当user为空或者不存在会默认为Ano
64、nymous. $user!这个当user不存在或为空时候,不会报错,也不会输出。 方法二:<#if name?>name is exist</#if>
65、160; 这里会先判断,若name为空或不存在则不会执行if内部的,也不会报错七、内建函数: 使用方法类似于访问散列的子变量,只是使用?代替.例如:$test?upper_case?html常用的内建函数列举如下: ?html: html字符转义 ?cap_first
66、: 字符串的第一个字母变为大写形式 ?lower_case :字符串的小写形式 ?upper_case :字符串的大写形式 ?trim:去掉字符串首尾的空格 ?substring:截字符串 ?lenth: 取长度
67、0; ?size: 序列中元素的个数 ?int : 数字的整数部分(比如- 1.9?int 就是- 1) ?replace:字符串替换 一些示例: $username?0,10
68、 $appHtml?replace('<ponent/>', "AK47test")八、FreeMarker macro(宏)的使用1.example1.ftl 设置宏 <#macroname >
69、0; 我的名字叫做$name! </#macro>2.example2.ftl 调用example1.ftl的宏
70、 <#inclue“example1.ftl”> <#macroname=”王晓乐”></#macro>最终可以在example2.ftl模板生成的页面中得到 我的名字叫做王晓乐!3.关于关于嵌套指令<#nest
71、ed> <#macrogreet> <#nested> <#nested> </#m
72、acro>调用:<greet>hello!</greet>结果: hello! hello!九、通过Struts2设置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要设置为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要设置为freeMarkerjava view plaincopy1. <action name="*" class="com.lubby.action.ServiceAction&qu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025版高血压常见症状分析及护理指导
- 天门科技馆介绍
- 视网膜病变的治疗方法
- 病房物品保管宣教
- 2025版代谢病常见症状及护理注意事项
- 铱星组网协议书
- 2025-2026学年安徽省宿州市五年级道德与法治上册期中考试试卷及答案
- 苏课新版二年级生物上册月考考试试题及答案
- 京津冀合作框架协议书
- 流感病常见表现及护理指南培训
- 第九章 静电场及其应用
- 2025年国家开放大学(电大)《组织行为学基础》期末考试备考试题及答案解析
- 幼儿园静电课件
- 《PLC应用技术(西门子S7-1200)第二版》全套教学课件
- GB/T 507-2002绝缘油击穿电压测定法
- 2023年洞口县水利系统事业单位招聘笔试题库及答案
- 幼儿园食品安全舆情监测和处置机制制度
- 物料与产品管理规程
- 环保领导组组织机构及工作职责
- DB32T 4285-2022 预应力混凝土空心方桩基础技术规程
- 水冷壁安装施工方案
评论
0/150
提交评论