首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

freemarker模板解析-典型的访问者方式和解释器模式

2013-03-17 
freemarker模板解析----典型的访问者模式和解释器模式折腾这篇文章也快一个小时了,转载请注明出处http://b

freemarker模板解析----典型的访问者模式和解释器模式

折腾这篇文章也快一个小时了,转载请注明出处http://blog.csdn.net/zhouyuqwert/article/details/8682535freemarker模板解析-典型的访问者方式和解释器模式


最近因为一些需要,稍微学了下freemarker,基本使用算了解了,本以为模板解析方式同JSP相同,会先解析生成Servlet

再仔细看了下源码,发现还是很大不同的,虽然最终也是解析成HTML,response.write出去,中间思路看了下还是很不错的。

主要用到访问者模式和解释器模式结合来解析freemarker中的表达式,并分别赋值。

先来看看什么是访问者模式,什么是解释器模式,再来分析下freemarker如何使用的。


1.访问者模式根据GoF描述,主要在为基本固定的一些元素更方便地添加操作的,将数据结构与其操作解耦和。freemarker模板解析-典型的访问者方式和解释器模式
譬如针对二叉树的遍历时,二叉树节点类型为Element,当访问到这个节点对象时,需要输出操作,即可以将该操作定义到Visitor中,这样做的好处是,我不用关心是哪个操作,由visitor来定义,当是前序遍历时,传入ConcreteVisitor1来进行一些操作,当是后序遍历时传入ConcreteVisitor2来进行另外一些操作,而且今后如果还要对中序遍历每个节点要有不同操作,只需增加一个相应操作的ConcreteVisitor3来完成,无需修改Element的类,将无关操作放在了外面。
2.解释器模式给定一个语言,定义文法的一种表示,定义一个解释器,使用该表示解释语言中的句子。

freemarker模板解析-典型的访问者方式和解释器模式

如果还记得以前解释器如何写的,看到这个东西应该不陌生了,看起来这个结构跟装饰模式很像,但还是有些差别的,要解释的话得说下Context,Context主要维护着上下文值的关系,也就是文法表达式中终结符的值。譬如一个freemarker表达式 <body> ${hello} </body>,会被解析成三个部分,分别是<body>${hello}</body>前面和后面的body标签,自不用解释了,在freemarker中被定义为TextBlock,中间的变量定义为DollarVariable那么目前的结构也就是RootExpression = TextBlock DollarVariable TextBlockRootExpression也就是NonterminalExpression,后面的三个都是TerminalExpression解释器一进来将会对RootExpression进行解析,RootExpression将会依次调用TextBlock DollarVariable TextBlock的interpret进行解析不同类型将会做不同操作,根据传进来的Context参数进行相应赋值并输出等
3.freemarker解析模板简单画了个主要的类图及方法,然后再根据类图做相关解释freemarker模板解析-典型的访问者方式和解释器模式

这里的Environment在同时扮演着解释器模式的Context,访问者模式的Visitor和ObjectStructure。当Template启动解释时,由Environment进入调用根元素的访问动作,根元素会依次访问所包含的TemplateElement,直到所有叶子节点访问完成,这些访问动作是通过调用Environment的visit方法控制,Environment做些相关必要操作,再根据访问的节点类型调用相应节点的访问操作。当访问到包含需要解释器的元素节点时,则会启动解释器做解释操作,根据维护的文法Expression类型,调用getStringValue,并传入参数Environment,相应类型的表达式根据Environment解释得到输入字符串的值,返回并写到响应流,即解释完成。


freemarker模板解析-典型的访问者方式和解释器模式
freemarker模板解析-典型的访问者方式和解释器模式

热点排行