欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

freemarker使用技巧、经验、问题-第一篇

程序员文章站 2022-05-24 09:34:06
...
这是我使用freemarker中的一些经验和技巧,与大家分享:
1、freemarker的优势:
freemarker与传统jsp有几个重大的优势,其一是它是一个解析式的模板语言,与Jsp需要编译相比,它运行速度更快,部署更灵活;其二、与web接口无关性,它可以很好的脱离javaweb的接口来工作,这样便可以在任何适合的地方完成解析,而无需一定要在web容器中和依赖web接口来工作,这有利于页面静态化和缓存;其三、良好的扩展性,可以灵活的自定义更多实用的功能和接口,让模板语言完成更多工作。

2、freemarker的解析模式,

freemarker有两种语法解析,一种是以<>来定义的语法解析,一种是以[]来扩充的语法解析,这两种解析各有优势,<>看上去美观漂亮,[]则严谨,与普通Html标记区分开来,这里要注意一个陷阱,就是使用[]模式时,首行必须以[#ftl]开头,而且解析器会要求[#ftl]必须在首字符,否则就会出错,那么很多时候[#ftl]明明在首字符为什么还是会报错?这存在一个字符解析的问题,有两种解析,一种是有bom解析,一种是无bom解析,什么意思呢?原因就是有bom解析就是文件的首字节中会告诉文本解析器这是个什么字符编码的文件,而无bom解析则没有这个提示,文本解析自己去识别该怎么解析。而freemarker在解析模板文件的适合把bom信息也解析在内,因此在有bom解析的文件中,即使[#ftl]在首位,但是前面还会有个隐藏的你看不见的bom解析信息,因此freemarker无论如何也不认为[#ftl]在首位,因此报错,拿如何解决这个问题呢?很简单,就是删除bom信息,一般用记事本编辑文本,会自动加上bom信息,所以你需要更高级的文本编辑器,例如eclipse的编辑器,以及notepad++,如图:

freemarker使用技巧、经验、问题-第一篇
            
    
    博客分类: 工作体悟编程语言 freemarkerwebjsphtml 

3、对于freemarker集合的加减的理解:
其实freemarker的集合和Java处理String的处理是相同的,freemarker不会改变集合,只会创造集合:例如定义[#assign a=['a','b'] ] [#assign b=['b','c'] ] [#assign a=a+b] 这个操作并不是把b的元素加入到a的元素中,而是新建一个c,把a和b的元素抽取出来,然后循环赋值给c元素,再把c覆盖a。因此freemarker集合的加减操作应该考虑空间复杂度和执行效率问题,不要随随便便使用集合的加减,最好是自己实现集合的拼接函数。

4、freemarker中关于输出${obj}的时候,这个适合你action里面传入的值是一个对象类型,而某些情况下它输出这个对象的toString()方法的返回值,而有时候会直接报错,说这里不是一个字符,或者数字,或者一个日期类型。特别是,如果你在页面中直接构建一个集合类型,例如你这样使用
 [#assign a=[1,3,4]]
 ${a}

这个时候一定会报错,说不是一个string number date类型,为什么会这样?这牵扯到freemarker模板在java中的一个接口映射定义,freemarker模板中的内容映射到java中,所有的东西都实现于接口 TemplateModel ,而freemarker规定能够在页面上输出的类型只有 TemplateScaleModel TemplateNumberModel TemplateDateModel三种接口定义的对象才会被输出。那么为什么在action中传入的对象明明没有被这些接口定义,却能够输出toString信息或者相关的信息呢?这就是freemarker在java接口中ObjectWrapper的功劳了,这是freemarker对象转化器,它吧所有进入到freemarker模板中的对象进行判断,如果已经是templatemodel接口则不处理,如果不是这个接口,那么他会自动将其封装成一个templatemodel接口。但是问题来了,那为什么有时候行,有时候不行呢,因为这牵扯到一个你所假设的框架引入转化器的类,freemarker默认引入的是一个DefaultWrapper对象,这个对象封装后的对象都没有继承templatescalemodel接口,因此放在页面上直接输出就会报错,而有些框架,如struts,货默认载入BeansWrapper接口对象,这个接口对象比前对象复杂,封装对象更为复杂,而且都继承了TemplateScaleModel对象,因此会在页面上输出toString()的值。

5、关于优先级,运算与解析处理的问题
一个运算${a[2]!0*100}在这个运算中,你这里期望的运算是你去a变量中索引第二个值,判断有没有,没有取0,然后乘以100,但是这里的运算可能会出乎你的预料,因为会先乘以100,然后再判断有没有值,所以你的出来的结果往往是没有乘100的,因此freemarker最好有括号的地方都要加上括号哦,因为很多运算优先级都比较不清晰。

这里是基础篇,就这么多了
  • freemarker使用技巧、经验、问题-第一篇
            
    
    博客分类: 工作体悟编程语言 freemarkerwebjsphtml 
  • 大小: 58.4 KB