`
spiniper
  • 浏览: 5936 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

阅读更多
这是我使用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++,如图:



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最好有括号的地方都要加上括号哦,因为很多运算优先级都比较不清晰。

这里是基础篇,就这么多了
  • 大小: 58.4 KB
分享到:
评论

相关推荐

    Spring全家桶核心篇:SpringBoot快速入门 源码

    其对于Spring Boot的最常用的第一个小程序、JavaConfig和常见注解、启动改变、热部署、Springboot整合Thymeleaf/freemarker/JSP、异常处理、配置文件、日志、国际化等都使用案例进行了说明,并且在最后通过一个贯穿...

    前端模板引擎Mustache教程.zip

    1. "Mustache 使用心得总结 - xuemojoyao的专栏 - CSDN博客":这篇博客文章提供了作者在使用Mustache过程中的经验和技巧,对初学者很有帮助。 2. "Mustache.js模板引擎使用 - 山外人家 - CSDN博客":这篇文章详细...

    深入浅出Struts2 包含了源码

    - **基础篇**:介绍Struts2的基本概念、安装和搭建开发环境,以及创建第一个Struts2应用。 - **核心机制**:深入探讨Struts2的Action、Result、Interceptor、OGNL等核心组件的工作原理。 - **配置篇**:解析XML...

    java学习网站大全

    - [ExtJs暴走教程(Grid篇)](http://www.hztraining.com/bbs/showtopic-449.aspx):专注于ExtJs中Grid组件的使用技巧。 #### 2. Java核心编程与设计模式 - **概述**:这部分内容聚焦于Java语言的基础语法、核心API...

    Springboot-Advanced:springboot高级篇系列整合

    《Springboot高级篇系列整合》是针对Java开发者深入学习Spring Boot框架的重要教程。Spring Boot以其简洁、快速的特性,已经成为现代Java开发中的主流选择。在这个高级篇中,我们将全面探讨Spring Boot的核心概念、...

    mybatis lib12.rar

    lxm.iteye.com/blog/1188579”指向了一个博客文章,虽然没有提供具体的内容,但我们可以猜测这篇文章可能介绍了如何使用这些库文件来配合MyBatis进行开发,或者探讨了MyBatis的某个特定功能或优化技巧。 从标签...

    深入浅出Struts 2 .pdf(原书扫描版) part 1

    第1章 Model 2应用程序 1 1.1 Model 2概览 1 1.2 带servlet控制器的Model 2 2 1.2.1 Product动作类 3 1.2.2 ControllerServlet类 4 1.2.3 视图 6 1.2.4 部署描述文件 8 1.2.5 示例程序的运行 9 1.3 带过滤器调度程序...

    Springboot开发学习路径目录大纲.zip

    4. **Spring Boot 入门**:安装并创建第一个 Spring Boot 项目,理解 starter POMs 和自动配置的概念。 二、进阶篇 1. **Spring Boot Web 开发**:学习如何使用 Spring Boot 构建 RESTful API,理解 Controller、...

    java手写SpringMvc框架

    手写Spring MVC框架的第一步是实现DispatcherServlet,它扮演着请求调度者的角色。我们需要重写doDispatch方法,这里会涉及到请求的拦截、匹配、转发等操作。同时,需要设计一个简单的注解系统,如@Controller、@...

    java单用户商城源码-Mobile-commerce-:学习SSM框架写的移动商城项目,详情可看ReadMe

    写这篇博文的目的也是为了总结一下在这次项目中学到了什么东西,除了上面这些知识点大纲,还有很多实用的小技巧: 项目可以分成后台模块、前台模块(没必要写在一起),如果前台模块崩了,不会影响到后台模块。有必要...

    code generate

    iteye.com 是一个知名的IT技术交流平台,博主老庄分享的内容很可能包含了他在使用代码生成工具时的经验、技巧或者是对某个代码生成工具有深入的分析。 标签“源码”表明讨论的内容可能涉及到代码生成与源代码管理、...

    A10018springboot网上书城书店源码.zip

    此外,对于学习者来说,理解并实践这个源码,不仅可以提升SpringBoot的使用技巧,还能了解电子商务系统的架构设计和开发流程,对提升自身技能有着极大的帮助。因此,深入研究并实战"A10018springboot网上书城书店...

    cursomc_SpringBoot

    本篇文章将深入探讨SpringBoot的核心特性、应用场景以及实战技巧。 一、SpringBoot概述 SpringBoot是由Pivotal团队提供的全新框架,其设计目标是简化新Spring应用的初始搭建以及开发过程。它集成了大量常用的第三...

Global site tag (gtag.js) - Google Analytics