<!-- 核心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);
}
}
}
如果需要 跟蹤數據的話 毫無疑問是從這個類開始,以及編碼 等其他信息均可在這裏得到。