实训18 FreeMarker指令函数及其Servlet中的应用 指导书.docx
- 文档编号:9712327
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:16
- 大小:131.27KB
实训18 FreeMarker指令函数及其Servlet中的应用 指导书.docx
《实训18 FreeMarker指令函数及其Servlet中的应用 指导书.docx》由会员分享,可在线阅读,更多相关《实训18 FreeMarker指令函数及其Servlet中的应用 指导书.docx(16页珍藏版)》请在冰豆网上搜索。
实训18FreeMarker指令函数及其Servlet中的应用指导书
实训十八FreeMarker指令、函数及其Servlet中的应用
实训目的:
1.解FTL标签指令规则、在模板中定义变量及异常处理;
2.掌握FreeMarker内置函数及FreeMarker指令操作;
3.实现在servlet中使用FreeMarker;
实训设备:
1.微型计算机30台,不进行分组。
2.微型计算机配置:
操作系统WindowsXP/2000、Tomcat6.0服务器、JDK1.6、MySQL数据库、Eclipse工具等相关软件。
实训步骤:
正确启动计算机,在最后一个磁盘区创建建以学号和姓名为名的文件夹,从指定的共享文件夹中将“实习指导书”和其他内容复制到新建的文件夹中。
一.任务提出
◆FreeMarker标签指令规则、指令操作及内置函数
◆在Servlet程序中使用FreeMarker
二.知识要点
(一)FTL标签指令规则
1.FTL标签
FreeMarker有3种FTL标签,这和HTML标签是完全类似的.
◆开始标签:
<#directivenameparameter>
◆结束标签:
#directivename>
◆空标签:
<#directivenameparameter/>
2.指令类型
1)预定义指令
使用<#...>加指令名的方式来引用,存放所有freemaker的内容,之外的内容全部原样输出。
示例:
<#listanimalsasbeing>……#list>
2)用户定义指令
使用<@.../>加指令名的方式引用,主要是函数调用
示例:
<@mydirective>……@mydirective>
说明:
①实际上,使用标签时前面的符号#也可能变成@,若该指令是一个用户指令而不是系统内建指令时,应将#符号改成@符号。
②两个定界符内的内容中,第一个符号表示指令或者函数名,其后的跟随参数
③使用FTL标签时,应该有正确的嵌套,而不是交叉使用,这和XML标签的用法完全一样。
如果使用,FreeMarker不会使用模板输出,而是产生一个错误消息;FreeMarker会忽略FTL标签中的空白字符,值得注意的是<,/>和指令之间不允许有空白字符.
(二)FreeMarker指令操作
1.If/elseif/else指令
作用:
用于实现条件逻辑
格式:
<#ifcondition1>...
<#elseifcondition2>...
<#elseifcondition3>...
<#else>...
#if>
示例:
项目FreeMarkerOne中(student.java、student.ftl)
运行:
students.java
说明:
1)condition是条件表达式,结果要求是布尔值
2)逻辑表达式用括号括起来主要是因为里面有>符号,由于FreeMarker会将>符号当成标签的结束字符,可能导致程序出错,为了避免这种情况,我们应该在凡是出现这些符号的地方都使用括号。
3)创建数据模型见Student.java
4)获取模版、模版与数据模型合并见FreeMarkerTemplateSupport.java
5)Template实例是无状态的,一旦获取一个模版实例,则可以与不同的数据库模型多次合并。
另外模版文件是在Template实例被创建的时候就读取的,而不是等到调用process的时候才读取。
2.switch,case,default,break指令
作用:
分支指令,用于实现多重选择逻辑,类似Java的switch语句。
格式:
<#switchvalue>
<#caserefValue1>...<#break>
<#caserefValue2>...<#break>
<#default>...
#switch>
示例:
项目FreeMarkerOne中(Employee.java、employee.ftl)
说明:
value、refValueN等要求是同类型的标量(scalar),少用该指令,用if指令
3.list,break指令
作用:
用于对sequence变量做循环迭代输出指令,迭代输出数据模型中的集合
格式:
<#listsequenceasitem>
...
#list>
说明:
①sequence就是一个集合对象,也可是一个表达式,但该表达式将返回一个集合对象,而item是循环变量的名字,是一个任意的名字,是被迭代输出的集合元素
②迭代集合对象时包含两个特殊的循环变量:
item_index:
当前变量的索引值
item_has_next:
是否存在下一个对象,或是否是序列中的最后一项
③使用<#break>指令跳出迭代
示例:
项目FreeMarkerOne中(ListTest.java、list.ftl)
4.include指令
作用:
用于在模板中插入其他文件的内容,类似于JSP的包含指令 inlcude>。 格式: <#includefilename[options]> 或者 <#includefilename[encoding=encodeing,parse=parse]> 说明: filename: 该参数指定被包含的模板文件 options: 该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding: 指定包含页面时所用的编码方式, parse: 指定被包含文件是否作为FTL文件来解析,默认是true,false时为普通文件 示例: 项目FreeMarkerOne中(IncludeTest.java、include.ftl、copyright.ftl) 5.import指令 作用: 用于导入一个库,或者用于导入FreeMarker模板中的所有变量,并将该变量放置在指定的Map对象中 库: 在一个模板中使用assign和macro指令创建的可重用的变量的集合。 格式: <#importpathashash> 说明: path: 模板的路径和模板文件,可是计算结果为字符串的表达式 hash: 指定一个hash变量的名字,通过该变量访问import指令创建的名称空间 例如: <#import"/lib/common.ftl"ascom> 将导入/lib/common.ftl模板文件中的所有变量,将这些变量放置在一个名为com的Map对象中.。 示例: 项目FreeMarkerOne中(ImportTest.java、page.ftll、foot.ftl) 6.assign指令 作用: 创建一个新的变量,或者替换一个现有的顶层变量,即只用于为该模板页面创建或替换一个顶层变量。 包含创建或替换一个顶层变量,或者创建或替换多个变量等 1)用于指定一个名为name的变量,该变量的值为valueassign指令里增加in子句,将创建的name变量放入namespacehash命名空间中,格式: <#assignname=value[innamespacehash]> 2)可以同时创建或替换多个顶层变量,并赋值,格式: <#assignname1=value1name2=value2...nameN=valueN[innamespacehash]> 3)用于要创建或替换的变量值是一个复杂的表达式,将assign指令的内容赋值给name变量,格式: <#assignname[innamespacehash]>capturethis#assign> 说明: name是变量的名字,不能是表达式 value是量的值,不能是表达式 namespacehash指定代表一个名称空间(由import指令创建)的hash变量,可表达式 示例: 见课件 7.global 作用: 类似于assign指令,但创建的是全局变量,并在所有空间中使用;若某空间中有相同的变量,则全局变量被隐藏。 格式: <#globalname=value> 或者 <#globalname1=value1name2=value2...nameN=valueN> 或者 <#globalname> capturethis #global> 说明: name是变量的名字,不能是表达式; value是变量的值,可以是表达式; 8.local 作用: 创建或替换的局部变量 <#localname=value> 或者 <#localname1=value1name2=value2...nameN=valueN> 或者 <#localname> capturethis #local> 9.setting指令 作用: 用于设置FreeMarker的运行环境,用于对FreeMarker的处理行为进行配置; 格式: <#settingname=value> 属性: name是设置项的名字,不能是表达式; value是设置项的值,可是表达式; setting指令支持的设置项有: ◆locale: 指定该模板输出的语言环境(zh_CN、en_US); ◆number_format: 指定格式化输出数字的格式(number、currency或percnet); ◆boolean_format: 指定两个布尔值的语法格式,默认值是true,false; ◆date_format,time_format,datetime_format: 指定格式化输出日期的格式(short、l◆ong_medium、MM/dd/yyyy); ◆time_zone: 设置格式化输出日期时所使用的时区; 示例: 见课件 10.macro,nested,return指令 1)macro指令 作用: 在当前名称空间中创建一个宏变量 格式: <#macronameparam1param2…paramN> <#nestedloopvar1,loopvar2,...,loopvarN> <#return> #macro> 说明: name是宏变量的名字,不能是表达式 paramN是保存参数值的局部变量的名字 loopvarN是可选的,是nested指令为嵌套的内容创建的循环变量的值 return和nested指令是可选。 宏变量是在模板中的开始处创建的 示例: 见课件 2)nested指令 作用: 用于执行用户定义指令(即宏变量)开始标签和结束标签之间的模板片段,若无nested指令,则用户定义指令的开始标签和结束标签之间的部分将被忽略。 示例: nested指令可为嵌套的内容创建循环变量 <#macrodo_twice> <#nested1> <#nested2> <#nested3> #macro> <@do_twice;x>${x}something@do_twice> 输出: 1Anything 2Anything 3Anhthing 说明: 分号(;)后面接X的这种用法,变量接收nested指令传入的循环变量值,在do_thrice的宏定义体中,nested指令调用了三次,X变量将接收新的值,且每次给出的循环变量值。 3)Return指令 作用: 从程序中跳出宏定义体 11.function,return 作用: 在当前名称空间中创建一个方法变量 格式: <#functionnameparam1param2…paramN> … <#returnreturnValue> … #function> 12.noparse指令 作用: 指定FreeMarker不处理该指定里包含的内容 格式: <#noparse>...#noparse> (三)FreeMarker内置函数 Interpolation: 由${...}或#{...}两种类型,输出计算值,可以自定义输出的格式 通用Interpolation: ${expr}数字Interpolation: #{expr}或#{expr;format} 注意: Interpolation只能用于文本部分 插入字符串值: 直接输出表达式结果 插入数字值: 根据缺省格式(由#setting指令设置)将表达式结果转换成文本输出 1.Sequence序列的内置函数 ◆sequence? first返回sequence的第一个值。 ◆sequence? last返回sequence的最后一个值。 ◆sequence? reverse将sequence的现有顺序反转,即倒序排序 ◆sequence? size返回sequence的大小 ◆sequence? sort将sequence中的对象转化为字符串后顺序排序 ◆sequence? sort_by(value)按sequence中对象的属性value进行排序 注意: sequence不能为null。 遍历List有详细的应用 2.Hash的内置函数/操作散列 ◆hash? keys返回hash里的所有key,返回结果为sequence ◆hash? values返回hash里的所有value,返回结果为sequence 3.操作字符串函数 1)substring(start,end) 作用: 从一个字符串中截取子串 ◆start: 截取子串开始的索引,start必须大于等于0,小于等于end ◆end: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该参数,默认为字符串长度。 2)cap_first 作用: 将字符串中的第一个单词的首字母变为大写。 示例: ${‘str’? cap_first}-->结果为Str 3)uncap_first 作用: 将字符串中的第一个单词的首字母变为小写。 示例: ${‘Str’? cap_first}-->结果为str 4)capitalize 作用: 将字符串中的所有单词的首字母变为大写 示例: ${‘str’? capitalize}-->结果为STR 5)date,time,datetime 作用: 将字符串转换为日期 注意: 如果指定的字符串格式不正确将引发错误。 6)ends_with 作用: 判断某个字符串是否由某个子串结尾,返回布尔值。 注意: 布尔值必须转换为字符串才能输出 7)html 作用: 用于将字符串中的<、>、&和“替换为对应得<>": & 8)index_of(substring,start) 作用: 在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。 Start参数用于指定从字符串的那个索引处开始搜索,start为数字值,若start大于字符串长度,则start取值等于字符串长度,若start小于0,则start取值为0。 9)length 作用: 返回字符串的长度${“string”? length}-->结果为6 10)lower_case 作用: 将字符串转为小写 ${“STRING”? lower_case}-->结果为string 11)upper_case 作用: 将字符串转为大写 示例: ${“string”? upper_case}-->结果为STRING 12)contains 作用: 判断字符中是否包含某个子串。 返回布尔值 示例: ${“string”? contains(“ing”)? string}-->结果为true 注意: 布尔值必须转换为字符串才能输出 13)number 作用: 将字符串转换为数字 示例: ${“111.11”? number}-->结果为111.11 14)replace 作用: 用于将字符串中的一部分从左到右替换为另外的字符串。 示例: ${“strabg”? replace(“ab”,”in”)}-->结果为string 15)split 作用: 使用指定的分隔符将一个字符串拆分为一组字符串 4.操作数字 1)c操作函数 作用: 用于将数字转换为字符串 2)string函数 作用: 用于将数字转换为字符串(预订义了三种数字格式: number,currency(货币)和percent(百分比)其中number为默认的数字格式转换) 5.操作布尔值 1)fon? string 作用: 将布尔值转换为字符串输出,true转为“true”,false转换为“false” 2)foo? string(“yes”,”no”) 作用: 布尔值是true,那么返回“yes”,否则返回no。 返回的是字符串(数字) (四)在模板中定义变量 1.变量类型在模板中定义的变量有三种类型 1)plain普通变量 可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换。 2)local局部变量 在宏定义体中有效,使用local指令创建和替换。 3)loop循环变量 只能存在于指令的嵌套内容,由指令(如list)自动创建。 2.变量隐藏 1)宏的参数是局部变量,不是循环变量。 2)局部变量隐藏同名的plain变量 3)循环变量隐藏同名的plain变量和局部变量。 4)内部循环变量隐藏同名的外部循环变量 5)模板中的变量会隐藏数据模型中的同名变量,如果需访问数据模型中的变量,使用特殊变量global。 示例: 假设数据模型中的user值为Emma <#assignuser="Man"> ${user}<#--Man--> ${global.user}<#--Emma--> 三.实践操作: 在Servlet程序中使用FreeMarker 分析: 1.Servlet程序中FreeMarker来将数据模型中的值合并到模板文件中的步骤: 1)创建Configuration实例,该实例负责管理FreeMarker的模板加载路径,负责生成模板实例 2)使用Configuration实例来生成Template实例,同时需要指定使用的模板文件 3)填充数据模型,数据模型就是一个Map对象 4)调用Template实例的process方法完成合并 2.创建项目FreeMarkerTest,部署开发Jar包。 3.显示数据的ftl模板文件 在WebRoot目录下创建一个目录templates,并创建模板文件hello.ftl:
hello${user}!
4.创建servlet:
在src目录下创建servlet包和Hello.java文件
5.配置web.xml(没有其他过滤器)
6.在WebRoot下面新建引导页面index.html:
点击下面链接看看效果:
7.实践操作
要求:
通过40-60分钟完成该实例操作
测试:
http:
//localhost:
8080/FreeMarkerTest/index.html
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实训18 FreeMarker指令函数及其Servlet中的应用 指导书 实训 18 FreeMarker 指令 函数 及其 Servlet 中的 应用