[关闭]
@mrbourne 2017-03-15T01:03:35.000000Z 字数 3192 阅读 1547

Jfinal3 模板引擎

Jfinal


  1. <!--实验-->
  2. <!--静态变量访问-->
  3. #if(x.status == com.jfinal.clud.common.model.Account::STATUS_NORMAL)
  4. <span>正常</span>
  5. #end
  6. <!--静态方法点调用-->
  7. #if(com.jfinal.common.kit.StrKit::notBlank(title))
  8. ...
  9. #end
  10. <!--共享静态方法-->
  11. #if(isNotBlank(x.status))
  12. ...
  13. #end
  14. <!--空合与安全取值-->
  15. seoTitle ?? "Jfinal 社区"
  16. object.field ?? 空安全取值 object为null时不报异常,为null
  17. object.method ?? 空安全方法 object为null时不报异常
  18. object.field ?? "Jfinal"
  19. object.method ?? "null"
  20. <!--单引号字符串-->
  21. <a href="/" class="#(menu == 'index' ? 'current' : 'normal')">
  22. 首页
  23. </a>
  24. <!--相等于不等比较-->
  25. #if(nickName == "james")
  26. #end
  27. #if(nickName != "james")
  28. #end
  29. <!--布尔表达式增强-->
  30. #if(loginAccount && loginAccount.id == x.accountId)
  31. <a onclick="deleteReply(this, '/feedback/deleteReply?id=#(x.id)')">删除</a>
  32. #end
  33. <!--范围数组定义表达式-->
  34. #for(x : [1..10])
  35. #(x)
  36. #end
  37. <!--Map定义表达式-->
  38. #set(map = {k1: 123, "k2": "abc", 'k3': object})
  39. #(map.k1)
  40. #(map.k2)
  41. #(map["k1"])
  42. #(map["k2"])
  43. <!--逗号表达式-->
  44. #(1+1, 3*4)
  45. <!--核心指令-->
  46. #if
  47. #for
  48. #set
  49. #include
  50. #define
  51. #(...)
  52. <!--输出指令-->
  53. #(value)
  54. #(object.field) #-- 可能报异常--#
  55. #(object.field ??)
  56. #(a > b ? x : y)
  57. #(seoTitle ?? "Jfinal Club")
  58. #(obj.method, null) #-- 逗号表达式为最后一个表达式的值,这里是null 不做输出,这里相当于只是调用了obj.method()--#
  59. <!--if指令-->
  60. #if(cond)
  61. ...
  62. #end
  63. #if(c1)
  64. ...
  65. #elseif(c2)
  66. ...
  67. #elseif(c3)
  68. ...
  69. #else
  70. ...
  71. #end
  72. <!--for指令-->
  73. #for(x : list)
  74. #(x.field)
  75. #end
  76. #for(x : map)
  77. #(x.key)
  78. #(x.field)
  79. #end
  80. #for(x : listAaa)
  81. #(for.index) #-- 外层循环下标--#
  82. #(x.field)
  83. #for(x : listBbb)
  84. #(for.outer.index) #--外层(上一层)循环下标--#
  85. #(for.index) #--内层循环下标--#
  86. #(x.field)
  87. #end
  88. #end
  89. #for(x : listAaa)
  90. #(for.size)
  91. #(for.index) #--从0开始的下标值--#
  92. #(for.count) #--从1开始的计数值--#
  93. #(for.first) #--是否为第一次迭代--#
  94. #(for.last) #--是否为最后一次迭代--#
  95. #(for.odd) #--是否为奇数次迭代--#
  96. #(for.even) #--是否为偶数次迭代--#
  97. #(for.outer) #--引用上层for指令状态--#
  98. #end
  99. #for(blog : blogList)
  100. #(blog.title)
  101. #else #--迭代次数为0时--#
  102. 您还没写过博客
  103. #end
  104. #for(i = 0; i < 100; i++)
  105. #(i)
  106. #end
  107. <!--set指令-->
  108. #set(x = 123)
  109. #set(a = 1. b = 2, c = a + b)
  110. #set(array[0] = 125)
  111. #set(map.key = 456)
  112. #(x) #(a) #(array[0]) #(map.key)
  113. <!--include指令-->
  114. #include("../_inc/_sidebar.html")
  115. <!--define指令-->
  116. #define layout() #--定义了一个名为layout的模板函数--#
  117. <html>
  118. #@content() #--调用一个名为content的模板函数--#
  119. </html>
  120. #end
  121. #include("layout.html")
  122. #@layout #--调用layout.html中定义的layout()模板函数--#
  123. #define content()
  124. <div>这里是模板内容</div>
  125. #end
  126. #define test(a, b, c)
  127. #(a)
  128. #(b)
  129. #(b)
  130. #end
  131. #@test(123, "abc", user.name)
  132. <!--模板函数调用-->
  133. #@name?(p1,p2,p3) #--安全调用:当模板函数未定义或找不到时不做任何操作--#
  134. <!--实验 end-->

指令扩展

代码示例:

  1. public class Now extends Directive{
  2. @Override
  3. public void exec(Env env, Scope scope, Writer writer) {
  4. write(writer, new Date().toString());
  5. }
  6. }
  7. 使用前需要在configEngine中添加:
  8. me.addDirective("now", new Now()); //将指令添加到模板引擎
  9. 今天的日期是 #now
  1. public class Demo extends Directive{
  2. //ExprList 代表指令参数表达式列表
  3. @Override
  4. public void setExprList(ExprList exprList) {
  5. super.setExprList(exprList);
  6. //这里可以对 exprlist进行个性化控制
  7. }
  8. @Override
  9. public void exec(Env env, Scope scope, Writer writer) {
  10. write(writer, "body执行前");
  11. stat.exec(env, scope, writer); //执行body
  12. write(writer, "body执行后");
  13. }
  14. @Override
  15. public boolean hasEnd() {
  16. return true;
  17. }
  18. }
  19. 一样使用前需要 configEngine中添加:
  20. me.addDirective("demo", new Demo());
  21. 使用时:
  22. #demo()
  23. 这里是body
  24. #end
  25. 结果:
  26. body执行前
  27. 这里是body
  28. body执行后

通过普通Java类扩展

  1. engine.addSharedMethod(new com.jfinal.kit.StrKit());

调用

  1. #if(isBlank(nickName))
  2. ...
  3. #end

通过共享对象扩展

  1. public void configEngine(Engine engine){
  2. engine.addSharedObject("RESOURCE_HOST", "http://res.jfinal.com");
  3. engine.addSharedObjcet("sk", new com.jfinal.kit.StrKit());
  4. }

使用

  1. <img src="#(RESOURCE_HOST)/img/hannah.jpg/>"
  2. #if(sk.isBlank(title))
  3. ...
  4. #end

注释

  1. ### 这里是单行注释
  2. #--
  3. 这里是多行注释
  4. 这里是多行注释
  5. --#

不被解析的纯文本

  1. #[[
  2. #(value)
  3. #for(i : [1..10])
  4. ]]#

可以直接输出以上的代码

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注