http://www.javaeye.com/topic/253087
JForum.java 可以称为是 jforum 的引擎,它继承自 net.jforum.JForumBaseServlet 类,并间接的继承了 HttpServlet 。当第一次请求该应用的时候, servlet 容器将加载该类,并调用其初始化方法 init(ServletConfig config) ,并调用 service 方法处理请求。(但最好配置成加载应用的时候就初始化该类)
一、 init(ServletConfig config)
(一) 调用其父类 init(config) 方法
该方法主要职责是加载主要配置文件,配置 jfreemarker 的模板引擎,并保存到 net.jforum. JForumExecutionContext 类。
详细内容包括:
1. 获取 servletContext 路径;
2. 判断应用开发模式;
3. 设置 log4j 文件路径;
4. 调用 ConfigLoader.startSystemglobals(appPath) 加载全局变量文件 SystemGlobals.properties 以及用户自定义的配置文件,例如, mysql.properties 文件。
5. 调用 ConfigLoader.startCacheEngine() 启动缓存引擎
l 获取缓存引擎实现类, SystemGlobals.getValue(…)
l 加载并初始化缓存引擎类
l 获取、加载并实例化可缓存的对象 ( 主要是 repository 包下的类,如 ForumRepository) ,同时将缓存引擎实例注入到可缓存的对象中。
6. 创建 freemark 的 Configuration 类实例,并进行相应设置
l templateCfg.setTemplateUpdateDelay(2);
l templateCfg.setSetting("number_format", "#");
l templateCfg.setSharedVariable("startupTime", new Long(new Date().getTime()));
l String defaultPath = SystemGlobals.getApplicationPath() + "/templates";
l FileTemplateLoader defaultLoader = new FileTemplateLoader(new File(defaultPath));
l templateCfg.setTemplateLoader(defaultLoader);
l 调用 ModulesRepository.init(SystemGlobals.getValue(ConfigKeys.CONFIG_DIR)) ,加载 modulesMapping.properties 模块映射文件
7. 调用 this.loadConfigStuff() 方法,加载其他属性文件
l ConfigLoader.loadUrlPatterns() ,加载 urlPattern.properties 文件
l I18n.load(); 加载国际化文件
l Tpl.load(SystemGlobals.getValue(ConfigKeys.TEMPLATES_MAPPING)), 加载 templatesMapping.properties 文件
l BBCodeRepository.setBBCollection(new BBCodeHandler().parse()); 其加载并处理了 bb_config.xml 文件
8. 调用 JForumExecutionContext.setTemplateConfig(templateCfg)
(二) 调用父类 startApplication() 方法
1. SystemGlobals.loadQueries(SystemGlobals.getValue(ConfigKeys.SQL_QUERIES_GENERIC)); 加载 generic_quries.sql 文件
2. SystemGlobals.loadQueries(SystemGlobals.getValue(ConfigKeys.SQL_QUERIES_DRIVER)); 加载相应数据库的 sql 文件
3. String filename = SystemGlobals.getValue(ConfigKeys.QUARTZ_CONFIG);
4. SystemGlobals.loadAdditionalDefaults(filename);
5. 加载任务调度文件 quartz-jforum.properites
6. ConfigLoader.createLoginAuthenticator();
7. 创建 net.jforum.sso.DefaultLoginAuthenticator 对象,并注册到 SystemGlobals 对象中。
8. ConfigLoader.loadDaoImplementation();
9. 加载并初始化 net.jforum.dao.mysql.MysqlDataAccessDriver 类,该类是访问各种 DAO 入口。
10. ConfigLoader.listenForChanges();
11. ConfigLoader.startSearchIndexer();
12. ConfigLoader.startSummaryJob();
(三) 调用 ForumStartup.startDatabase() 方法
创建 DBConnection 实例
(四) 获得数据库连接 DBConnection.getImplementation().getConnection()
(五) 获取 net.jforum.JForumExecutionContext 的对象 ex = JForumExecutionContext.get() 并进行相关设置 ex.setConnection(conn);JForumExecutionContext.set(ex);
(六) 调用 ForumStartup.startForumRepository()
加载论坛主要信息,包括 ForumDAO, CategoryDAO, ConfigDAO 的相关信息以及论坛的总体数据( loadUsersInfo() 如用户总数, loadMostUsersEverOnline() 最高峰值)
(七) RankingRepository.loadRanks()
(八) SmiliesRepository.loadSmilies()
(九) BanlistRepository.loadBanlist()
二、 service(HttpServletRequest req, HttpServletResponse res) 方法
(一) request = new WebRequestContext(req); 对 reqeust 对象进行包装,完成了对 url 路径的解析,将 module 、 action 、 paremeter 等保存 request 对象的 query 文件属性中。
(二) 实例化 JForumContext 对象 forumContext = new
JForumContext(request.getContextPath(),SystemGlobals.getValue(ConfigKeys.SERVLET_EXTENSION), request, response);
(三) 将 forumContext 注册到 JForumExecutionContext
ex = JForumExecutionContext.get();ex.setForumContext(forumContext);
JForumExecutionContext.set(ex);
(四) 进一步进行 freemarker 的配置模板引擎
l ontrollerUtils utils = new ControllerUtils();
l utils.refreshSession();
l context.put("logged", SessionFacade.isLogged());
l utils.prepareTemplateContext(context, forumContext);
context 为 freemarker 中的 SimpleHash 类对象, context 是真正的主角,所有需要再页面使用的变量都需放到该对象中。
(五) 调用 this.processCommand(out, request, response, encoding, context, moduleClass)
l 获取 moduleClass 所对应的 Command 对象实例
l 进行请求处理并返回 Tamplate 对象
调用 template.process(JForumExecutionContext.getTemplateContext(), out) 进行输出显示
三.几个重要java类
1. net.jforum.util.preferences.SystemGlobls.java
存储了系统的全局变量,通过该类可以获取 SystemGlobals.properties 和相关配置文件的值。主要存储内容包括:
l defaults = new Properties() ,用于存储 SystemGlobals.properties 中的属性
l installation = new Properties() ,用于存储额外的属性配置文件,主要是安装 jforum 时候生成的 jforum-custom.conf 文件。
l additionalDefaultsList = new ArrayList() ,用于记录所加载过的附加的属性文件名。
l queries = new Properties() ,用于存储 sql 语句
l transientValues = new Properties() 存放瞬时变量
l objectProperties = new HashMap() ,存储对象
2. net.jforum.ConfigLoader.java
加载 forum 配置文件的通用工具类。主要方法及作用如下:
l startSystemglobals(String appPath)
该方法调用了 SystemGlobals 的方法加载了 SystemGlobals.properties 、 jforum-custom.cof 、 mysql.properties 文件。
l startCacheEngine()
实例化缓存引擎对象、实例化可缓存的对象( repository 包下的类以及 SessionFacade 类)、将缓存引擎对象注入到可缓存的对象中。
l loadModulesMapping(String baseConfigDir) 加载 ModulesMapping.proerties 。
l loadUrlPatterns() ,加载 urlPattern.properties 文件,解析保存到 UrlPatternCollection 类中
l createLoginAuthenticator() ,创建登陆验证对象,登记到 SystemGloble.java 对象中