实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx
《实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx》由会员分享,可在线阅读,更多相关《实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
……<
/@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>
#default>
/#switch>
项目FreeMarkerOne中(Employee.java、employee.ftl)
value、refValueN等要求是同类型的标量(scalar),少用该指令,用if指令
3.list,break指令
用于对sequence变量做循环迭代输出指令,迭代输出数据模型中的集合
#listsequenceasitem>
①sequence就是一个集合对象,也可是一个表达式,但该表达式将返回一个集合对象,而item是循环变量的名字,是一个任意的名字,是被迭代输出的集合元素
②迭代集合对象时包含两个特殊的循环变量:
item_index:
当前变量的索引值
item_has_next:
是否存在下一个对象,或是否是序列中的最后一项
③使用<
指令跳出迭代
项目FreeMarkerOne中(ListTest.java、list.ftl)
4.include指令
用于在模板中插入其他文件的内容,类似于JSP的包含指令<
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>
@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的第一个值。
last返回sequence的最后一个值。
reverse将sequence的现有顺序反转,即倒序排序
size返回sequence的大小
sort将sequence中的对象转化为字符串后顺序排序
sort_by(value)按sequence中对象的属性value进行排序
sequence不能为null。
遍历List有详细的应用
2.Hash的内置函数/操作散列
◆hash?
keys返回hash里的所有key,返回结果为sequence
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’?
结果为str
4)capitalize
将字符串中的所有单词的首字母变为大写
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
判断字符中是否包含某个子串。
返回布尔值
contains(“ing”)?
string}-->
结果为true
13)number
将字符串转换为数字
${“111.11”?
number}-->
结果为111.11
14)replace
用于将字符串中的一部分从左到右替换为另外的字符串。
${“strabg”?
replace(“ab”,”in”)}-->
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:
body>
h1>
hello${user}!
/h1>
/body>
4.创建servlet:
在src目录下创建servlet包和Hello.java文件
5.配置web.xml(没有其他过滤器)
servlet>
<
servlet-name>
Hello<
/servlet-name>
servlet-class>
example.Hello<
/servlet-class>
/servlet>
servlet-mapping>
url-pattern>
*.do<
/url-pattern>
/servlet-mapping>
6.在WebRoot下面新建引导页面index.html:
html>
head>
title>
HelloFreeMarkerExample<
/title>
metahttp-equiv="
Content-type"
content="
text/html;
charset=utf-8"
/head>
点击下面链接看看效果:
hr>
ahref="
hello.do"
调用Hello模板<
/a>
/html>
7.实践操作
要求:
通过40-60分钟完成该实例操作
测试:
http:
//localhost:
8080/FreeMarkerTest/index.html