/** * 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.core; import java.util.List; import javax.servlet.ServletContext; import com.jfinal.config.Constants; import com.jfinal.config.JFinalConfig; import com.jfinal.handler.Handler; import com.jfinal.handler.HandlerFactory; import com.jfinal.kit.LogKit; import com.jfinal.kit.PathKit; import com.jfinal.plugin.IPlugin; import com.jfinal.render.RenderManager; import com.jfinal.server.JettyServerForIDEA; import com.jfinal.server.IServer; import com.jfinal.server.ServerFactory; import com.jfinal.token.ITokenCache; import com.jfinal.token.TokenManager; import com.jfinal.upload.OreillyCos; /** * JFinal */ public final class JFinal { private Constants constants; private ActionMapping actionMapping; private Handler handler; private ServletContext servletContext; private String contextPath = ""; private static IServer server; private static final JFinal me = new JFinal(); private JFinal() { } public static JFinal me() { return me; } boolean init(JFinalConfig jfinalConfig, ServletContext servletContext) { this.servletContext = servletContext; this.contextPath = servletContext.getContextPath(); initPathUtil(); Config.configJFinal(jfinalConfig); // start plugin, init log factory and init engine in this method constants = Config.getConstants(); initActionMapping(); initHandler(); initRender(); initOreillyCos(); initTokenManager(); return true; } private void initTokenManager() { ITokenCache tokenCache = constants.getTokenCache(); if (tokenCache != null) { TokenManager.init(tokenCache); } } private void initHandler() { Handler actionHandler = new ActionHandler(actionMapping, constants); handler = HandlerFactory.getHandler(Config.getHandlers().getHandlerList(), actionHandler); } private void initOreillyCos() { OreillyCos.init(constants.getBaseUploadPath(), constants.getMaxPostSize(), constants.getEncoding()); } private void initPathUtil() { String path = servletContext.getRealPath("/"); PathKit.setWebRootPath(path); } private void initRender() { RenderManager.me().init(Config.getEngine(), constants, servletContext); } private void initActionMapping() { actionMapping = new ActionMapping(Config.getRoutes(), Config.getInterceptors()); actionMapping.buildActionMapping(); Config.getRoutes().clear(); } void stopPlugins() { List<IPlugin> plugins = Config.getPlugins().getPluginList(); if (plugins != null) { for (int i=plugins.size()-1; i >= 0; i--) { // stop plugins boolean success = false; try { success = plugins.get(i).stop(); } catch (Exception e) { success = false; LogKit.error(e.getMessage(), e); } if (!success) { System.err.println("Plugin stop error: " + plugins.get(i).getClass().getName()); } } } } Handler getHandler() { return handler; } public Constants getConstants() { return Config.getConstants(); } public String getContextPath() { return contextPath; } public ServletContext getServletContext() { return this.servletContext; } public Action getAction(String url, String[] urlPara) { return actionMapping.getAction(url, urlPara); } public List<String> getAllActionKeys() { return actionMapping.getAllActionKeys(); } public static void start() { server = ServerFactory.getServer(); server.start(); } /** * 用于在 Eclipse 中,通过创建 main 方法的方式启动项目,支持执加载 */ public static void start(String webAppDir, int port, String context, int scanIntervalSeconds) { server = ServerFactory.getServer(webAppDir, port, context, scanIntervalSeconds); server.start(); } /** * 用于在 IDEA 中,通过创建 main 方法的方式启动项目,不支持热加载 * 本方法存在的意义在于此方法启动的速度比 maven 下的 jetty 插件要快得多 * * 注意:不支持热加载。建议通过 Ctrl + F5 快捷键,来快速重新启动项目,速度并不会比 eclipse 下的热加载慢多少 * 实际操作中是先通过按 Alt + 5 打开 debug 窗口,才能按 Ctrl + F5 重启项目 */ public static void start(String webAppDir, int port, String context) { server = new JettyServerForIDEA(webAppDir, port, context); server.start(); } public static void stop() { server.stop(); } /** * Run JFinal Server with Debug Configurations or Run Configurations in Eclipse or IDEA * Example for Eclipse: src/main/webapp 80 / 5 * Example for IDEA: src/main/webapp 80 / */ public static void main(String[] args) { if (args == null || args.length == 0) { server = ServerFactory.getServer(); server.start(); return ; } // for Eclipse if (args.length == 4) { String webAppDir = args[0]; int port = Integer.parseInt(args[1]); String context = args[2]; int scanIntervalSeconds = Integer.parseInt(args[3]); server = ServerFactory.getServer(webAppDir, port, context, scanIntervalSeconds); server.start(); return ; } // for IDEA if (args.length == 3) { start(args[0], Integer.parseInt(args[1]), args[2]); return ; } throw new RuntimeException("Boot parameter error. The right parameter like this: src/main/webapp 80 / 5"); } }