<!-- 核心servlet 处理全部请求 --> <servlet> <servlet-name>jforum</servlet-name> <servlet-class>net.jforum.JForum</servlet-class> <init-param> <param-name>development</param-name> <param-value>true</param-value> </init-param> </servlet> <!-- Installer --> <!-- 初始化servlet --> <servlet> <servlet-name>install</servlet-name> <servlet-class>net.jforum.InstallServlet</servlet-class> <init-param> <param-name>development</param-name> <param-value>true</param-value> </init-param> </servlet> <!-- Mapping --> <servlet-mapping> <servlet-name>install</servlet-name> <url-pattern>/install/install.page</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jforum</servlet-name> <url-pattern>*.page</url-pattern> </servlet-mapping>
?
?
package net.jforum; /** *集成基类Servlet JForumBaseServlet *JForumBaseServlet 中也是负责对一起基本配置的加载 *搭配环境 */ public class JForum extends JForumBaseServlet { private static boolean isDatabaseUp; public void init(ServletConfig config) throws ServletException { super.init(config); super.startApplication(); isDatabaseUp = ForumStartup.startDatabase(); try { Connection conn = DBConnection.getImplementation().getConnection(); /** * 所有的SystemGlobals.getValue都是获取配置文件中的信息,至于他是如何加载配置文件 */ conn.setAutoCommit(!(SystemGlobals .getBoolValue("database.use.transactions"))); MySQLVersionWorkarounder dw = new MySQLVersionWorkarounder(); dw.handleWorkarounds(conn); JForumExecutionContext ex = JForumExecutionContext.get(); ex.setConnection(conn); JForumExecutionContext.set(ex); ForumStartup.startForumRepository(); // 字面意思理解,加载排行,表情,板块信息 RankingRepository.loadRanks(); SmiliesRepository.loadSmilies(); BanlistRepository.loadBanlist(); } catch (Throwable e) { throw new ForumStartupException("Error while starting jforum", e); } finally { JForumExecutionContext.finish(); } } /** * 这个方法是重点,他负调用其他的业务层,处理数据 */ public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException { Writer out = null; /** * JForumContext保存了容器的一些基本信息 从他的属性可以看出来 * contextPath : 容器路径 不知道怎么理解 * servletExtension : servlet的拓展 * request :servlet原始请求信息 * response : * isEncodingDisabled : boolean * isBot : boolean */ JForumContext forumContext = null; RequestContext request = null; ResponseContext response = null; /** * 获取默认编码 在config/database下面 不同的数据库都有 */ String encoding = SystemGlobals.getValue("encoding"); try { JForumExecutionContext ex = JForumExecutionContext.get(); req.getParameterNames(); /** * WebRequestContext 这个类也非常重要, * 它负责对请求的一些参数处理 */ request = new WebRequestContext(req); response = new WebResponseContext(res); checkDatabaseStatus(); /** * 创建 JForumContext对象 封装容器基本信息 */ forumContext = new JForumContext(request.getContextPath(), SystemGlobals.getValue("servlet.extension"), request, response); ex.setForumContext(forumContext); JForumExecutionContext.set(ex); /** * context是封装在jar包里面的容器模板 */ SimpleHash context = JForumExecutionContext.getTemplateContext(); ControllerUtils utils = new ControllerUtils(); utils.refreshSession(); /** * 下面是系列的通用处理过程,把一些配置信息加载到容器当中 * ,对我们改装jforum功能作用不大 */ context.put("logged", SessionFacade.isLogged()); SecurityRepository.load(SessionFacade.getUserSession().getUserId()); utils.prepareTemplateContext(context, forumContext); String module = request.getModule(); String moduleClass = (module != null) ? ModulesRepository .getModuleClass(module) : null; if (moduleClass == null) { response.sendError(404); } else { boolean shouldBan = shouldBan(request.getRemoteAddr()); if (!(shouldBan)) { context.put("moduleName", module); context.put("action", request.getAction()); } else { moduleClass = ModulesRepository.getModuleClass("forums"); context.put("moduleName", "forums"); ((WebRequestContext) request).changeAction("banned"); } if ((shouldBan) && (SystemGlobals .getBoolValue("banlist.send.403forbidden"))) { response.sendError(403); } else { context.put("language", I18n.getUserLanguage()); context.put("session", SessionFacade.getUserSession()); context.put("request", req); context.put("response", response); out = processCommand(out, request, response, encoding, context, moduleClass); } } } catch (Exception e) { handleException(out, response, encoding, e, request); } finally { handleFinally(out, forumContext, response); } } }
?
?
?? 如果需要 跟踪数据的话 毫无疑问是从这个类开始,以及编码 等其他信息均可在这里得到。