趁着十一,使用JFinal改写项目。比起spring来,JFinal简单好用一点,对我的项目,没发现什么不适的地方,推荐使用。
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")
似乎也没有简单,算是灵活了吧><