@mrbourne
2017-03-15T09:03:35.000000Z
字数 3192
阅读 1719
Jfinal
<!--实验-->
<!--静态变量访问-->
#if(x.status == com.jfinal.clud.common.model.Account::STATUS_NORMAL)
<span>正常</span>
#end
<!--静态方法点调用-->
#if(com.jfinal.common.kit.StrKit::notBlank(title))
...
#end
<!--共享静态方法-->
#if(isNotBlank(x.status))
...
#end
<!--空合与安全取值-->
seoTitle ?? "Jfinal 社区"
object.field ?? 空安全取值 object为null时不报异常,为null
object.method ?? 空安全方法 object为null时不报异常
object.field ?? "Jfinal"
object.method ?? "null"
<!--单引号字符串-->
<a href="/" class="#(menu == 'index' ? 'current' : 'normal')">
首页
</a>
<!--相等于不等比较-->
#if(nickName == "james")
#end
#if(nickName != "james")
#end
<!--布尔表达式增强-->
#if(loginAccount && loginAccount.id == x.accountId)
<a onclick="deleteReply(this, '/feedback/deleteReply?id=#(x.id)')">删除</a>
#end
<!--范围数组定义表达式-->
#for(x : [1..10])
#(x)
#end
<!--Map定义表达式-->
#set(map = {k1: 123, "k2": "abc", 'k3': object})
#(map.k1)
#(map.k2)
#(map["k1"])
#(map["k2"])
<!--逗号表达式-->
#(1+1, 3*4)
<!--核心指令-->
#if
#for
#set
#include
#define
#(...)
<!--输出指令-->
#(value)
#(object.field) #-- 可能报异常--#
#(object.field ??)
#(a > b ? x : y)
#(seoTitle ?? "Jfinal Club")
#(obj.method, null) #-- 逗号表达式为最后一个表达式的值,这里是null 不做输出,这里相当于只是调用了obj.method()--#
<!--if指令-->
#if(cond)
...
#end
#if(c1)
...
#elseif(c2)
...
#elseif(c3)
...
#else
...
#end
<!--for指令-->
#for(x : list)
#(x.field)
#end
#for(x : map)
#(x.key)
#(x.field)
#end
#for(x : listAaa)
#(for.index) #-- 外层循环下标--#
#(x.field)
#for(x : listBbb)
#(for.outer.index) #--外层(上一层)循环下标--#
#(for.index) #--内层循环下标--#
#(x.field)
#end
#end
#for(x : listAaa)
#(for.size)
#(for.index) #--从0开始的下标值--#
#(for.count) #--从1开始的计数值--#
#(for.first) #--是否为第一次迭代--#
#(for.last) #--是否为最后一次迭代--#
#(for.odd) #--是否为奇数次迭代--#
#(for.even) #--是否为偶数次迭代--#
#(for.outer) #--引用上层for指令状态--#
#end
#for(blog : blogList)
#(blog.title)
#else #--迭代次数为0时--#
您还没写过博客
#end
#for(i = 0; i < 100; i++)
#(i)
#end
<!--set指令-->
#set(x = 123)
#set(a = 1. b = 2, c = a + b)
#set(array[0] = 125)
#set(map.key = 456)
#(x) #(a) #(array[0]) #(map.key)
<!--include指令-->
#include("../_inc/_sidebar.html")
<!--define指令-->
#define layout() #--定义了一个名为layout的模板函数--#
<html>
#@content() #--调用一个名为content的模板函数--#
</html>
#end
#include("layout.html")
#@layout #--调用layout.html中定义的layout()模板函数--#
#define content()
<div>这里是模板内容</div>
#end
#define test(a, b, c)
#(a)
#(b)
#(b)
#end
#@test(123, "abc", user.name)
<!--模板函数调用-->
#@name?(p1,p2,p3) #--安全调用:当模板函数未定义或找不到时不做任何操作--#
<!--实验 end-->
代码示例:
public class Now extends Directive{
@Override
public void exec(Env env, Scope scope, Writer writer) {
write(writer, new Date().toString());
}
}
使用前需要在configEngine中添加:
me.addDirective("now", new Now()); //将指令添加到模板引擎
今天的日期是 #now
public class Demo extends Directive{
//ExprList 代表指令参数表达式列表
@Override
public void setExprList(ExprList exprList) {
super.setExprList(exprList);
//这里可以对 exprlist进行个性化控制
}
@Override
public void exec(Env env, Scope scope, Writer writer) {
write(writer, "body执行前");
stat.exec(env, scope, writer); //执行body
write(writer, "body执行后");
}
@Override
public boolean hasEnd() {
return true;
}
}
一样使用前需要 configEngine中添加:
me.addDirective("demo", new Demo());
使用时:
#demo()
这里是body
#end
结果:
body执行前
这里是body
body执行后
engine.addSharedMethod(new com.jfinal.kit.StrKit());
调用
#if(isBlank(nickName))
...
#end
public void configEngine(Engine engine){
engine.addSharedObject("RESOURCE_HOST", "http://res.jfinal.com");
engine.addSharedObjcet("sk", new com.jfinal.kit.StrKit());
}
使用
<img src="#(RESOURCE_HOST)/img/hannah.jpg/>"
#if(sk.isBlank(title))
...
#end
### 这里是单行注释
#--
这里是多行注释
这里是多行注释
--#
#[[
#(value)
#for(i : [1..10])
]]#
可以直接输出以上的代码