相关文章推荐
想旅行的鸵鸟  ·  ResHacker与eXeScope ...·  1 年前    · 
高兴的鸭蛋  ·  Spark ...·  1 年前    · 

学习Java模版引擎FreeMarker截至到现在20个小时,记录一下整个学习过程,发现学习中的问题,同时留下对FreeMarker最初时的认知,待假以时日项目组的数据和视图层分离使用FreeMarker的时侯不至于因为时间长了不知从何开始,又要重新走一步Hello FreeMarker的过程,又能够温故知新发现更多,更奇妙的东西。

j_0001.gif Hello FreeMarker

1.百度百科:FreeMarker http://baike.baidu.com/link?url=204dZtLs4TQhVPp2V_gFfJrv9EzewLu3R4AXHOWIhr9CLxbgnxu0AewyWDmoxWhqGtNH0Dk9PlF-Wpd-rLPpwa

很牛,很强大,能做表现出,也能当工具使,Java语言编写的模版引擎且对Web容器无与依赖性。

2.找一篇博文看看Iteye 曾Java著名社区

http://relive123-yahoo-com-cn.iteye.com/blog/818013

基本了解FreeMarker基本写法,功能特性,怎么弄个Hello FreeMarker出来

3.出自何门何派,官方网站走一圈

http://freemarker.org/index.html

惊喜,有部分中文文档,窃喜,英文文档也很清晰可读。

4.尝试我的Hello FreeMarker

新建一个web工程,将freemarker.jar放置lib(classpath)目录

配置web.xml文件,配置方式和普通的Servlet配置相同

数据模型有简单数据类型,Sequence类型(Java的List,Array),Hasher类型(Map, Bean等),总体概况数据模型是一棵树,保证数据以树的形式组织,从而就有个root的概念

实际使用过程中遇到的问题有很好的页面异常信息显示,并仔细阅读文档都可以解决,注意留心每一个条目说明后的Note信息

特性丰富:内置的特性strings,numbers,booleans,dates等;指令特性声明,导入,包含,循环,判断,分支,功能函数,表达式等高频率使用

最后一条,学习一个没有接触过的东西,还是从Hello XX开始是一个良好的起端,另外与其在网上找各种帖子,代码段学习不如试试这三步,末了看看官方文档初学遇到的问题基本都有清晰的说明并且能够发现更多的东西。

解决:官方文档中有TemplateMethodModel接口配合源代码模仿一个判断字符串A是否包含字符串B的方法

接口TemplateMethodModel继承TemplateModel接口;

接口TemplateMethodModelEx继承了TemplateMethodModel接口;

TemplateMethodModelEx接口的实现中有一个类是:SimpleMethodModel看看他的源码就豁然开朗知道如何去实现我们自己的SimpleMethodIsContainsModel类。

Map<String, SimpleMethodIsContainsModel> root = new HashMap<String, SimpleMethodIsContainsModel>(); root.put( "iscontains" , new SimpleMethodIsContainsModel()); try { template.process(root, response.getWriter()); } catch (TemplateException e) { e.printStackTrace(); public void init() throws ServletException { try { template = FreeMarkerTemplateFactory.getConfiguration( this .getServletContext(), "/" ).getTemplate( "block2.ftl" ); } catch (IOException e) { e.printStackTrace();

运行之后报一大堆错误,摘取前部分重点信息,可以看出模版中的部分信息输出,计算后的结果没有输出。

上面这段异常提示信息的信息量足够大,这也是个人感觉FreeMarker很牛的一点。

isContains方法的返回值是boolean类型,FreeMarker template不具备boolean自动转string;

不能转还不能说FreeMarker template能力不行,接下来他给的解释说 boolean_format设置为true,false,恰好这是他默认的计算语言格式,这么一说就不能怪他了;

还没完,他给了两个处理建议,一个是解决当前问题,另一个是解决此类转换的方法,更人性化的是他还给了如何写的例子,如:${myboolean?string('yes','no');

至此,还有惊喜的是FreeMarker Template异常提示的位置相当精确,而且还具备从哪里开始错就在哪那里开始报的优秀品质。

修改后的模版信息:

面试官:@Configuration 和 @Component 注解的区别?大部分人都会答错!
面试官:@Configuration 和 @Component 注解的区别?大部分人都会答错!
#yyds干货盘点 【React工作记录十一】控制ant design中form的必填项判断
#yyds干货盘点 【React工作记录十一】控制ant design中form的必填项判断
#yyds干货盘点 【React工作记录十一】控制ant design中form的必填项判断
#yyds干货盘点 【React工作记录十一】控制ant design中form的必填项判断
17、SpringBoot2.0中初始化数据和不校验 html 标签(十七)
我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC 。两种方式各有区别下面来详细介绍。
解决方案:Springboot+Vue3+Mybatis+Axios 前后端分离项目中 遇见的若干报错和踩坑避坑(二)
解决方案:Springboot+Vue3+Mybatis+Axios 前后端分离项目中 遇见的若干报错和踩坑避坑(二)
解决方案:Springboot+Vue3+Mybatis+Axios 前后端分离项目中 遇见的若干报错和踩坑避坑(一)
Springboot+Vue3+Mybatis+Axios 前后端分离项目中 遇见的若干报错和踩坑避坑
SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】
【Example】C++ Template (模板)概念讲解及编译避坑
C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。 先讲 “部分的” 泛型编程概念的实现方式:模板。