/** * Copyright (c) 2011-2017, James Zhan 詹波 (jfinal@126.com). * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jfinal.render; import java.io.File; import java.util.Locale; import javax.servlet.ServletContext; import com.jfinal.config.Constants; import com.jfinal.kit.LogKit; import com.jfinal.kit.PathKit; import com.jfinal.template.Engine; /** * RenderManager. */ public class RenderManager { private Engine engine; private Constants constants; private ServletContext servletContext; private IRenderFactory renderFactory = null; private static final RenderManager me = new RenderManager(); private RenderManager() {} public static RenderManager me() { return me; } public IRenderFactory getRenderFactory() { return renderFactory; } public void setRenderFactory(IRenderFactory renderFactory) { if (renderFactory == null) { throw new IllegalArgumentException("renderFactory can not be null"); } this.renderFactory = renderFactory; } public void init(Engine engine, Constants constants, ServletContext servletContext) { this.engine = engine; this.constants = constants; this.servletContext = servletContext; // init Render Render.init(constants.getEncoding(), constants.getDevMode()); initTemplateRender(); initFreeMarkerRender(servletContext); initVelocityRender(servletContext); initJspRender(servletContext); initFileRender(servletContext); // create renderFactory if (renderFactory == null) { renderFactory = new RenderFactory(); } renderFactory.init(engine, constants, servletContext); } private void initTemplateRender() { TemplateRender.init(engine); } private void initFreeMarkerRender(ServletContext servletContext) { try { Class.forName("freemarker.template.Template"); // detect freemarker.jar FreeMarkerRender.init(servletContext, Locale.getDefault(), constants.getFreeMarkerTemplateUpdateDelay()); } catch (ClassNotFoundException e) { // System.out.println("freemarker can not be supported!"); LogKit.logNothing(e); } } private void initVelocityRender(ServletContext servletContext) { try { Class.forName("org.apache.velocity.VelocityContext"); VelocityRender.init(servletContext); } catch (ClassNotFoundException e) { // System.out.println("Velocity can not be supported!"); LogKit.logNothing(e); } } private void initJspRender(ServletContext servletContext) { try { Class.forName("javax.el.ELResolver"); Class.forName("javax.servlet.jsp.JspFactory"); com.jfinal.plugin.activerecord.ModelRecordElResolver.init(servletContext); } catch (ClassNotFoundException e) { // System.out.println("Jsp or JSTL can not be supported!"); LogKit.logNothing(e); } catch (IllegalStateException e) { throw e; } catch (Exception e) { LogKit.logNothing(e); } } private void initFileRender(ServletContext servletContext) { String downloadPath = constants.getBaseDownloadPath(); downloadPath = downloadPath.trim(); downloadPath = downloadPath.replaceAll("\\\\", "/"); String baseDownloadPath; // 如果为绝对路径则直接使用,否则把 downloadPath 参数作为项目根路径的相对路径 if (PathKit.isAbsolutelyPath(downloadPath)) { baseDownloadPath = downloadPath; } else { baseDownloadPath = PathKit.getWebRootPath() + File.separator + downloadPath; } // remove "/" postfix if (baseDownloadPath.equals("/") == false) { if (baseDownloadPath.endsWith("/")) { baseDownloadPath = baseDownloadPath.substring(0, baseDownloadPath.length() - 1); } } FileRender.init(baseDownloadPath, servletContext); } public Engine getEngine() { return engine; } public Constants getConstants() { return constants; } public ServletContext getServletContext() { return servletContext; } }