JFinal 集成 Beetl 静态模板

原创 jfinalbeetl

有人说 Beetl 模板框架比 Freemarker 模板还要快,至于到底怎么样,目前还没有感觉到,不管那么多了,上手再说。

首先需要下载 beetl 包:Beetl模板路径

Beetl 提供 JFinal 框架的集成,使用 BeetRenderFactory 类,通过如下代码注册即可完成集成:

@Override
public void configConstant(Constants me) {
    loadPropertyFile("jdbc.properties");
    //配置模板
    me.setMainRenderFactory(new MyBeetlRenderFactory());
    //获取GroupTemplate模板,可以设置共享变量操作
    GroupTemplate groupTemplate=MyBeetlRenderFactory.groupTemplate;
    me.setDevMode(getPropertyToBoolean("config.devModel", false));
    me.setViewType(ViewType.JSP);
    me.setEncoding("UTF-8");
}

该方法的作用为 JFinal 框架中常量配置方法,这里我自定义的 MyBeetlRenderFactory 类继承于 BeetlRenderFactory,如下:

import org.beetl.ext.jfinal.BeetlRender;
import org.beetl.ext.jfinal.BeetlRenderFactory;
import com.jfinal.render.Render;
public class MyBeetlRenderFactory extends BeetlRenderFactory{
    @Override
    public Render getRender(String view) {
        BeetlRender render=new BeetlRender(groupTemplate, view);
        return render;
    }
    @Override
    public String getViewExtension() {
        return ".html";
    }
}

由于 BeetRenderFactory 默认使用的 FileResourceLoader,其根目录位于 WebRoot 下,如果需要修改其他目录下,需要在 src 下创建一个 beetl.properties 的属性文件,在该文件中配置如下代码:

RESOURCE.root=/WEB-INF/view

因为 Beetl 默认的配置文件在 org/beetl/core/beetl-default.properties,Beetl 启动时会通过 Configuration 类加载,然后再加载 classpath 中的 beetl.properties,如果自己创建的 beetl.properties 文件,那么回后者会将前者覆盖

到这里呢,Jfinal 集成 Beetl 模板就算完成了,接下来看下实现的效果,如下:

public void index(){
    List<Users> testList=Users.dao.find("select * from users");
    setAttr("testList", testList);
    render("login.html");
}

这里我输出的是 login.html 页面,该页面在 WEB-INF/view 中,看着是不是很方便,如果不自己配置 beetl.properties 文件,那么 render 这个地方就需要写 WEB-INF/view/login.html,一个项目中肯定有很多页面,如果不配置 beetl.properties 文件,每个输出到界面的页面都要使用完整的路径,就会觉得是一件特麻烦的事,配置 beetl.peoperties文件就减少了重复的工作

上面也看到了,这里我输出的是一个集合,那么使用 Beetl 模板怎么对集合进行遍历呢,很简单,如下:

<%for(test in testList){%>
    <tr>
        <td>${testLP.index}</td>
        <td>${test.id}</td>
        <td>${test.username!''}</td>
    </tr>
<%}%>

看到这样的输出,是不是有种熟悉的感觉,对了,与 jsp 的小脚本差不多的标签,但是还是不要搞混了

大家可能也看到了 testLp 这个变量,该变量是 beetl 隐含定义的变量,能在循环体内使用,其命名规范是 item 加上 LP 能提供当前循环的信息,如:

  • testLP.index;当前的索引,从1开始
  • testLP.size;集合的长度
  • testLP.first;是否是第一个
  • testLP.last;是否是最后一个
  • testLP.even;是否是偶数个
  • testLP.odd;是否是奇数个

在 Beetl 模板中对循环操作不止上面一个,上面的 for 循环的形式是 for-in,接下来还有:

  • for(exp;exp;exp)
  • while
  • elsefor

使用如下:

for(exp;exp;exp)

<%for(var i=0;i<testList.~size;i++){%>
    <tr>
        <td>${testList.~size}</td>
        <td>${testList[i].id}</td>
        <td>${testList[i].username!''}</td>
    </tr>
<%}%>

while

<%var i=0;while(i<testList.~size){%>
    <tr>
        <td>${testList.~size}</td>
        <td>${testList[i].id}</td>
        <td>${testList[i].username!''}</td>
    </tr>
<%i++;}%>

对于 for 循环来说,是没有进入循环体中时,则进入 elsefor 语句块,所以 elsefor 不能单独使用

<%for(var i=0;i<testList.~size;i++){%>
    <tr>
        <td>${testList.~size}</td>
        <td>${testList[i].id}</td>
        <td>${testList[i].username!''}</td>
    </tr>
<%}elsefor{%>
    <tr>
        <td colspan="3">没有记录</td>
    </tr>
<%}%>

接下来聊聊条件语句,Beetl 中的条件语句有:

  • if-else
  • switch-case
  • select-case

具体使用如下:

<%
    var a=true,b=1;
    if(a&&b==1){

    }else if(a){

    }else{

    }
%>

switch-case:

<%
    var b=1;
    switch(b){
        case 0:
            print('1');
        break;
        case 1:
            print('2');
        break;
        case 2:
            print('2');
        break;

        default:
            print('error');
        break;
    }
%>

switch 可以支持任何类型

select-case 是 switch case 的增强版。他允许 case 里有逻辑表达式,同时,也不需要每个 case 都 break 一下,默认遇到合乎条件的 case 执行后就退出。

<%
    var b=1;
    select(b){
        case 0,1:
            print("it's small int");
        case 2,3:
            print("it's big int");
        default:
            print("error");
    }
%>

如果在使用模板的过程中出现异常,可以使用 try-catch 处理,如下:

<%
    try{
        var a=10;
        var b=0;
        print(a/b);
    }catch(error){
        print("出现异常:"+error.message);
    }
%>

error 代表了一个异常,你可以通过 error.message 来获取可能的错误信息,也可以省略 catch 部分,这样出现异常,不做任何操作。

Beetl 模板判断变量是否存在可以使用 hasisEmpty

简单的 Beetl 模板操作就到这里了,需要了解其他的使用,在下载的包中有官网文档。

如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论