Enjoy模板引擎和define指令的使用

  • Post author:
  • Post category:其他


趁着十一,使用

JFinal

改写项目。比起spring来,JFinal简单好用一点,对我的项目,没发现什么不适的地方,

推荐使用



重点推荐一下JFinal的Enjoy模板引擎,真心好使!官网在这里:

http://www.jfinal.com

,相关文档和资源可以去官网下载,也可以在

JFinal和Enjoy相关文档

下载,下面不对具体语法进行说明,自己去看文档,说得很明白,例子也很多。

Enjoy可以本地渲染,非常简单方便,先看一下例子。

程序为:

Engine engine = Engine.use();

List<String> list = new ArrayList<>();
list.add("item1");
list.add("item2");
list.add("item3");
// list={"item1", "item2", "item3"}

Map map = new LinkedHashMap();
map.put("key1", "value1");
map.put("key2", "value2");
map.put("key3", "value3");
// map={"key1": "value1", "key2": "value2", "key3": "value3"}

Map data = new HashMap();
data.put("map", map);
data.put("list", list);

String txt = engine.getTemplate("D:/template.txt").renderToString(data);
System.out.println(txt);

模板

template.txt

为:

#for(x : list)
    #(for.index) : #(x)
#end

#for(x : map)
    #(x.key) : #(x.value)
#end

渲染结果为:

0 : item1
1 : item2
2 : item3

key1 : value1
key2 : value2
key3 : value3

可以看出,Enjoy的语法确实很容易学会,基本看一遍就会用。

有一个好用的指令,

define

指令。主要用于定义模板函数,简单说就是定义函数,将网页排版变为函数调用。举个例子说明一下:

#for(x : [1..10])
    #(x)
#end

这个的渲染结果是:

1
2
3
4
5
6
7
8
9
10

可以将这个模板定义为一个函数,是这样的:

#define print_num()
    ### 下面一行的代码等效于 for(x=1;x<=10;x++)
    #for(x : [1..10])
        #(x)
    #end
#end

调用方式非常简单,语法如下:

#@print_num?()

这样,在函数里面可以做很多事情,比如打印网页的头文件等,只需要一行代码就可以。当然,这和include有点相似。既然是函数,那就可以传入参数,升级如下:

#define print_num(n)
    ### 下面一行的代码等效于 for(x=1;x<=n;x++)
    #for(x : [1..n])
        #(x)
    #end
#end

比如,调用

#@print_num?(3)

渲染为:

1
2
3

这样就有点意思了。

于是,我想到之前一个头疼的问题,需要在每个页面中引入不同的

css

文件和

js

文件,比如,有个页面需要引入

bootstrap-table

的相关文件:

<link href="vendor/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" type="text/css">
<script src="vendor/bootstrap-table/bootstrap-table.min.js"></script>

不同页面引入的

css



js

文件不同,一旦这些文件的路径改了,页面中对应的路径都需要改,这样就很不好,使用

define

可以这样实现:

#define import_bootstrap_select()
  <link href="#(ctx)/vendor/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" type="text/css">
  <script src="#(ctx)/vendor/bootstrap-table/bootstrap-table.min.js"></script>
#end

只需要在需要用的页面中写上

#@import_bootstrap_select?()

即可。但是这样,需要为不同的文件,写不同的模板函数。于是可以这样写:

#define css(name)
  #if("bootstrap-table".equals(name))
    <link href="#(ctx)/vendor/bootstrap-table/bootstrap-table.min.css" rel="stylesheet" type="text/css">
  #elseif("其他name".equals(name))
    ### 其他css文件
  #end
#end

#define js(name)
  #if("bootstrap-table".equals(name))
    <script src="#(ctx)/vendor/bootstrap-table/bootstrap-table.min.js"></script>
  #elseif("其他name".equals(name))
    ### 其他js文件
  #end
#end

使用方式变为:

  #@css?("bootstrap-table")
  #@js?("bootstrap-table")

似乎也没有简单,算是灵活了吧><



版权声明:本文为zhaohuakai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。