JFinal利用拦截器同时使用多个模板引擎

看到有人问这方便的问题,把我当初学习JFinal时写的代码贴上来,希望有帮助.

package cn.flyinke.jke.beetl.common;

import org.beetl.ext.jfinal3.JFinal3BeetlRenderFactory;

import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.config.Constants;
import com.jfinal.core.Controller;
import com.jfinal.core.JFinal;
import com.jfinal.render.Render;
import com.jfinal.render.RenderManager;

public class BeetlRenderInterceptor implements Interceptor {

   private static final JFinal3BeetlRenderFactory rf = new JFinal3BeetlRenderFactory();
   private static final Constants constants = JFinal.me().getConstants();
   private static final RenderManager renderManager = RenderManager.me();
   
   public BeetlRenderInterceptor() {
      rf.config();
      System.out.println("beetl拦截器");
   }
   
   @Override
   public void intercept(Invocation inv) {
      inv.invoke();
      Render render = inv.getController().getRender();
      Controller ctr = inv.getController();
      if(render == null){
         String view = inv.getMethodName()+constants.getViewExtension();
         Render BeetlRender = rf.getRender(view);
         ctr.render(BeetlRender);
      }else{
         String view = render.getView();
         Render defaultRender = renderManager.getRenderFactory().getRender(view);
         //render 是否是默认  注意 有待改进
         boolean flag = defaultRender.getClass().isAssignableFrom(render.getClass());
         if(flag) {
            //替换
            Render beetlRender = rf.getRender(view);
            ctr.render(beetlRender);
         }
      }
   }
}

以上是beetl,同理可定义jsp,thymeleaf等拦截器,在需要的地方使用.

评论区

JFinal

2018-09-03 14:59

这种玩法还是第一次见,下面介绍另外两种玩法:
1:按 beetl 官方的配置集成到 jfinal 之中,然后 Controller.render(String) 方法就会自动使用 beetl
enjoy 引擎可以使用 renderTemplate 调用到,其它也类似:
renderJsp、renderFreemarker、renderVelocity

2:引入一个 BaseController ,在其中创建类似于 renderBeetl(String) 这样的方法实现功能,然后所有 Controller 继承这个 BaseController 即可

热门分享

扫码入社