1. 程式人生 > >Enjoy模板引擎和define指令的使用

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

趁著十一,使用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>

不同頁面引入的cssjs檔案不同,一旦這些檔案的路徑改了,頁面中對應的路徑都需要改,這樣就很不好,使用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")

似乎也沒有簡單,算是靈活了吧><