资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,FreeMarker,语法详解,学习内容,一、,FreeMarker,技术概述,二、,FreeMarker,开发环境与技术原理,三、,FreeMarker,基本语法,四、,FreeMarker,开发,问题总结,第一章,FreeMarker,技术概述,1.1,模板引擎技术,Freemarker,是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯,Java,编写,具有以下特点,:,(,1,),Freemarker,适合被设计用来生成,HTML Web,页面,特别是基于,MVC,模式的应用程序。,(,2,)虽然,Freemarker,具有一些编程的能力,但通常由,Java,程序准备要显示的数据,由,Freemarker,生成页面,通过模板显示准备的数据。,(,3,),Freemarker,不是一个,Web,应用框架,而适合作为,Web,应用框架一个组件。,(,4,),Freemarker,与容器无关,因为它并不知道,HTTP,或,Servlet,;,Freemarker,同样可以应用于非,Web,应用程序环境。,(,5,),Freemarker,更适合作为,Model2,框架(如,Struts,)的视图组件,你也可以在模板中使用,JSP,标记库。,(,6,),Freemarker,是免费的,。,数据模型模版输出,第二章,Freemarker,开发环境与技术原理,Freemarker,对开发环境没有特殊要求,用普通的,java,应用程序,+,Freemarker,相关的,jar,包,就可以使用这种技术了,2,.1,、创建配置实例,:,1,、首先你需要创建一个,Configuration,(,freemarker.template.Configuration,)的实例,设置其中的某些属性。,Configuration,是存放,FreeMarker,的,Application,级别配置信息的一个重要地方。同时,它还负责创建及预解析模版,(template),Configuration,cfg,=new Configuration();,/,指定一个加载模版的数据源,/,这里我设置模版的根目录,cfg.setDirectoryForTemplateLoading(new,File(,/where/you/store/templates,);,/,指定模版如何查看数据模型,.,这个话题是高级主题,/,你目前只需要知道这么用就可以了,:,cfg.setObjectWrapper(new,DefaultObjectWrapper,();,2.2,创建数据模型(,Data Model,),1,、让我们来看一看怎么创建下面这个数据模型,:,(root),user=Big Joe,latestProduct,url,=products/,greenmouse.html,name=green mouse,以下是创建该模型的,java,代码:,/,创建一个,hash,类型作为数据模型的,root,Map root=new,HashMap,();,/,把字符串,user,放置到,root,中,root.put(user,Big Joe);,/,再创建一个,hash,类型名字叫做,latestProduct,Map latest=new,HashMap,();,/,同样把它放置到,root,中,root.put(latestProduct,latest);,/,放置,url,和,name,属性到,latest,latest.put(url,products/,greenmouse.html,);,latest.put(name,green mouse);,2.3,获取模版(,template,),1,、模版对象一般就是指代,freemarker.template.Template,实例。通常你可以从一,个,Configuration,实例中获取模版实例。你可以通过,getTemplate,这个方法来获得。,Template temp=,cfg.getTemplate(test.ftl,);,当你调用如上代码的时候,它将会创建一个与,test.ftl,对应的模版实例,也就是读取,/where/you/store/templates/,test.ftl,路径下的文件然后解析(编译)。模版对象一般存储的是经过解析过的模版内容,2.4,把模版与数据模型合并,我们都知道,,数据模型模版输出,,而我们一旦拥有数据模型(root)和一个模版(template)那么我们就可以把他们合并获得输出,。,以上这个过程是通过template,类的process,方法来实现的,该方法需要两个参数一个是表示数据模型的root,一个表示输出的Writer。它把解析过的文件输出到Writer,上。简单起见,我把输出指定到了控制台(标准输出,),Writer out=new,OutputStreamWriter(System.out,);,temp.process(root,out);,out.flush,();,由于Template,实例是无状态的,一旦你获取了一个模版实例,那么你可以与不同的数据库模型多次合并。另外test.ftl,文件是在Template,实例被创建的时候就读取的,而不,是等到调用process,的时候才读取,第三章,FreeMarker,基本语法,1,、,FreeMarker,标记,FreeMarker,标记的设计非常精炼,只有三种:,1)$:$expression,FreeMarker,会在输出时用实际值进行替代,例如:,$,stockNum?default,(),2)#:,标准的,FTL,标记。大部分,FreeMarker,指令都以,#,开始,可以明显地与,html,标记区分,our beloved leader,。,同时,,FTL,文件的注释包含在,(而不是,)之间,3),作为用户定义指令使用宏变量时,使用,替代,FTL,标记中的,#,。后面将详细介绍宏,2,标准的,FTL,标记指令,1),if,else,elseif,2),switch,case,default,break,3),list,break,4),include,5),Import,6),escape,noescape,7),assign,8),global,9),macro,nested,return,if,else,elseif,指令,语法,.,.,.,.,用例,x is 1,x is 1,x is not 1,switch,case,default,break,指令,This will be processed if it is small,This will be processed if it is medium,This will be processed if it is large,This will be processed if it is neither,list,break,指令,.,.,关键字,item_index,:,是,list,当前值的下标,item,_has_next,:,判断,list,是否还有值,例子:,$,x_index,+1.$x,输出,1.winter,2.spring,3.summer,4.autumn,include,指令,语法,:,or,options,包含两个属性,encoding=”GBK”,编码格式,parse=true,是否作为,ftl,语法解析,默认是,true,,,false,就是以文本方式引入,.,注意在,ftl,文件里布尔值都是直接赋值的如,parse=true,而不是,parse=”true”,用例,:,/common/,copyright.ftl,包含内容,Copyright 2001-2002$meAll rights reserved.,模板文件,Some testYeah.,输出结果,Some testYeah.,Copyright 2001-2002,Juila,SmithAll,rights reserved,Import,指令,语法,:,类似于,java,里的,import,它导入文件,然后就可以在当前文件里使用被导入文件里的宏组件,用例,:,假设,mylib.ftl,里定义了宏,copyright,那么我们在其他模板页面里可以这样使用,my,在,freemarker,里被称作,namespace,escape,noescape,指令,语法,.,.,.,用例,主要使用在相似的字符串变量输出,比如某一个模块的所有字符串输出都必须是,html,安全的,这个时候就可以使用该表达式,First name:$,firstName,Last name:$,lastName,Maiden name:$,maidenName,相同表达式,First name:$,firstName,?html,Last name:$,lastName,Maiden name:$,maidenName,?html,assign,指令,生成变量,并且给变量赋值,常用的语法形式,:,Or,Or,capture this,Or,capture this,global,指令,语法,Or,Or,capture this,全局赋值语法,利用这个语法给变量赋值,那么这个变量在所有的,namespace,中是可见的,如果这个变量被当前的,assign,语法覆盖 如,在当前页面里,x=2,将被隐藏,或者通过,$.,global.x,来访问,这里的,abc,叫做,namespace,macro,nested,return,指令,语法:,.,.,.,用例,Test text,and the,params,:$,foo,$,bar,$baaz,输出,Test text,and the,params,:a,b,23,Test text,and the,params,:a,b,-1,Test text,and the,params,:a,Bar,23,Test text,and the,params,:a,Bar,-1,repeatlib.ftl,文件包含的内容,$,c,.$,halfc,Last,!,输出,1.0.5,2.1,3.1.5,4.2 Last!,指令可以被多次调用,第四章,FreeMarker,开发,问题总结,1:,特殊字符的显示,如果包含特殊字符需要转义,如下面的例子,$Its quoted and this is a backslash:,$Its quoted and this is a backslash:,输出结果,Its quoted and this is a backslash:,Its quoted and this is a backslash:,有一类特殊的字符串称为,raw,字符串,被认为是纯文本,:,$,r$foo,$,rC:foobar,$,foo,C:,foo,bar,2:,使用过程当中容易出错的地方,下面的代码是错误的,Wow!,Wow!,应该写成下面这样,Wow!,FreeMarker,对,null,值有严格的校验,它将其视为,missing,variable,,报错!。为了防止错误发生我们可以为其设置当表,达式为,null,时的默认值:,stockNum?default,(),&(and),、,|(or),、,!(not),,只能用于布尔值,否则,会产生错误,问题小结,:,FreeMarker,是区分大小写的,FTL,标记不能位于另一个,FTL,标记内部,例如:,#if=bar.,$,只能在文本中使用,多余的空白字符会在模板输出时去除,如果使用的指令不存在,会产生一个错误消,3:FTL,内置的处理函数,用法类似访问对象的子变量,只是使用,?,替代,.,,例如:,$,user?,upper_case,【,对于字符串,】,html,对字符串进行,HTML,编码,cap_first,使字符串第一个字母大写,lower_case,将字符串转换成小写,trim,去掉字符串前后的空白字符,length,取得字符串长度,js_string,-,包含的特殊字符,(,如回车、,”),转化成变量可以接收的值,例:,var,BEAN_NAME=$,beanName?j_string,;,结果,:,String BEAN_NAME=The,foo,bean.;,【,对于,Sequences】,size,获得序列中元素的数目,【,对于数字,】,int,取得数字的整数部分(如,-1.9?int,的结果是,-1,),【,其它处理,】,xml-xml,安全处理,if_exists,、,exists:,判断对象是不是,null,列:,Mouse found ,也可以直接,$,mouse?if_exists,),输出布尔形,keys-,返回,hash,里的所有,keys,返回结果类型,sequence,values-,返回,hash,里的所有,value,返回结果类型,sequence,string-string(#),、,string(,是,否,),、,string(#.00),、,string(,yyyy-MM-dd,hh:mm:ss,),、,string(#.#),、,string(0.#),、,string.currency,:,指定数值以¥,42.00,显示,4:sequence,序列,(,对应,java,里的,list,、数组等非键值对的集合,),与,hash,键值对的集合,主要是针对,hash,结构怎样展示,$key=$,yourMap,key;,Xx,代表集合,判定集合是否为空,Set xx=new,HashSet,();,对于,Set,这种集合以上的判定,FTL,会,报错,应该转化之后,ArrayList,xx=new,ArrayList(new,HashSet,(),再存入数据模型当中,5:,模板中的变量的使用范围及命名空间,变更的使用范围,:,plain(,全局,),变量:,可以在模板的任何地方访问,包括使用,include,指令插入的模板,使用,assign,指令创建和替换,局部变量:,在,macro,中有效,使用,local,指令创建和替换,循环变量:,只能存在于指令的嵌套内容,由指令,(,如,list),自动创建;宏的参数是局部变量,而不是循环变量,局部变量隐藏,(,而不是覆盖,),同名的,plain,变量;,循环变量隐藏同名的局部变量和,plain,变量,下,面是一个例子,:,1.$x,6.$x,7.$x,8.$x,9.$x,2.$x,3.$x,4.$x,5.$x,模板中的变量会隐藏(而不是覆盖)数据模型中同名变,量,如果需要访问数据模型中的同名变量,使用特殊变,量,global,,下面的例子假设数据模型中的,user,的值是,Big Joe,:,$user ,$.,globals.user,命名空间技术,:,通常情况,只使用一个命名空间,称为主命名空间,(main namespace),,但你是不会意识到这些的;为了,创建可重用的,macro,必须使用多命名空间,为了防止同,名冲突,列如:,首先创建一个库,(,假设保存在,lib/,my_test.ftl,中,),:,Copyright(C)$dateJuliaSmith.Allrightsreserved.,Email:$mail,使用,import,指令导入库到模板中,,Freemarker,会为导入的库创建新,的命名空间,并可以通过,import,指令中指定的,hash(,散列,),变量访问库,中的变量:,$,my.mail,$mail,上面的例子中使用的两个同名变量并没有冲突,因为它,们位于不同的命名空间,可以使用,assign,指令在导入的命,名空间中创建或替代变量:,$,my.mail,$,my.mail,数据模型中的变量任何地方都可见,也包括不同的命名,空间。,
展开阅读全文