二、Jforum核心類 Jforum

<!-- 核心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);
		}
	}
}

 

 

   如果需要 跟蹤數據的話 毫無疑問是從這個類開始,以及編碼 等其他信息均可在這裏得到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章