jetbrick-template-1.x 旧版文档请看这里:http://subchen.github.io/jetbrick-template/1x/

§扩展方法 Methods

我们知道一个 Java Class 的 所有 methods 都是定义在同一个 class 文件中的,不能在其他地方进行动态扩展。但是一些其他动态语言却支持在 Class 外部为这个 Class 增加一些方法。比如:

jetbrick-template 也在这里带给大家强大的动态方法扩展机制。如:

注意:如果 Class 已经定义了同名方法,则优先使用 Class 定义的方法。但是扩展方法支持方法重载 (Overrload)。

§1. 定义扩展方法

语法:

public static Object method_name ( Object object, args ... )

示例:对 String.class 进行扩展

package jetbrick.demo;

public class StringMethods {

    public static String link(String text, String url) {
        return "<a href=\"" + url + "\">" + text + "</a>";
    }
}

§2. 注册扩展方法

用户自定义的扩展方法必须注册到 JetEngine 中才能使用。注册方法有 3 种途径:

§3. 在模板中使用扩展方法

模板:

${"BAIDU".link("http://www.baidu.com/")}

输出结果:

<a href="http://www.baidu.com/">BAIDU</a>

§4. 在扩展方法中获取 InterpretContext 上下文

要获取 InterpretContext 对象,可以通过 InterpretContext.current() 方法获取当前 Thread local context 关联的 InterpretContext 对象。

@JetAnnotations.Methods
public class UserInfoMethods {

    public static String isOnline(UserInfo user) {
        InterpretContext ctx = InterpretContext.current();
        HttpSession session = (HttpSession) ctx.getValueStack().getValue(JetWebContext.SESSION);
        return session.getAttribute("user_" + user.getId()) != null;
    }
}

模板范例:

#define(UserInfo user)
${user.isOnline()}

§5. 模板已经内置的扩展方法 Buildin Methods

所有内置的扩展方法都定义在 jetbrick.template.runtime.buildin.JetMethods

§基本数据类型转换 Cast

§数据格式化 Format

§数据 Escape/Unescape

§JSON 输出

§字符串转换