实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx

上传人:b****8 文档编号:22914921 上传时间:2023-02-06 格式:DOCX 页数:16 大小:131.27KB
下载 相关 举报
实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx_第1页
第1页 / 共16页
实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx_第2页
第2页 / 共16页
实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx_第3页
第3页 / 共16页
实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx_第4页
第4页 / 共16页
实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx

《实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx》由会员分享,可在线阅读,更多相关《实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx(16页珍藏版)》请在冰豆网上搜索。

实训18 FreeMarker指令函数及其Servlet中的应用 指导书Word格式.docx

……<

/@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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1