jfinal中实现把Template在项目外部和内部同时进行加载

目前在开发项目时有一个需求,用户可以自己制作模板,详情请看这个反馈http://www.jfinal.com/feedback/3614

假定是user.html(当然需要审核,以防止安全隐患),并且user.html有一个父模板layout.html(项目指定),但是user.html在项目外(不用每次部署备份),layout.html属于项目开发的一部分,在项目内,如下图

无标题.png

感谢波总的耐心解答,下面说一下解决方案

1.创建ExtRender

/**
 * @author Catch
 * @date 2018-05-04 12:56
 */
public class ExtRender extends TemplateRender {
   private static final Engine engine = new Engine()
         .setDevMode(PropKit.getBoolean("devMode", false))
         .setBaseTemplatePath(PropKit.get("extBaseTemplatePath"))
         .addSharedFunction(new FileSource(null, PathKit.getWebRootPath() + "/_view/common/__layout.html"));
   
   public ExtRender(String view) {
      super(view);
   }
   
   @Override
   public void render() {
      response.setContentType(getContentType());
      
      Map<Object, Object> data = new HashMap<>();
      for (Enumeration<String> attrs = request.getAttributeNames(); attrs.hasMoreElements(); ) {
         String attrName = attrs.nextElement();
         data.put(attrName, request.getAttribute(attrName));
      }
      
      try {
         OutputStream os = response.getOutputStream();
         engine.getTemplate(view).render(data, os);
      } catch (RuntimeException e) {    // 捕获 ByteWriter.close() 抛出的 RuntimeException
         Throwable cause = e.getCause();
         if (cause instanceof IOException) {    // ClientAbortException、EofException 直接或间接继承自 IOException
            String name = cause.getClass().getSimpleName();
            if ("ClientAbortException".equals(name) || "EofException".equals(name)) {
               return;
            }
         }
         
         throw e;
      } catch (IOException e) {
         throw new RenderException(e);
      }
   }
}

2.创建BaseController

/**
 * @author Catch
 * @date 2018-05-04 12:47
 */
public class UserBaseController extends Controller{
   
   public void renderExt(String view) {
      render(new ExtRender(view));
   }
}

3.在你的Controller中继承BaseController,然后调用,收工

renderExt("/user.html");


评论区

mqchaui

2018-05-04 15:43

感谢分享

JFinal

2018-05-04 15:50

简洁而优雅的解决方案,感谢你的分享,大写的赞

jfinalww

2018-05-04 16:12

热门分享

扫码入社