§标签 Tag
jetbrick-template 支持用户自定义模板标签 Tag,功能类似于 JSP Taglib,但是要比 JSP Taglib 更简单更好用。
比如下面的代码范例:
#tag cache("CACHE-ME-30-MIN", 30*60)
今天天气: ${WeatherUtils::getAsHtml()}
#end
这个例子演示了一个自定义的 cache tag,允许将天气结果缓存上 30 分钟,而不是每次都重新获取天气信息。
§1. 定义标签 Tag
每一个 Tag 由 Java 中的一个静态方法实现。
语法:
public static void tag_name ( JetTagContext ctx, args ... )
- 方法签名必须是
publicstatic - 方法返回值必须是
void - 方法第一个参数必须是
JetTagContext, 其余参数自定义 - 允许 throws 任意的
Throwable - 允许定义相同名字的 Tag,但是方法参数不一样 (Overload)
- 支持可变参数 (VarArgs)
示例:
package jetbrick.demo;
public class MyTags {
private static final TimedSizeCache cache = new TimedSizeCache(128);
public static void cache(JetTagContext ctx, String name, int timeout) throws IOException {
Object value = cache.get(name);
if (value == null) {
value = ctx.getBodyContent();
cache.put(name, value, timeout);
}
ctx.getWriter().print(value.toString());
}
}
§2. 注册标签 Tag
用户自定义的 Tag 必须注册到 JetEngine 中才能使用。注册 Tag 有 3 种途径:
API 动态注册
JetEngine engine = ... GlobalResolver resolver = engine.getGlobalResolver(); resolver.registerTags(MyTags.class);在配置文件中注册 jetbrick-template.properties
jetx.import.tags = jetbrick.demo.MyTags自动扫描注册
配置扫描路径
jetx.autoscan.packages = jetbrick.demo为 Class 增加扫描
@JetAnnotations.Tags@JetAnnotations.Tags public class MyTags { ... }
§3. JetTagContext 的使用
Tag 的实现第一个参数是 JetTagContext,它包含了 Tag 运行时的上下文。
主要 API:
JetEngine getEngine()获取 JetEngine
InterpretContext getInterpretContext()获取 InterpretContext
void invoke()在当前位置输出
#tag ... #end之间的内容String getBodyContent()执行并捕获
#tag ... #end之间的内容 (不输出)
§4. 模板已经内置的标签 Buildin Tags
所有 Tags 都定义在下面的 2 个 Class 中
jetbrick.template.runtime.buildin.JetTagsjetbrick.template.web.buildin.JetTags
§4.1 Layout 布局相关
#tag layout_block(String name)...#end将块内容保存到变量名为 name 的 Context 中。
#tag layout_block_default(String name)...#end如果不存在指定 name 的 context 变量,那么输出 body 内容,否则输出指定的 context 变量内容。
§4.2 Web 缓存相关 (需要 jetbrick-template-web)
#tag application_cache(String name, long timeout)...#end将内存缓存到 ServletContext 中,在 timeout 秒之后自动超时。
#tag session_cache(String name, long timeout)...#end将内存缓存到 HttpSession 中,在 timeout 秒之后自动超时。