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的九大内置对象)
${session.getId()} ${play.version}
何苦从session中取值,再render给模板呢
相同的玩法 JSP ---------------------> JspServlet
servlet 中也是不断的out.println() ;
如何定制扩展方法。(和freemark的内建函数比起来,的确是少得可怜)
play 自带的扩展方法有 (所有方法在JavaExtensions.java中)
format , 日期格式化。
since ,计算一个日期距今过了多长时间。
page , 计算总共有多少页
urlEncode
divisibleBy 是否整除
capFirst 首字母大写
camelCase 驼峰表示
asdate 时间戳转日期
自定义一个方法截取字符串的前n位。
模板 + args ===> html 代码 ------------> Netty 响应
假定 最终的html的大小为100K ,1G内存最多能存储10000个
htmlEscape 是个啥操作!!! 绑定表达式时都执行这个方法
actionBridge 完成如下的转换功能。
@{manage.LearnerController.addedulearner(vo.id)}
manage/learnercontroller/addedulearner?id=40
注意大写全部转换成了小写
转载于:https://my.oschina.net/qidis/blog/2236712