功能更新
[新增] #38 增加默认的 #tag cache() 实现模板局部缓存功能
[新增] #49 增加模板预编译工具/选项
[新增] #54 增加安全管理器:黑白名单
[新增] #62 在 Web 环境中使用 jetx 时候,建议增加一个隐藏变量
[新增] #63 对 Array/List/Map 的 [] 访问,增加安全调用
[新增] #64 Spell error in JetAnnoations Class name, Should be JetAnnotations.
[新增] #65 给 #for 指令内部对象增加 for.odd 和 for.even 支持.
模板的预编译选项
原来有个编译参数 compile.always
是用来控制在首次访问的时候,是强制进行编译还是从上次编译的结果直接load编译好的class。
而新版本则更进一步,提供了更加灵活的编译策略,目前有 4 种可以选择:
1 | compile.strategy = precompile |
2 | compile.strategy = always |
compile.always
已作废。
-
precompile
在 JetEngine 初始化的时候,自动获取所有的模板(根据 template.suffix
过滤),然后启动一个独立的线程进行编译。
这样虽然启动时间会增加,但是后面的模板访问将会非常的快。并且在预编译没有完成期间,应用可以正常访问,不冲突。
-
always
(默认值)
和原先的 compile.always = true
等价。
就是在模板被首次访问的时候,进行编译。
-
auto
和原先的 compile.always = false
等价。
就是在模板被首次访问的时候,如果磁盘中已经存在编译好的 Class 文件(并且源文件没有改变),那么直接加载该 Class 文件,否则进行编译。
-
none
改模式下,将不在对模板进行编译。(发布的时候,用户无需发布任何模板源文件)
用户必须通过 JetxGenerateApp 预编译工具,事先将模板全部编译成 class 文件,并将所有的 class 文件放在 classpath 下面。
注意: class 文件放在 classpath 下面,而不是 compile.path
对应的目录。
注意:
不管采用什么模式,对于使用 JetEngine.createTemplate(source)
直接由源码创建的模板,仍然需要进行编译。
JetxGenerateApp 预编译工具
用户可以在外部通过命令行调用,将所有的模板进行预编译,这样生产环境可以直接使用预编译好的 Class 文件,减少首次访问时候的延迟。
01 | shell # java -jar jetbrick-template-<version>.jar \ |
03 | -src /webapp/templates \ |
04 | -d /webapp/generatedClasses \ |
05 | -config /webapp/WEB-INF/jetbrick-template.properties |
08 | -all: compile all templates even if errors |
09 | -src <path>: template root directory |
10 | -d <path>: output directory |
11 | -config <file>: config file |
预编译完成后,请设置 compile.strategy = none
。
安全管理器:黑白名单
安全管理器主要用于对模板中调用类,方法和访问字段进行安全管理。主要用于类似于 CMS 系统中,需要用户自定义模板的时候时候,防止用户访问未经授权的内容。
安全管理器默认通过一个黑白名单列表来实现。黑白名单可以放在一个单独的文本文件中,也可以直接放在配置文件中。用户也可以实现自定义的安全管理器。
安全管理器默认禁用,如需使用,需要如下的配置:
1 | security.manager = jetbrick.template.parser.JetSecurityManagerImpl |
2 | security.manager.file = ${webapp.dir}/WEB-INF/jetx-white-black-list.txt |
jetx-white-black-list.txt
范例内容如下:
提示:
安全管理器只在对模板进行解析编译的时候进行,运行期不会影响任何性能。
新增 ctxpath/webroot 全部变量和函数
其中 2 个变量:
ctxpath == request.getContextPath()
webroot == http:// : + request.getContextPath()
同时支持函数方式调用:
如:
1 | ${ctxpath( "/index.jetx" )} |
2 | ${webroot( "/index.jetx" )} |
增加 #tag cache 实现缓存模板片段
01 | #tag application_cache( "NEWS_LIST" , 60 * 60 ) |
03 | # for (News news: @NewsMgmt .getAll()) |
04 | <li><a href= "news/${news.id}" >$!{news.title}</a></li> |
09 | #tag session_cache( "LOGIN_INFO" , 5 * 60 ) |
10 | Welcome ${loginedUser.name}, |
11 | Logined at ${loginedUser.lastdate} |
以上新闻信息会被自动缓存 1 小时, 而用户的登录信息会缓存 5 分钟。
如果需要临时清楚缓存,可以通过如下代码:
2 | TimedSizeCache cache = (TimedSizeCache) servletContext.getAttribute(TimedSizeCache.CACHE_KEY); |
3 | cache.remove( "NEWS_LIST" ); |
6 | TimedSizeCache cache = (TimedSizeCache) session.getAttribute(TimedSizeCache.CACHE_KEY); |
7 | cache.remove( "LOGIN_INFO" ); |
新增 for.odd, for.even
据需增强 for 循环状态对象。
1 | # for (User user: userlist) |
对 Array/List/Map 的 [] 访问,增加安全调用
现在支持如下调用拉