playframework 模板工作原理简要分析

playframework 的模板类似Velocity,FreeMarker和JSP ,但是这是play自己基于groovy实现的一套模板语言,大体原理如下,

 1:    模板文件 --->Parse--->groovy 类文件--->编译--->binary--->添加到cache 

 2:    从cache中取到 compiledTemplate  ,和args一起创建 ExecutableTemplate 实例

ExecutableTemplate t = (ExecutableTemplate) InvokerHelper.createScript(compiledTemplate, binding);

        执行 ExecutableTemplate.run 得到html代码 

  核心是定制Parse的规则(语法)。    这部分对字符串的处理和数据结构要求挺高的,反正我是没有看懂,想弄懂需要花费不少的时间。

  @{package.controller.method(parm...)}  的用法也算是非常方便。

    ${vo.name}   表达式 

    #{if}  #{elseif}   #{else}

    #{ifnot}

    #{set}

    #{list}

    #{extends}

    #{tagname /}

    #{verbatim}

    #{cache}      从cache 获取一个值 比如当前人数,不用写额外的java代码即可展示。

    #{authenticityToken}   在表单中隐藏一个token 

    #{ifError phoneNumber}    可以用来判断表单中的某项的填写是否有误

    #{serialize}     序列化呈现一个Object

说实话不看FastTags这个类,真的不知道还有这么多用法。  

play模板中可以直接引用的对象(相对比的Jsp的九大内置对象)

playframework 模板工作原理简要分析

 

 ${session.getId()}         ${play.version}

 

何苦从session中取值,再render给模板呢

 

 

相同的玩法  JSP --------------------->  JspServlet 

playframework 模板工作原理简要分析

servlet  中也是不断的out.println() ;

playframework 模板工作原理简要分析

 

 

如何定制扩展方法。(和freemark的内建函数比起来,的确是少得可怜)

play 自带的扩展方法有  (所有方法在JavaExtensions.java中)

format ,  日期格式化。

since ,计算一个日期距今过了多长时间。

page , 计算总共有多少页

urlEncode

divisibleBy   是否整除

capFirst   首字母大写

camelCase   驼峰表示

asdate   时间戳转日期

 

自定义一个方法截取字符串的前n位。

playframework 模板工作原理简要分析

 

模板 + args  ===>   html 代码              ------------> Netty 响应

假定 最终的html的大小为100K ,1G内存最多能存储10000个

 

 

htmlEscape 是个啥操作!!!  绑定表达式时都执行这个方法

playframework 模板工作原理简要分析

 

actionBridge  完成如下的转换功能。 

@{manage.LearnerController.addedulearner(vo.id)}

manage/learnercontroller/addedulearner?id=40

 注意大写全部转换成了小写

 

 

转载于:https://my.oschina.net/qidis/blog/2236712