http://zskoma.moabc.net (收藏,设为首页)
我很懒,什么都不想写 (手机请访问 http://zskoma.moabc.net/wap)

mvnforum架构分析(转)--http://www.domino.idv.tw/bbs/bbs2002.nsf/0/BC3A95A1307D78D44825703D001...

2008年10月2日(Thursday) 23点33分 作者: 洪兄 天气: 心情: 一般

MvnForum/JSP 論壇分析,只是隨意分析,如有錯誤,煩請指正,謝謝

License GNU General Public License (GPL)
HomePage http://www.mvnforum.com/mvnforumweb/index.jsp

首先看 Web.xml

<filter>
<filter-name>CompressionFilter</filter-name>
<filter-class>net.myvietnam.mvncore.servlet.filter.CompressionFilter</filter-class>
<init-param>
<param-name>compressionThreshold</param-name>
<param-value>128</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CompressionFilter</filter-name>
<url-pattern>/mvnforum/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CompressionFilter</filter-name>
<url-pattern>/mvnforumadmin/*</url-pattern>
</filter-mapping>

/mvnforum/* /mvnforumadmin/*先傳給net.myvietnam.mvncore.servlet.filter.CompressionFilter


然後看net.myvietnam.mvncore.servlet.filter.CompressionFilter
public void doFilter ( ServletRequest request, ServletResponse response, FilterChain chain )
throws IOException, ServletException {
/*
Currently, many browsers do not send character encoding information in the
Content-Type header of an HTTP request. If an encoding has not been specified
by the client request, the container uses a default encoding to parse request
parameters. If the client hasn't set character encoding and the request parameters
are encoded with a different encoding than the default, the parameters will be
parsed incorrectly. You can use the method setCharacterEncoding in ServletRequest
interface to set the encoding. Since this method must be called
prior to parsing any post data or reading any input from the request, this function
is a prime application for filters(http://java.sun.com/products/servlet/Filters.pdf.)
In this case, it may be caused by parsing parameter "gzip". And charset should be UTF-8.
You can use another filter for the encoding.(see Tomcat's examples)

*/
request.setCharacterEncoding("utf-8"); //設定request編碼為utf-8
if (compressionThreshold == 0) {
//log.trace("doFilter gets called, but compressionTreshold is set to 0 - no compression");
chain.doFilter(request, response); //如果壓縮設定為0 ,就傳給下一過濾器
return;
}
boolean supportCompression = false;
if (request instanceof HttpServletRequest) {
//log.trace("requestURI = " + ((HttpServletRequest)request).getRequestURI());

// Are we allowed to compress ?
String s = request.getParameter("gzip"); //若request 含有 gzip的參數時
if ("false".equals(s)) { //若client 不支援gzip
//log.trace("got parameter gzip=false --> don't compress, just chain filter");
chain.doFilter(request, response); //就傳給下一過濾器
return;
}

Enumeration e =
((HttpServletRequest)request).getHeaders("Accept-Encoding");
while (e.hasMoreElements()) {
String name = (String)e.nextElement();
if (name.indexOf("gzip") != -1) {
//log.trace("supports compression");
supportCompression = true;//將request中的Header 接受編碼方式中的gzip 改為支援
} else {
//log.trace("no support for compresion");
}
}
}

if (!supportCompression) {//若是不支援壓縮(用在request 沒有gzip參數時)
//log.trace("doFilter gets called wo compression");
chain.doFilter(request, response);//就傳給下一過濾器
return;
} else { //若是支援壓縮
if (response instanceof HttpServletResponse) {
CompressionServletResponseWrapper wrappedResponse =
new CompressionServletResponseWrapper((HttpServletResponse)response);//將回應response 用CompressionServletResponseWrapper 包起來
//minhnn
//wrappedResponse.setDebugLevel(debug);
wrappedResponse.setCompressionThreshold(compressionThreshold);
//log.trace("doFilter gets called with compression");
try {
chain.doFilter(request, wrappedResponse);//就傳給下一過濾器
} finally {
wrappedResponse.finishResponse();
}
return;
}
}
}
在Web.xml中

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

故看Index.jsp
<%@ page import="net.myvietnam.mvncore.util.ParamUtil" %>
<%@ page import="com.mvnforum.user.UserModuleConfig" %>
<%
StringBuffer buffer = new StringBuffer();
buffer.append(ParamUtil.getContextPath());
buffer.append(UserModuleConfig.getUrlPattern());
buffer.append("/index");
response.sendRedirect(buffer.toString());
%>

找出UserModuleConfig

public class UserModuleConfig {

    private static Log log = LogFactory.getLog(UserModuleConfig.class);

    private UserModuleConfig() {
    }

    private static final String OPTION_FILE_NAME = "mvnforum.xml";

    private static String URL_PATTERN = "/mvnforum";

    public static String getUrlPattern() {
        return URL_PATTERN;
    }

    static {
        try {
            String strPathName = FileUtil.getServletClassesPath();
            String configFilename = strPathName + OPTION_FILE_NAME;
            DOM4JConfiguration conf = new DOM4JConfiguration(new File(configFilename));
            URL_PATTERN = conf.getString("usermoduleconfig.url_pattern", URL_PATTERN);
        } catch (Exception e) {
            String message = "com.mvnforum.user.UserModuleConfig: Can't read the configuration file: '" + OPTION_FILE_NAME +
                "'. Make sure the file is in your CLASSPATH";
            log.error(message, e);
        }
    }

}

可以想得到最後buffer 會變成 xxx.xxx.xxx/xxx/mvnforum/index
然後重導至此

查Web.xml

<servlet>
<servlet-name>ForumAdminServlet</servlet-name>
<servlet-class>com.mvnforum.admin.ForumAdminServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ForumUserServlet</servlet-name>
<servlet-class>com.mvnforum.user.ForumUserServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>ForumAdminServlet</servlet-name>
<url-pattern>/mvnforumadmin/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>ForumUserServlet</servlet-name>
<url-pattern>/mvnforum/*</url-pattern>
</servlet-mapping>

查看servlet : com.mvnforum.user.ForumUserServlet

/**Process the HTTP Get request*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}

/**Process the HTTP Post request*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
process(request, response);
}

public void process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

if (MVNForumConfig.isShouldRun() == false) {
String error = "Cannot init system. Reason : " + MVNForumConfig.getReason();
request.setAttribute("fatal_error_message", error);
getServletContext().getRequestDispatcher("/mvnplugin/mvnforum/fatalerror.jsp").forward(request, response);
return;
}

long startTime = 0;
if (log.isDebugEnabled()) {
startTime = System.currentTimeMillis();
}
count++;
try {
if (IPFilter.filter(request) == false) {
getServletContext().getRequestDispatcher("/mvnplugin/mvnforum/404.jsp").forward(request, response);
return;
}
if (UserAgentFilter.filter(request) == false) {
getServletContext().getRequestDispatcher("/mvnplugin/mvnforum/404.jsp").forward(request, response);
return;
}

//request.setCharacterEncoding("utf-8");

String responseURI = null;
responseURI = ManagerFactory.getRequestProcessor().preLogin(request, response);

// This will make sure that the user information is put in
// the request.
OnlineUserManager onlineUserManager = OnlineUserManager.getInstance();
OnlineUser onlineUser = onlineUserManager.getOnlineUser(request);
// check the module is on. Otherwise, go to message inform that
// the module is Off now. Please access later when the admin change mode to on
if (MVNForumConfig.getShouldShowUserArea() == false) {
if (!onlineUser.getPermission().canAdminSystem()) {
request.getRequestDispatcher("/mvnplugin/mvnforum/turnoff.html").forward(request, response);
return;
}
}
// 這裏看的出來,程式被分為頭、中、尾三段來做
//Config.set(request, Config.FMT_FALLBACK_LOCALE, "en");
I18nUtil.setLocaleInRequest(request, onlineUser.getLocale());

// save Vietnamese typer mode if exists one
//MyUtil.saveVNTyperMode(request, response);

if (null == responseURI) {
responseURI = ManagerFactory.getRequestProcessor().preProcess(request, response);
}

if (null == responseURI) {
// this method should not throw Exception (it must catch all Exceptions)
responseURI = userModuleProcessor.process(request, response);
}

responseURI = ManagerFactory.getRequestProcessor().postProcess(request, response, responseURI);

if ((null != responseURI) && !response.isCommitted()) {
if (responseURI.startsWith("http://") || responseURI.startsWith("https://")) {
response.sendRedirect(responseURI);
} else {
if (responseURI.endsWith(".jsp")) {
request.getRequestDispatcher(responseURI).forward(request, response);
} else {
response.sendRedirect(request.getContextPath() + responseURI);
}
}
}
} catch (Exception e) {
// so it should never go here
log.error("Error assertion", e);
} finally {
if (log.isDebugEnabled()) {
long processTime = System.currentTimeMillis() - startTime;
log.debug("ForumUserServlet processed " + count + " times. Took " + processTime + " miliseconds. ");
}
}
}// process

故查 ManagerFactory
public static synchronized RequestProcessor getRequestProcessor() {
if (requestProcessor == null) {
try {
Class c = Class.forName(MVNForumFactoryConfig.getRequestProcessorClassName());
requestProcessor = (RequestProcessor) c.newInstance();
log.info("requestProcessor = " + requestProcessor);
} catch (Exception e) {
// This should never happen
log.error("Error returning the requestProcessor.", e);
throw new RuntimeException(e.getMessage());
}
}
return requestProcessor;
}

查看MVNForumFactoryConfig

public class MVNForumFactoryConfig {

private static Log log = LogFactory.getLog(MVNForumFactoryConfig.class);

private static final String OPTION_FILE_NAME = "mvnforum.xml";

private static String authenticatorClassName = null;
private static String memberManagerClassName = "com.mvnforum.db.jdbc.MemberDAOImplJDBC";
private static String onlineUserFactoryClassName = "com.mvnforum.auth.OnlineUserFactoryImpl";
private static String requestProcessorClassName = "com.mvnforum.RequestProcessorDefault";
private static String luceneAnalyzerClassName = "org.apache.lucene.analysis.standard.StandardAnalyzer";

public static String getMemberManagerClassName() {
return memberManagerClassName;
}

public static String getOnlineUserFactoryClassName() {
return onlineUserFactoryClassName;
}

public static String getAuthenticatorClassName() {
return authenticatorClassName;
}

public static String getRequestProcessorClassName() {
return requestProcessorClassName;
}

public static String getLuceneAnalyzerClassName() {
return luceneAnalyzerClassName;
}

static {
try {
String strPathName = FileUtil.getServletClassesPath();
String configFilename = strPathName + OPTION_FILE_NAME;
DOM4JConfiguration conf = new DOM4JConfiguration(new File(configFilename));

memberManagerClassName = conf.getString("mvnforumfactoryconfig.member_implementation", memberManagerClassName);
onlineUserFactoryClassName = conf.getString("mvnforumfactoryconfig.onlineuser_implementation", onlineUserFactoryClassName);
authenticatorClassName = conf.getString("mvnforumfactoryconfig.authenticator_implementation", authenticatorClassName);
requestProcessorClassName = conf.getString("mvnforumfactoryconfig.requestprocessor_implementation", requestProcessorClassName);
luceneAnalyzerClassName = conf.getString("mvnforumfactoryconfig.lucene_analyzer_implementation", luceneAnalyzerClassName);
} catch (Exception e) {
log.error("Error loading the factory properties", e);
}
}
}

查看com.mvnforum.RequestProcessorDefault

public String preLogin(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e){
log.warn("Error setting the character encoding from the request", e);
}
return null;
}

見上面程式,因會回傳null 故將執行responseURI = userModuleProcessor.process(request, response);
在ForumUserServlet中
public void init() throws ServletException {
/*
if (MVNForumConfig.isShouldRun() == false) {
throw new ServletException("Cannot init system. Reason = " + MVNForumConfig.getReason());
}*/
//log.debug(" USING LOGGING::::" + log.getClass());
userModuleProcessor = new UserModuleProcessor(this);
// Check if the servlet is in specs Servlet 2.3 or later
.....................
.............
.....................
.............
.....................
故查UserModuleProcessor

public class UserModuleProcessor {

private static Log log = LogFactory.getLog(UserModuleProcessor.class);

private final String ORIGINAL_REQUEST = "mvnforum.user.OriginalRequest";

private HttpServlet mainServlet = null;
private ServletContext servletContext = null;

private OnlineUserManager onlineUserManager = OnlineUserManager.getInstance();
private UserModuleURLMapHandler urlMapHandler = new UserModuleURLMapHandler();

private ForumWebHandler forumWebHandler = new ForumWebHandler();
private ThreadWebHandler threadWebHandler = new ThreadWebHandler();
private PostWebHandler postWebHandler = new PostWebHandler();
private AttachmentWebHandler attachmentWebHandler = new AttachmentWebHandler();
private MemberWebHandler memberWebHandler = new MemberWebHandler();
private CompanyWebHandler companyWebHandler = new CompanyWebHandler();
private WatchWebHandler watchWebHandler = new WatchWebHandler();
private FavoriteThreadWebHandler favoriteThreadWebHandler = new FavoriteThreadWebHandler();
private MessageWebHandler messageWebHandler = new MessageWebHandler();
private PmAttachmentWebHandler pmAttachmentWebHandler = new PmAttachmentWebHandler();
private MessageFolderWebHandler messageFolderWebHandler = new MessageFolderWebHandler();

public UserModuleProcessor(HttpServlet servlet) {
mainServlet = servlet;
servletContext = servlet.getServletContext();
}

public String process(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {

long start = 0;
String requestURI = StringUtil.getEmptyStringIfNull(request.getPathInfo());
String responseURI = null;
OnlineUser onlineUser = null;
if (log.isDebugEnabled()) {
start = System.currentTimeMillis();
log.debug("UserModuleProcessor : requestURI = " + requestURI);
}

// step 1: some command need to be processed before we do the URI mapping (of the MODAL)
// MODAL processing
try {
onlineUser = onlineUserManager.getOnlineUser(request);
onlineUser.updateNewMessageCount(false);
if (requestURI.equals("/index")) {
if (MVNForumConfig.getEnablePortalLikeIndexPage()) {
forumWebHandler.prepareListIndex(request, requestURI);//no permission
} else {
forumWebHandler.prepareList(request, requestURI);//no permission
}
} else if (requestURI.equals("/listforums")) {
forumWebHandler.prepareList(request, requestURI);//no permission
} else if (requestURI.equals("/listthreads")) {
threadWebHandler.prepareList_limit(request);
} else if (requestURI.equals("/listrecentthreads")) {
threadWebHandler.prepareListRecentThreads_limit(request);//no permission
} else if (requestURI.equals("/viewthread")) {
postWebHandler.prepareViewThread(request);
} else if (requestURI.equals("/printthread")) {
postWebHandler.prepareViewThread(request);

} else if (requestURI.equals("/deletethread")) {
threadWebHandler.prepareDelete(request);
} else if (requestURI.equals("/deletethreadprocess")) {
threadWebHandler.processDelete(request);
} else if (requestURI.equals("/movethread")) {
threadWebHandler.prepareMoveThread(request);
} else if (requestURI.equals("/movethreadprocess")) {
threadWebHandler.processMoveThread(request);
} else if (requestURI.equals("/editthreadstatus")) {
threadWebHandler.prepareEditThreadStatus(request);
} else if (requestURI.equals("/editthreadstatusprocess")) {
threadWebHandler.processEditThreadStatus(request);
} else if (requestURI.equals("/editthreadtype")) {
threadWebHandler.prepareEditThreadType(request);
} else if (requestURI.equals("/editthreadtypeprocess")) {
threadWebHandler.processEditThreadType(request);

} else if (requestURI.equals("/modcp")) {
threadWebHandler.prepareModerationControlPanel(request);
} else if (requestURI.equals("/listrecentpendingthreads")) {
threadWebHandler.prepareListRecentDisabledThreads_limit(request);
} else if (requestURI.equals("/listthreadswithpendingposts")) {
threadWebHandler.prepareListEnableThreadsWithPendingPosts_inForum_limit(request);
} else if (requestURI.equals("/listrecentthreadswithpendingposts")) {
threadWebHandler.prepareListRecentEnableThreadsWithPendingPosts_limit(request);
} else if (requestURI.equals("/moderatependingthreads")) {
threadWebHandler.prepareModeratePendingThreads_inForum_limit(request);
} else if (requestURI.equals("/moderatependingthreadsprocess")) {
threadWebHandler.processModeratePendingThreads(request);
} else if (requestURI.equals("/moderatependingposts")) {
postWebHandler.prepareModeratePendingPosts_limit(request);
} else if (requestURI.equals("/moderatependingpostsprocess")) {
postWebHandler.processModeratePendingPosts(request);

} else if (requestURI.equals("/listpendingthreadsxml")) {
threadWebHandler.prepareListDisabledThreads_limit_xml(request);

} else if (requestURI.equals("/addpost")) {
postWebHandler.prepareAdd(request, response);
} else if (requestURI.equals("/addpostprocess")) {
postWebHandler.processAdd(request, response);
} else if (requestURI.equals("/editpost")) {
postWebHandler.prepareEdit(request);
} else if (requestURI.equals("/updatepost")) {
postWebHandler.processUpdate(request);
} else if (requestURI.equals("/printpost")) {
postWebHandler.preparePrintPost(request);
} else if (requestURI.equals("/deletepost")) {
postWebHandler.prepareDelete(request);
} else if (requestURI.equals("/deletepostprocess")) {
postWebHandler.processDelete(request);

} else if (requestURI.equals("/addattachment")) {
attachmentWebHandler.prepareAdd(request);
} else if (requestURI.equals("/addattachmentprocess")) {
attachmentWebHandler.processAdd(request, response);
} else if (requestURI.equals("/getattachment")) {
attachmentWebHandler.downloadAttachment(request, response);
return null;//download attachment, no further process is needed
} else if (requestURI.equals("/deleteattachment")) {
attachmentWebHandler.prepareDelete(request);
} else if (requestURI.equals("/deleteattachmentprocess")) {
attachmentWebHandler.processDelete(request);
} else if (requestURI.equals("/editattachment")) {
attachmentWebHandler.prepareEdit(request);
} else if (requestURI.equals("/editattachmentprocess")) {
attachmentWebHandler.processEdit(request);

} else if (requestURI.equals("/myfavoritethread")) {
threadWebHandler.prepareList_inFavorite(request);
} else if (requestURI.equals("/addfavoritethreadprocess")) {
favoriteThreadWebHandler.processAdd(request);
} else if (requestURI.equals("/deletefavoritethreadprocess")) {
favoriteThreadWebHandler.processDelete(request);

} else if (requestURI.equals("/registermember")) {
memberWebHandler.prepareAdd(request);
} else if (requestURI.equals("/registermemberprocess")) {
memberWebHandler.processAdd(request, response);// no permission
} else if (requestURI.equals("/viewmember")) {
memberWebHandler.prepareView_forPublic(request);// no permission
} else if (requestURI.equals("/listmembers")) {
memberWebHandler.prepareListMembers_forPublic(request);// no permission
} else if (requestURI.equals("/editmember")) {
memberWebHandler.prepareEdit_forCurrentMember(request);
} else if (requestURI.equals("/updatemember")) {
memberWebHandler.processUpdate(request, response);
} else if (requestURI.equals("/myprofile")) {
memberWebHandler.prepareView_forCurrentMember(request);
} else if (requestURI.equals("/changepassword")) {
onlineUser.getPermission().ensureIsAuthenticated();// check if login
} else if (requestURI.equals("/changepasswordprocess")) {
memberWebHandler.processUpdatePassword(request);
} else if (requestURI.equals("/changeemail")) {
memberWebHandler.prepareEditEmail(request);
} else if (requestURI.equals("/changeemailprocess")) {
memberWebHandler.processUpdateEmail(request);
} else if (requestURI.equals("/changesignature")) {
memberWebHandler.prepareEditSignature(request);
} else if (requestURI.equals("/changesignatureprocess")) {
memberWebHandler.processUpdateSignature(request, response);
} else if (requestURI.equals("/changeavatar")) {
memberWebHandler.prepareEditAvatar(request);
} else if (requestURI.equals("/uploadavatar")) {
memberWebHandler.uploadAvatar(mainServlet.getServletConfig(), request);
} else if (requestURI.equals("/updateavatar")) {
memberWebHandler.updateMemberAvatar(request);
} else if (requestURI.equals("/mywatch")) {
watchWebHandler.prepareList(request);
} else if (requestURI.equals("/addwatch")) {
watchWebHandler.prepareAdd(request);
} else if (requestURI.equals("/addwatchprocess")) {
watchWebHandler.processAdd(request);
} else if (requestURI.equals("/deletewatchprocess")) {
watchWebHandler.processDelete(request);

} else if (requestURI.equals("/mymessage")) {
messageWebHandler.prepareList(request);
} else if (requestURI.equals("/addmessage")) {
messageWebHandler.prepareAdd(request, response);
} else if (requestURI.equals("/addmessageprocess")) {
messageWebHandler.processAdd(request, response);
} else if (requestURI.equals("/viewmessage")) {
messageWebHandler.prepareViewMessage(request);
} else if (requestURI.equals("/sendmessageprocess")) {
messageWebHandler.processSendMessage(request);
} else if (requestURI.equals("/deletemessageprocess")) {
messageWebHandler.processDelete(request);
} else if (requestURI.equals("/processmessage")) {
messageWebHandler.processMessage(request);
} else if (requestURI.equals("/addmessageattachment")) {
pmAttachmentWebHandler.prepareAdd(request);
} else if (requestURI.equals("/addmessageattachmentprocess")) {
pmAttachmentWebHandler.processAdd(request, response);
} else if (requestURI.equals("/getpmattachment")) {
pmAttachmentWebHandler.downloadAttachment(request, response);
return null;//download attachment, no further process is needed

} else if (requestURI.equals("/mymessagefolder")) {
messageFolderWebHandler.prepareList(request);
} else if (requestURI.equals("/addmessagefolder")) {
messageFolderWebHandler.prepareAdd(request);
} else if (requestURI.equals("/addmessagefolderprocess")) {
messageFolderWebHandler.processAdd(request);
} else if (requestURI.equals("/deletemessagefolder")) {
messageFolderWebHandler.prepareDelete(request);
} else if (requestURI.equals("/deletemessagefolderprocess")) {
messageFolderWebHandler.processDelete(request);
} else if (requestURI.equals("/updatefolderorder")) {
messageFolderWebHandler.processUpdateOrder(request);

} else if (requestURI.equals("/listcompanies")) {
companyWebHandler.prepareListCompanies_forPublic(request);
} else if (requestURI.equals("/companyhomepage")) {
companyWebHandler.prepareView(request);

} else if (requestURI.equals("/search")) {
postWebHandler.prepareSearch(request);
} else if (requestURI.equals("/searchprocess")) {
postWebHandler.processSearch(request, response);
} else if (requestURI.equals("/rsssummary")) {
threadWebHandler.prepareRSSSummary(request);
} else if (requestURI.equals("/atom")) {
threadWebHandler.prepareListRSS(request);
} else if (requestURI.equals("/rss")) {
threadWebHandler.prepareListRSS(request);
} else if (requestURI.equals("/rss2")) {
threadWebHandler.prepareListRSS(request);

} else if (requestURI.equals("/getmvncoreimage")) {
MyUtil.writeMvnCoreImage(request, response);
return null;
} else if (requestURI.equals("/getmvnforumimage")) {
MyUtil.writeMvnForumImage(request, response);
return null;

} else if (requestURI.equals("/captchaimage")) {
MVNCaptchaService.getInstance().writeCaptchaImage(request, response);
return null;
} else if (requestURI.equals("/iforgotpasswords")) {
memberWebHandler.prepareForgotPassword(request);//no permission
} else if (requestURI.equals("/forgotpasswordprocess")) {
memberWebHandler.forgotPassword(request);//no permission
} else if (requestURI.equals("/resetpasswordprocess")) {
memberWebHandler.resetPassword(request);//no permission

} else if (requestURI.equals("/sendactivationcodeprocess")) {
memberWebHandler.sendActivateCode(request);//no permission
} else if (requestURI.equals("/activatememberprocess")) {
memberWebHandler.activateMember(request);//no permission

} else if (requestURI.equals("/listonlineusers")) {
//@todo: move to WebHandler
if (MVNForumConfig.getEnableOnlineUsers() == false) {
throw new AssertionException("Cannot list online users because ONLINE_USERS feature is disabled by administrator.");
}
// This will ensure removing all time-out users (if there is)
onlineUserManager.getOnlineUser(request);

// the following 2 lines fix the bug that no online user found in the first time request
Action action = new ActionInUserModule(request, requestURI);// may throw MissingURLMapEntryException
onlineUserManager.updateOnlineUserAction(request, action);

// now set the attribute
//request.setAttribute("OnlineUserActions", onlineUserManager.getOnlineUserActions(0/*default*/));// no permission
boolean duplicateUsers = MVNForumConfig.getEnableDuplicateOnlineUsers();
request.setAttribute("OnlineUserActions", onlineUserManager.getOnlineUserActions(0/*default*/, duplicateUsers));// no permission

} else if (requestURI.equals("/loginprocess")) {
if (MVNForumConfig.getEnableLogin() == false) {
throw new AuthenticationException(NotLoginException.LOGIN_DISABLED);
}
onlineUserManager.processLogin(request, response);

String url = ParamUtil.getParameter(request, "url");
if (url.length() > 0) {
responseURI = url;
} else {
String originalRequest = ParamUtil.getAttribute(request.getSession(), ORIGINAL_REQUEST);
if (originalRequest.length() > 0) {
request.getSession().setAttribute(ORIGINAL_REQUEST, "");
responseURI = originalRequest;
}
}
} else if (requestURI.equals("/logout")) {
onlineUserManager.logout(request, response);
request.setAttribute("Reason", "Logout successfully.");
} else if (requestURI.equals("/deletecookieprocess")) {
onlineUserManager.deleteCookie(request, response);
} else if (requestURI.equals("/getavatar")) {
memberWebHandler.getAvatar(request, response);
return null;//download attachment, no further process is needed
}
} catch (AuthenticationException e) {
// make sure not from login page, we cannot set original request in this situation
// and also make sure the request's method must be GET to set the OriginalRequest
boolean shouldSaveOriginalRequest = (e.getReason()==NotLoginException.NOT_LOGIN) || (e.getReason()==NotLoginException.NOT_ENOUGH_RIGHTS);
if (shouldSaveOriginalRequest && (request.getMethod().equals("GET"))) {
String url = UserModuleConfig.getUrlPattern() + requestURI + "?" + StringUtil.getEmptyStringIfNull(request.getQueryString());
request.getSession().setAttribute(ORIGINAL_REQUEST, url);
}
requestURI = "/login";
request.setAttribute("Reason", e.getReasonExplanation(onlineUser.getLocale()));
} catch (Exception e) {
if (e instanceof BadInputException) {
// we log in WARN level if this is the exception from user input
log.warn("Exception in UserModuleProcessor e = " + e.getMessage(), e);
} else if (e instanceof AssertionException) {
// we log in FATAL level if this is the exception from user input
log.fatal("Exception in UserModuleProcessor e = " + e.getMessage(), e);
} else {
log.error("Exception in UserModuleProcessor [" + e.getClass().getName() + "] : " + e.getMessage(), e);
}
requestURI = "/error";
String message = StringUtil.getEmptyStringIfNull(e.getMessage());
if (message.length() == 0) {
message = e.getClass().getName();
}
request.getSession().setAttribute("ErrorMessage", DisableHtmlTagFilter.filter(message));
}

// step 2: map the URI (of the CONTROLLER)
try {
// NOTE 1: there is one situation when responseURI != null (after login successfully for the first time),
// but since it will make a NEW request via sendRedirect, so we dont count
// NOTE 2: there are 2 situation when requestURI is different from the original requestURI
// that is /login and /error, because of this so we must pass the requestURI
/* @todo Could below the MapHandler ??? */
Action action = new ActionInUserModule(request, requestURI);// may throw MissingURLMapEntryException
onlineUserManager.updateOnlineUserAction(request, action);

// now updateOnlineUserAction is ok, we go ahead
if (responseURI == null) {
URLMap map = urlMapHandler.getMap(requestURI, request, onlineUser.getLocaleName());
responseURI = map.getResponse();
}// if
} catch (MissingURLMapEntryException e) {
log.error("Exception: missing urlmap entry in forum module: requestURI = " + requestURI);
responseURI = "/mvnplugin/mvnforum/user/error.jsp";
request.getSession().setAttribute("ErrorMessage", DisableHtmlTagFilter.filter(e.getMessage()));
} catch (Exception e) {
// This will catch AuthenticationException, AssertionException, DatabaseException
// in the method onlineUserManager.updateOnlineUserAction(request, action)
responseURI = "/mvnplugin/mvnforum/user/error.jsp";
request.getSession().setAttribute("ErrorMessage", DisableHtmlTagFilter.filter(e.getMessage()));
}

// step 3: forward or dispatch to the VIEW
if (log.isDebugEnabled()) {
long duration = System.currentTimeMillis() - start;
log.debug("UserModuleProcessor : responseURI = " + responseURI + ". (" + duration + " ms)");
}

return responseURI;
/*
if (responseURI.endsWith(".jsp")) {
servletContext.getRequestDispatcher(responseURI).forward(request, response);
} else {
response.sendRedirect(ParamUtil.getContextPath() + responseURI);
}*/
}
}

查看ForumWebHandler
public void prepareList(HttpServletRequest request, String requestURI)
throws AssertionException, DatabaseException, AuthenticationException, MissingURLMapEntryException {

Locale locale = I18nUtil.getLocaleInRequest(request);

// the following 3 lines fix the bug that no online user found in the first time request
OnlineUser onlineUser = userManager.getOnlineUser(request);
Action action = new ActionInUserModule(request, requestURI); // may throw MissingURLMapEntryException
userManager.updateOnlineUserAction(request, action);

MVNForumPermission permission = onlineUser.getPermission();

// Calculate to get the mosts
long now = DateUtil.getCurrentGMTTimestamp().getTime();
Timestamp since = new Timestamp(now - DateUtil.WEEK);

if (MVNForumConfig.getEnableMostActiveMembers()) {
Collection mostActiveMembers = DAOFactory.getPostDAO().getMostActiveMembers(since, MVNForumConfig.getMaxActiveMembers());

request.setAttribute("MostActiveMembers", mostActiveMembers);
}
if (MVNForumConfig.getEnableMostActiveThreads()) {
Collection mostActiveThreads = this.getMyMostActiveThreads(permission, since);

request.setAttribute("MostActiveThreads", mostActiveThreads);
}

if (MVNForumConfig.getEnableSiteStatisticsOverview()) {
int numberOfMembers = DAOFactory.getMemberDAO().getNumberOfMembers();
Collection memberBeans = DAOFactory.getMemberDAO().getMembers_withSortSupport_limit(0, 1, "MemberID", "DESC");
if (memberBeans.size() != 1) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.wrong_size", new Object[] {"MemberBeans", "==",new Integer(memberBeans.size())});
throw new AssertionException(localizedMessage);
//throw new AssertionException("Assertion: MemberBeans size == 1 (but the value = " + memberBeans.size() + ")");
}
MemberBean memberBean = (MemberBean)memberBeans.iterator().next();

request.setAttribute("MemberBean", memberBean);
request.setAttribute("NumberOfMembers", new Integer(numberOfMembers));
}

// now set the attribute
boolean duplicateUsers = MVNForumConfig.getEnableDuplicateOnlineUsers();
request.setAttribute("OnlineUserActions", userManager.getOnlineUserActions(0 /*default*/, duplicateUsers)); // no permission
}

public void prepareListIndex(HttpServletRequest request, String requestURI)
throws AssertionException, DatabaseException,
AuthenticationException, MissingURLMapEntryException {

Locale locale = I18nUtil.getLocaleInRequest(request);

// the following 3 lines fix the bug that no online user found in the first time request
OnlineUser onlineUser = userManager.getOnlineUser(request);
Action action = new ActionInUserModule(request, requestURI); // may throw MissingURLMapEntryException
userManager.updateOnlineUserAction(request, action);

MVNForumPermission permission = onlineUser.getPermission();

ForumCache forumCache = ForumCache.getInstance();
Collection forumBeans = forumCache.getBeans();
Collection cTotal = new ArrayList();

for (Iterator forumIterator = forumBeans.iterator(); forumIterator.hasNext(); ) {
ForumBean forumBean = (ForumBean) forumIterator.next();

Collection cThreadTemp = DAOFactory.getThreadDAO().getNormalEnableThreads_inForum_withSortSupport_limit(forumBean.getForumID(), 0, 1, "ThreadLastPostDate", "DESC");
if (cThreadTemp.size() == 0) {
continue;
} else if (cThreadTemp.size() > 1) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.wrong_size", new Object[] {"ThreadBeans", "<=",new Integer(cThreadTemp.size())});
throw new AssertionException(localizedMessage);
//throw new AssertionException("Assertion: ThreadBeans size <= 1 (but the value = " + cThreadTemp.size() + ")");
}
ThreadBean threadBean = (ThreadBean) (cThreadTemp.iterator().next());

Collection cPostTemp = DAOFactory.getPostDAO().getLastEnablePosts_inThread_limit(threadBean.getThreadID(), 1);
if (cPostTemp.size() != 1) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.wrong_size", new Object[] {"PostBeans", "==",new Integer(cPostTemp.size())});
throw new AssertionException(localizedMessage);
//throw new AssertionException("Assertion: PostBeans size == 1 (but the value = " + cPostTemp.size() + ")");
}
PostBean postBean = (PostBean) (cPostTemp.iterator().next());

Collection cGeneralInfo = new ArrayList(2);
cGeneralInfo.add(postBean);
cGeneralInfo.add(threadBean);
cTotal.add(cGeneralInfo);
}

// Calculate to get the mosts
long now = DateUtil.getCurrentGMTTimestamp().getTime();
Timestamp since = new Timestamp(now - DateUtil.WEEK);

if (MVNForumConfig.getEnableMostActiveMembers()) {
Collection mostActiveMembers = DAOFactory.getPostDAO().getMostActiveMembers(since, MVNForumConfig.getMaxActiveMembers());

request.setAttribute("MostActiveMembers", mostActiveMembers);
}

if (MVNForumConfig.getEnableMostActiveThreads()) {
Collection mostActiveThreads = this.getMyMostActiveThreads(permission, since);

request.setAttribute("MostActiveThreads", mostActiveThreads);
}

if (MVNForumConfig.getEnableSiteStatisticsOverview()) {
int numberOfMembers = DAOFactory.getMemberDAO().getNumberOfMembers();
Collection memberBeans = DAOFactory.getMemberDAO().getMembers_withSortSupport_limit(0, 1, "MemberID", "DESC");
if (memberBeans.size() != 1) {
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.AssertionException.wrong_size", new Object[] {"MemberBeans", "==",new Integer(memberBeans.size())});
throw new AssertionException(localizedMessage);
//throw new AssertionException("Assertion: MemberBeans size == 1 (but the value = " + memberBeans.size() + ")");
}
MemberBean memberBean = (MemberBean) memberBeans.iterator().next();

request.setAttribute("MemberBean", memberBean);
request.setAttribute("NumberOfMembers", new Integer(numberOfMembers));
}

// now set the attribute
boolean duplicateUsers = MVNForumConfig.getEnableDuplicateOnlineUsers();
request.setAttribute("OnlineUserActions", userManager.getOnlineUserActions(0 /*default*/, duplicateUsers)); // no permission
request.setAttribute("LastPosts", cTotal);
}

再依此
URLMap map = urlMapHandler.getMap(requestURI, request, onlineUser.getLocaleName());
responseURI = map.getResponse();
查UserModuleURLMapHandler
class UserModuleURLMapHandler {

UserModuleURLMapHandler() {
}

/**
* We must pass the requestURI to this method, instead of from request,
* because requestURI may be changed from Processor before call this method
* NOTE: Currently we dont use the param request
*/
public URLMap getMap(String requestURI, HttpServletRequest request, String localeName)
throws MissingURLMapEntryException {

//localeName = MyUtil.getLocaleNameAndSlash(localeName);

URLMap map = new URLMap();

if (requestURI.equals("/error")) {
map.setResponse("/mvnplugin/mvnforum/user/error.jsp");
} else if (requestURI.equals("") || requestURI.equals("/")) {
map.setResponse(UserModuleConfig.getUrlPattern() + "/index");
} else if (requestURI.equals("/index")) {
if (MVNForumConfig.getEnablePortalLikeIndexPage()) {
map.setResponse("/mvnplugin/mvnforum/user/index.jsp");//index.jsp
} else {
map.setResponse("/mvnplugin/mvnforum/user/listforums.jsp");//index.jsp
}
} else if (requestURI.equals("/listonlineusers")) {
map.setResponse("/mvnplugin/mvnforum/user/listonlineusers.jsp");

} else if (requestURI.equals("/listforums")) {
map.setResponse("/mvnplugin/mvnforum/user/listforums.jsp");
} else if (requestURI.equals("/listthreads")) {
map.setResponse("/mvnplugin/mvnforum/user/listthreads.jsp");
} else if (requestURI.equals("/listrecentthreads")) {
map.setResponse("/mvnplugin/mvnforum/user/listrecentthreads.jsp");

} else if (requestURI.equals("/addpost")) {
map.setResponse("/mvnplugin/mvnforum/user/addpost.jsp");
} else if (requestURI.equals("/addpostprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addpostsuccess.jsp");
} else if (requestURI.equals("/editpost")) {
map.setResponse("/mvnplugin/mvnforum/user/addpost.jsp");//editpost.jsp
} else if (requestURI.equals("/updatepost")) {
map.setResponse("/mvnplugin/mvnforum/user/updatepostsuccess.jsp");
} else if (requestURI.equals("/printpost")) {
map.setResponse("/mvnplugin/mvnforum/user/printpost.jsp");
} else if (requestURI.equals("/deletepost")) {
map.setResponse("/mvnplugin/mvnforum/user/deletepost.jsp");
} else if (requestURI.equals("/deletepostprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletepostsuccess.jsp");

} else if (requestURI.equals("/addattachment")) {
map.setResponse("/mvnplugin/mvnforum/user/addattachment.jsp");
} else if (requestURI.equals("/addattachmentprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addattachmentsuccess.jsp");
} else if (requestURI.equals("/deleteattachment")) {
map.setResponse("/mvnplugin/mvnforum/user/deleteattachment.jsp");
} else if (requestURI.equals("/deleteattachmentprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deleteattachmentsuccess.jsp");
} else if (requestURI.equals("/editattachment")) {
map.setResponse("/mvnplugin/mvnforum/user/editattachment.jsp");
} else if (requestURI.equals("/editattachmentprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/editattachmentsuccess.jsp");

} else if (requestURI.equals("/viewthread")) {
map.setResponse("/mvnplugin/mvnforum/user/viewthread.jsp");
} else if (requestURI.equals("/printthread")) {
map.setResponse("/mvnplugin/mvnforum/user/printthread.jsp");

} else if (requestURI.equals("/modcp")) {
map.setResponse("/mvnplugin/mvnforum/user/modcp.jsp");
} else if (requestURI.equals("/listrecentpendingthreads")) {
map.setResponse("/mvnplugin/mvnforum/user/listrecentpendingthreads.jsp");
} else if (requestURI.equals("/listthreadswithpendingposts")) {
map.setResponse("/mvnplugin/mvnforum/user/listthreadswithpendingposts.jsp");
} else if (requestURI.equals("/listrecentthreadswithpendingposts")) {
map.setResponse("/mvnplugin/mvnforum/user/listrecentthreadswithpendingposts.jsp");
} else if (requestURI.equals("/moderatependingthreads")) {
map.setResponse("/mvnplugin/mvnforum/user/moderatependingthreads.jsp");
} else if (requestURI.equals("/moderatependingthreadsprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/moderatependingthreadssuccess.jsp");
} else if (requestURI.equals("/moderatependingposts")) {
map.setResponse("/mvnplugin/mvnforum/user/moderatependingposts.jsp");
} else if (requestURI.equals("/moderatependingpostsprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/moderatependingpostssuccess.jsp");

} else if (requestURI.equals("/listpendingthreadsxml")) {
map.setResponse("/mvnplugin/mvnforum/user/listpendingthreadsxml.jsp");

} else if (requestURI.equals("/deletethread")) {
map.setResponse("/mvnplugin/mvnforum/user/deletethread.jsp");
} else if (requestURI.equals("/deletethreadprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletethreadsuccess.jsp");

} else if (requestURI.equals("/editthreadstatus")) {
map.setResponse("/mvnplugin/mvnforum/user/editthreadstatus.jsp");
} else if (requestURI.equals("/editthreadstatusprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/editthreadstatussuccess.jsp");
} else if (requestURI.equals("/editthreadtype")) {
map.setResponse("/mvnplugin/mvnforum/user/editthreadtype.jsp");
} else if (requestURI.equals("/editthreadtypeprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/editthreadtypesuccess.jsp");

} else if (requestURI.equals("/movethread")) {
map.setResponse("/mvnplugin/mvnforum/user/movethread.jsp");
} else if (requestURI.equals("/movethreadprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/movethreadsuccess.jsp");

} else if (requestURI.equals("/viewmember")) {
map.setResponse("/mvnplugin/mvnforum/user/viewmember.jsp");
} else if (requestURI.equals("/listmembers")) {
map.setResponse("/mvnplugin/mvnforum/user/listmembers.jsp");
} else if (requestURI.equals("/editmember")) {
map.setResponse("/mvnplugin/mvnforum/user/editmember.jsp");
} else if (requestURI.equals("/updatemember")) {
map.setResponse("/mvnplugin/mvnforum/user/updatemembersuccess.jsp");

} else if (requestURI.equals("/login")) {
map.setResponse("/mvnplugin/mvnforum/user/login.jsp");
} else if (requestURI.equals("/loginprocess")) {
//map.setResponse("/mvnplugin/mvnforum/user/loginsuccess.jsp");
map.setResponse(UserModuleConfig.getUrlPattern() + "/index");
} else if (requestURI.equals("/logout")) {
map.setResponse("/mvnplugin/mvnforum/user/login.jsp");
} else if (requestURI.equals("/deletecookieprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletecookiesuccess.jsp");

} else if (requestURI.equals("/rsssummary")) {
map.setResponse("/mvnplugin/mvnforum/user/rsssummary.jsp");
} else if (requestURI.equals("/atom")) {
map.setResponse("/mvnplugin/mvnforum/user/atom.jsp");
} else if (requestURI.equals("/rss")) {
map.setResponse("/mvnplugin/mvnforum/user/rss.jsp");
} else if (requestURI.equals("/rss2")) {
map.setResponse("/mvnplugin/mvnforum/user/rss2.jsp");

} else if (requestURI.equals("/help")) {
map.setResponse("/mvnplugin/mvnforum/user/help.jsp");
} else if (requestURI.equals("/helpintro")) {
map.setResponse("/mvnplugin/mvnforum/docs/intro.html");
} else if (requestURI.equals("/helpinstall")) {
map.setResponse("/mvnplugin/mvnforum/docs/install.html");
} else if (requestURI.equals("/helpuser")) {
map.setResponse("/mvnplugin/mvnforum/docs/user.html");
} else if (requestURI.equals("/helpadmin")) {
map.setResponse("/mvnplugin/mvnforum/docs/admin.html");
} else if (requestURI.equals("/helpdeveloper")) {
map.setResponse("/mvnplugin/mvnforum/docs/developer.html");
} else if (requestURI.equals("/faq")) {
map.setResponse("/mvnplugin/mvnforum/docs/faq.html");

} else if (requestURI.equals("/search")) {
map.setResponse("/mvnplugin/mvnforum/user/search.jsp");
} else if (requestURI.equals("/searchprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/searchresult.jsp");
} else if (requestURI.equals("/searchmember")) {
map.setResponse("/mvnplugin/mvnforum/user/searchmember.jsp");
} else if (requestURI.equals("/registermember")) {
map.setResponse("/mvnplugin/mvnforum/user/addmember.jsp");
} else if (requestURI.equals("/registermemberprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addmembersuccess.jsp");

} else if (requestURI.equals("/myprofile")) {
map.setResponse("/mvnplugin/mvnforum/user/myprofile.jsp");
} else if (requestURI.equals("/changepassword")) {
map.setResponse("/mvnplugin/mvnforum/user/changepassword.jsp");
} else if (requestURI.equals("/changepasswordprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/changepasswordsuccess.jsp");
} else if (requestURI.equals("/changeemail")) {
map.setResponse("/mvnplugin/mvnforum/user/changeemail.jsp");
} else if (requestURI.equals("/changeemailprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/changeemailsuccess.jsp");
} else if (requestURI.equals("/changesignature")) {
map.setResponse("/mvnplugin/mvnforum/user/changesignature.jsp");
} else if (requestURI.equals("/changesignatureprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/changesignaturesuccess.jsp");

} else if (requestURI.equals("/changeavatar")) {
map.setResponse("/mvnplugin/mvnforum/user/changeavatar.jsp");
} else if (requestURI.equals("/uploadavatar")) {
map.setResponse(UserModuleConfig.getUrlPattern() + "/myprofile");
} else if (requestURI.equals("/updateavatar")) {
map.setResponse(UserModuleConfig.getUrlPattern() + "/myprofile");
} else if (requestURI.equals("/mywatch")) {
map.setResponse("/mvnplugin/mvnforum/user/mywatch.jsp");
} else if (requestURI.equals("/addwatch")) {
map.setResponse("/mvnplugin/mvnforum/user/addwatch.jsp");
} else if (requestURI.equals("/addwatchprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addwatchsuccess.jsp");
} else if (requestURI.equals("/deletewatchprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletewatchsuccess.jsp");

} else if (requestURI.equals("/mymessage")) {
map.setResponse("/mvnplugin/mvnforum/user/mymessage.jsp");
} else if (requestURI.equals("/addmessage")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessage.jsp");
} else if (requestURI.equals("/addmessageprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessagesuccess.jsp");
} else if (requestURI.equals("/viewmessage")) {
map.setResponse("/mvnplugin/mvnforum/user/viewmessage.jsp");
} else if (requestURI.equals("/sendmessageprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessagesuccess.jsp");
} else if (requestURI.equals("/deletemessageprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletemessagesuccess.jsp");
} else if (requestURI.equals("/processmessage")) {
map.setResponse("/mvnplugin/mvnforum/user/processmessagesuccess.jsp");
} else if (requestURI.equals("/addmessageattachment")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessageattachment.jsp");
} else if (requestURI.equals("/addmessageattachmentprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessageattachmentsuccess.jsp");

} else if (requestURI.equals("/mymessagefolder")) {
map.setResponse("/mvnplugin/mvnforum/user/mymessagefolder.jsp");
} else if (requestURI.equals("/addmessagefolder")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessagefolder.jsp");
} else if (requestURI.equals("/addmessagefolderprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addmessagefoldersuccess.jsp");
} else if (requestURI.equals("/deletemessagefolder")) {
map.setResponse("/mvnplugin/mvnforum/user/deletemessagefolder.jsp");
} else if (requestURI.equals("/deletemessagefolderprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletemessagefoldersuccess.jsp");
} else if (requestURI.equals("/updatefolderorder")) {
map.setResponse(UserModuleConfig.getUrlPattern() + "/mymessagefolder");

} else if (requestURI.equals("/listcompanies")) {
map.setResponse("/mvnplugin/mvnforum/user/listcompanies.jsp");
} else if (requestURI.equals("/companyhomepage")) {
map.setResponse("/mvnplugin/mvnforum/user/companyhomepage.jsp");

} else if (requestURI.equals("/myfavoritethread")) {
map.setResponse("/mvnplugin/mvnforum/user/myfavoritethread.jsp");
} else if (requestURI.equals("/addfavoritethreadprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/addfavoritethreadsuccess.jsp");
} else if (requestURI.equals("/deletefavoritethreadprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/deletefavoritethreadsuccess.jsp");

} else if (requestURI.equals("/iforgotpasswords")) {
map.setResponse("/mvnplugin/mvnforum/user/forgotpassword.jsp");
} else if (requestURI.equals("/forgotpasswordprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/forgotpasswordsuccess.jsp");
} else if (requestURI.equals("/resetpassword")) {
map.setResponse("/mvnplugin/mvnforum/user/resetpassword.jsp");
} else if (requestURI.equals("/resetpasswordprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/resetpasswordsuccess.jsp");

} else if (requestURI.equals("/sendactivationcode")) {
map.setResponse("/mvnplugin/mvnforum/user/sendactivationcode.jsp");
} else if (requestURI.equals("/sendactivationcodeprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/sendactivationcodesuccess.jsp");
} else if (requestURI.equals("/activatemember")) {
map.setResponse("/mvnplugin/mvnforum/user/activatemember.jsp");
} else if (requestURI.equals("/activatememberprocess")) {
map.setResponse("/mvnplugin/mvnforum/user/activatemembersuccess.jsp");
}

Locale locale = I18nUtil.getLocaleInRequest(request);
// unknown module, we throw an exception
if (map.getResponse() == null) {
//String errorMessage = "Cannot find matching entry in URLMap for '" + requestURI + "'. Please contact the administrator.";
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.MissingURLMapEntryException.cannot_find_matching_entry", new Object[] {requestURI});
throw new MissingURLMapEntryException(localizedMessage);
//throw new MissingURLMapEntryException(errorMessage);
}
return map;
}
}

我們查得最終的網頁在
if (MVNForumConfig.getEnablePortalLikeIndexPage()) {
map.setResponse("/mvnplugin/mvnforum/user/index.jsp");//index.jsp
} else {
map.setResponse("/mvnplugin/mvnforum/user/listforums.jsp");//index.jsp
}

然後可在/mvnplugin/mvnforum/user/index.jsp 見到真正的JSP網頁
這裏算是第一部份的分析完成,主要分析的為mvnforum的重導架構,至於JSP Tag,等待以後再分析
<%--
- $Header: /cvsroot/mvnforum/mvnforum/srcweb/mvnplugin/mvnforum/user/index.jsp,v 1.75 2005/01/30 18:43:41 minhnn Exp $
- $Author: minhnn $
- $Revision: 1.75 $
- $Date: 2005/01/30 18:43:41 $
-
- ====================================================================
-
- Copyright (C) 2002-2005 by MyVietnam.net
-
- This program is free software; you can redistribute it and/or
- modify it under the terms of the GNU General Public License
- as published by the Free Software Foundation; either version 2
- of the License, or any later version.
-
- All copyright notices regarding mvnForum MUST remain intact
- in the scripts and in the outputted HTML.
- The "powered by" text/logo with a link back to
- http://www.mvnForum.com and http://www.MyVietnam.net in the
- footer of the pages MUST remain visible when the pages
- are viewed on the internet or intranet.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-
- Support can be obtained from support forums at:
- http://www.mvnForum.com/mvnforum/index
-
- Correspondence and Marketing Questions can be sent to:
- info@MyVietnam.net
-
- @author: Minh Nguyen minhnn@MyVietnam.net
- @author: Mai Nguyen mai.nh@MyVietnam.net
--%>
<%@ page contentType="text/html;charset=utf-8" %>
<%@ page errorPage="fatalerror.jsp"%>
<%@ page import="java.util.*" %>
<%@ page import="com.mvnforum.db.*" %>
<%@ page import="com.mvnforum.common.*" %>
<%@ page import="com.mvnforum.MyUtil" %>
<%@ page import="com.mvnforum.auth.OnlineUserAction" %>
<%@ page import="com.mvnforum.MVNForumConstant" %>

<%@ page import="net.myvietnam.mvncore.util.DateUtil" %>
<%@ page import="net.myvietnam.mvncore.util.StringUtil" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<%@ include file="inc_common.jsp"%>
<fmt:bundle basename="mvnForum_i18n">
<html <fmt:message key="mvnforum.common.i18n.html_dir"/>>
<head>
<title><fmt:message key="mvnforum.common.forum.title_name"/> - <fmt:message key="mvnforum.common.forum.homepage"/></title>
<%@ include file="/mvnplugin/mvnforum/meta.jsp"%>
<link href="<%=onlineUser.getCssPath()%>" rel="stylesheet" type="text/css">
</head>
<body leftmargin="0" topmargin="0">
<script language="JavaScript" src="<%=contextPath%>/mvnplugin/mvnforum/js/md5.js"></script>
<%@ include file="header.jsp"%>
<script type="text/javascript">
function checkEnter(event) {
var agt=navigator.userAgent.toLowerCase();

// Maybe, Opera make an onClick event when user press enter key
// on the text field of the form
if (agt.indexOf('opera') >= 0) return;

// enter key is pressed
if (getKeyCode(event) == 13) // myvietnam.js
SubmitForm();
}

function SubmitForm() {
if (ValidateForm() == true) {
pw2md5(document.submitform.MemberMatkhau, document.submitform.md5pw);
document.submitform.submitbutton.disabled=true;
document.submitform.submit();
}
}

function ValidateForm() {
if (isBlank(document.submitform.MemberName, "<fmt:message key="mvnforum.common.member.login_name"/>")) return false;
if (isBlank(document.submitform.MemberMatkhau, "<fmt:message key="mvnforum.common.member.password"/>")) return false;
//Check Password's length
if (document.submitform.MemberMatkhau.value.length < 3) {
alert("<fmt:message key="mvnforum.common.js.prompt.invalidlongpassword"/>");
document.submitform.MemberMatkhau.focus();
return false;
}
return true;
}
</script>
<br/>

<table width="95%" align="center">
<tr class="nav">
<td><img src="<%=contextPath%>/mvnplugin/mvnforum/images/nav.gif"></td>
<td width="100%" nowrap>
<a class="nav" href="index"><fmt:message key="mvnforum.common.nav.index"/></a>&nbsp;&raquo;&nbsp;
<fmt:message key="mvnforum.common.forum.homepage"/>
</td>
</tr>
</table>
<br/>

<table align="center" border="0" cellpadding="0" cellspacing="0" width="95%">
<tr>
<!-- Left section -->
<td width="25%" valign="top">
<!-- Browse Forum Category -->
<%if (onlineUser.isMember()) {%>
<table class="tborder" border="0" cellspacing="1" cellpadding="4" width="100%">
<tr>
<td align="center" class="theader"><fmt:message key="mvnforum.user.header.welcome"/> <font color="#FF0000"><%=memberName%></font></td>
</tr>
<tr>
<td class="trow1">
<fmt:message key="mvnforum.user.index.current_time"/>: <%=onlineUser.getGMTTimestampFormat(DateUtil.getCurrentGMTTimestamp())%><br>
<a href="logout" class="command"><fmt:message key="mvnforum.user.header.logout"/></a>
</td>
</tr>
</table>

<%} else { %>
<table class="tborder" border="0" cellspacing="1" cellpadding="4" width="100%">
<tr>
<td align="center" class="theader">
<fmt:message key="mvnforum.user.header.welcome"/> <%= ((memberName!=null) && (memberName.length()>0)) ? memberName : MVNForumConfig.getDefaultGuestName()%>
</td>
</tr>
<%if (MVNForumConfig.getEnableLogin()) {%>
<tr>
<td class="trow1">
<form action="loginprocess" method="post" name="submitform">
<input type="hidden" name="FromLoginPage" value="true">
<input type="hidden" name="md5pw" value="">
<fmt:message key="mvnforum.common.member.login_name"/><br/>
<input type="text" name="MemberName" size="15"><br/>
<fmt:message key="mvnforum.common.member.password"/><br/>
<input type="password" name="MemberMatkhau" size="15" onKeyPress="checkEnter(event);"><br/><br/>
<input type="button" name="submitbutton" value="<fmt:message key="mvnforum.user.login.button.login"/>" onclick="javascript:SubmitForm();" class="mainoption"><br/>
</form>
<a href="iforgotpasswords" class="command"><fmt:message key="mvnforum.user.login.forgot_password"/></a>
</td>
</tr>
<% } %>
</table>
<% } %>
<%
//Copy code from listonlineusers.jsp
Collection onlineUserActions = (Collection)request.getAttribute("OnlineUserActions");

if (MVNForumConfig.getEnableOnlineUsers()) {
int guestCount = 0;
int memberCount = 0;
int invisibleMemberCount = 0;
boolean enableInvisible = MVNForumConfig.getEnableInvisibleUsers();
for (Iterator countIterator = onlineUserActions.iterator(); countIterator.hasNext(); ) {
OnlineUserAction onlineUserAction = (OnlineUserAction)countIterator.next();
boolean invisible = onlineUserAction.isInvisibleMember();
int mID = onlineUserAction.getMemberID();
if ( (mID==0) || (mID==MVNForumConstant.MEMBER_ID_OF_GUEST) ) {
guestCount++;
} else if (enableInvisible) {
if ( invisible ) {
invisibleMemberCount++;
} else {
memberCount++;
}
} else { // disable invisible feature
memberCount++;
}
} // end of for%>
<br/>
<table class="tborder" border="0" cellspacing="1" cellpadding="4" width="100%">
<tr>
<td align="center" class="theader"><fmt:message key="mvnforum.user.header.who_online"/></td>
</tr>
<tr>
<td class="trow1">
<fmt:message key="mvnforum.common.there_are"/> <b><%=onlineUserActions.size()%></b> <fmt:message key="mvnforum.common.online_users"/>
(<b><%=guestCount%></b> <%if(guestCount>1) {%><fmt:message key="mvnforum.common.guests"/><%} else {%><fmt:message key="mvnforum.common.guest"/><%}%>,
<b><%=memberCount%></b> <%if(memberCount>1){%><fmt:message key="mvnforum.common.members"/><%} else {%><fmt:message key="mvnforum.common.member"/><%}%>
<%if (enableInvisible) {%>
,<%-- last comma if folling exists --%>
<b><%=invisibleMemberCount%></b> <%if(invisibleMemberCount>1){%><fmt:message key="mvnforum.common.member.online.invisible_member"/><%} else {%><fmt:message key="mvnforum.common.member.online.invisible_member"/><%}%>
<%}%>
)<br/> <%-- second bracket --%><fmt:message key="mvnforum.user.header.who_online"/>:
<%boolean canAdmin = permission.canAdminSystem();
for (Iterator iterator = onlineUserActions.iterator(); iterator.hasNext(); ) {
OnlineUserAction onlineUserAction = (OnlineUserAction)iterator.next();
boolean userInvisible = onlineUserAction.isInvisibleMember();
int mID = onlineUserAction.getMemberID();
String mName = onlineUserAction.getMemberName();
if ( (mID!=0) && (mID!=MVNForumConstant.MEMBER_ID_OF_GUEST) ) { %>
<%if ( enableInvisible && userInvisible && !canAdmin) { %>
<span class="memberName"><fmt:message key="mvnforum.common.member.online.invisible_member"/></span>
<%} else {%>
<a href="viewmember?memberid=<%=mID%>" class="memberName"><%=mName%></a>
<%if (enableInvisible && userInvisible && canAdmin) { %>(<fmt:message key="mvnforum.common.member.online.invisible"/>)<%}%>
<%}%>
<%if (onlineUserAction.getSessionCount() > 1) { %>
(<%=onlineUserAction.getSessionCount()%> <fmt:message key="mvnforum.common.member.online.sessions"/>)
<%}%>
<% } /*if (not guest)*/%>
<%} /*for*/%>
<br/>
<a href="listonlineusers" class="command"><fmt:message key="mvnforum.user.listonlineusers.table.what_are_doing"/></a>
</td>
</tr>
</table>
<br/>
<%}// end if enable online user%>

<%if (MVNForumConfig.getEnableMostActiveThreads()) {
Collection mostActiveThreads = (Collection)request.getAttribute("MostActiveThreads");
%>
<table class="tborder" border="0" cellspacing="1" cellpadding="3" width="100%">
<tr>
<td align="center" nowrap class="theader"><fmt:message key="mvnforum.common.most_active_threads_since_last_week"/></td>
</tr>
<% int index = 0;
for (Iterator iter = mostActiveThreads.iterator(); iter.hasNext(); ) {
ActiveThread thread = (ActiveThread)iter.next();
int postCount = thread.getLastPostCount(); %>
<tr class="trow<%=index++%2 + 1%>">
<td class="messageText">
<% String typeImage = "";
switch (thread.getThreadType()) {
case ThreadBean.THREAD_TYPE_STICKY: typeImage = "sticky.gif"; break;
case ThreadBean.THREAD_TYPE_FORUM_ANNOUNCEMENT: typeImage = "announce.gif"; break;
case ThreadBean.THREAD_TYPE_GLOBAL_ANNOUNCEMENT: typeImage = "global_announce.gif"; break;
default:break;
} %>
<% if ( thread.getThreadType() != ThreadBean.THREAD_TYPE_DEFAULT) { %>
<img src="<%=contextPath%>/mvnplugin/mvnforum/images/icon/<%=typeImage%>"/>
<% }%>
<% if ( thread.getAttachCount() > 0) {%>
<img src="<%=contextPath%>/mvnplugin/mvnforum/images/icon/attach.gif" title="<%=thread.getAttachCount()%> <% if (thread.getAttachCount() == 1) {%><fmt:message key="mvnforum.common.attachment"/><% } else {%><fmt:message key="mvnforum.common.attachments"/><%}%>"/>
<% } %>
<a href="viewthread?thread=<%=thread.getThreadID()%>" class="command"><%=thread.getThreadTopic()%></a>
(<b><%=postCount%></b> <% if (postCount == 1) {%><fmt:message key="mvnforum.common.new_post"/><% } else { %><fmt:message key="mvnforum.common.new_posts"/><% } %>)
</td>
</tr>
<% } //for %>
<% if (mostActiveThreads.size() == 0) { %>
<tr class="trow1">
<td align="center"><fmt:message key="mvnforum.common.no_active_threads"/></td>
</tr>
<% }// if no active threads %>
</table>
<br/>
<%} // end enable most active threads %>
<%if (MVNForumConfig.getEnableMostActiveMembers() ) {%>
<table class="tborder" border="0" cellspacing="1" cellpadding="3" width="100%">
<tr>
<td align="center" nowrap class="theader"><fmt:message key="mvnforum.common.most_active_members_since_last_week"/></td>
</tr>
<%Collection mostActiveMembers = (Collection)request.getAttribute("MostActiveMembers");
int index = 0;
for (Iterator iter = mostActiveMembers.iterator(); iter.hasNext(); ) {
ActiveMember member = (ActiveMember)iter.next();
int postCount = member.getLastPostCount(); %>
<tr class="trow<%=index++%2 + 1%>">
<td class="messageText">
<a href="viewmember?memberid=<%=member.getMemberID()%>" class="command"><%=member.getMemberName()%></a>
(<%=postCount%>
<% if (postCount == 1) {%><fmt:message key="mvnforum.common.new_post"/><% } else { %><fmt:message key="mvnforum.common.new_posts"/><% } %>)
</td>
</tr>
<% } %>
<% if (mostActiveMembers.size() == 0) { %>
<tr class="trow1">
<td align="center"><fmt:message key="mvnforum.common.no_active_members"/></td>
</tr>
<% }// if no active members %>
</table>
<br/>
<%} // end if enable most active members%>
<%
CategoryCache categoryCache = CategoryCache.getInstance();
ForumCache forumCache = ForumCache.getInstance();
Collection categoryBeans = categoryCache.getBeans();
Collection forumBeans = forumCache.getBeans();
if (MVNForumConfig.getEnableSiteStatisticsOverview()) {

int numberOfThreads = MyUtil.getViewableThreads(forumBeans, permission);
int numberOfPosts = MyUtil.getViewablePosts(forumBeans, permission);
MemberBean lastMember = (MemberBean)request.getAttribute("MemberBean");
long numberOfMembers = ((Integer)request.getAttribute("NumberOfMembers")).intValue();
%>
<table class="tborder" border="0" cellspacing="1" cellpadding="3" width="100%">
<tr>
<td align="center" class="theader"><fmt:message key="mvnforum.common.statistic"/></td>
</tr>
<tr>
<td class="trow1">
<fmt:message key="mvnforum.common.totalcategories"/>: <b><%=MyUtil.getViewableCategories(categoryBeans, permission)%></b><br/>
<fmt:message key="mvnforum.common.totalforum"/>: <b><%=MyUtil.getViewableForums(forumBeans, permission)%></b><br/>
<fmt:message key="mvnforum.common.totaltopic"/>: <b><%=numberOfThreads%></b><br/>
<fmt:message key="mvnforum.common.totalpost"/>: <b><%=numberOfPosts%></b><br/>
<fmt:message key="mvnforum.common.totalmember"/>: <b><%=numberOfMembers%></b><br/>
<fmt:message key="mvnforum.common.latestmember"/>: <a href="viewmember?memberid=<%=lastMember.getMemberID()%>" class="memberName"><%=lastMember.getMemberName()%></a><br/>
</td>
</tr>
</table>
<br/>
<%} // end if enable show forum statistics%>
<table class="tborder" border="0" cellspacing="1" cellpadding="3" width="100%">
<tr>
<td align="center" class="theader"><a href="listforums" class="theader"><fmt:message key="mvnforum.user.listforums.title"/></a></td>
</tr>
<% int categoryCount = 0;
for (Iterator categoryIterator = categoryBeans.iterator(); categoryIterator.hasNext(); ) {
CategoryBean categoryBean = (CategoryBean)categoryIterator.next();
if (MyUtil.canViewAnyForumInCategory(categoryBean.getCategoryID(), permission) == false) continue;
categoryCount++;
%>
<tr>
<td align="center" class="tcat">
<b><%=categoryBean.getCategoryName()%></b>
<a onclick="showhide('category_<%=categoryBean.getCategoryID()%>');return false" href="javascript:void(0)">
<img align="middle" border="0" height="13" width="14" src="<%=contextPath%>/mvnplugin/mvnforum/images/icon/arrow-subnav-down.gif"></a>
</td>
</tr>
<tbody id="category_<%=categoryBean.getCategoryID()%>">
<% int i = 0;
for (Iterator forumIterator = forumBeans.iterator(); forumIterator.hasNext(); ) {
ForumBean forumBean = (ForumBean)forumIterator.next();
if (forumBean.getCategoryID() == categoryBean.getCategoryID()) {
if (permission.canReadPost(forumBean.getForumID()) && (forumBean.getForumStatus() != ForumBean.FORUM_STATUS_DISABLED) ) { %>
<tr>
<td align="center" class="trow<%=(i++%2)+1%>"><a href="listthreads?forum=<%=forumBean.getForumID()%>"><%=forumBean.getForumName()%></a></td>
</tr>
<%}
}
}//for %>
</tbody>
<% }// end loop on category
if ( categoryCount == 0 ) {%>
<tr>
<td align="center" class="trow1">
<fmt:message key="mvnforum.user.listforums.table.no_category"/>
</td>
</tr>
<% } %>
</table>
</td>
<!-- End of left section -->
<td style="width: 5px;">&nbsp;&nbsp;</td>
<!-- Center section -->
<%
Collection coLastPosts = (Collection)request.getAttribute("LastPosts");
%>
<td width="80%" valign="top">
<table class="tborder" border="0" cellpadding="4" cellspacing="1" width="100%">
<tr>
<td class="theader"><fmt:message key="mvnforum.user.index.last_post_in_each_forum"/></td>
</tr>
</table>
<%
int i = 0;
for (Iterator postIterator = coLastPosts.iterator(); postIterator.hasNext(); ) {
List infoList = (List)postIterator.next();
PostBean postBean = (PostBean)infoList.get(0);
ThreadBean threadBean = (ThreadBean)infoList.get(1);
ForumBean forumBean = forumCache.getBean(threadBean.getForumID());
if (permission.canReadPost(postBean.getForumID()) && (forumBean.getForumStatus() != ForumBean.FORUM_STATUS_DISABLED) ) {
i++;
%>
<table class="tborder" border="0" cellpadding="4" cellspacing="1" width="100%">
<tr>
<td class="trow<%=(i%2)+1%>">
<fmt:message key="mvnforum.common.forum"/>: <a href="listthreads?forum=<%=threadBean.getForumID()%>"><%=forumBean.getForumName()%></a> &raquo;
<fmt:message key="mvnforum.common.thread"/>: <a href="viewthread?thread=<%=threadBean.getThreadID()%>"><%=threadBean.getThreadTopic()%></a>
</td>
</tr>
<tr>
<td class="trow<%=(i%2)+1%>">
<fmt:message key="mvnforum.common.post.post_by"/> <a href="viewmember?memberid=<%=postBean.getMemberID()%>" class="memberName"><%=postBean.getMemberName()%></a>
<fmt:message key="mvnforum.common.at"/> <%=onlineUser.getGMTTimestampFormat(postBean.getPostCreationDate())%>
</td>
</tr>
<tr>
<td class="trow<%=(i%2)+1%>">
<b><%=MyUtil.filter(postBean.getPostTopic(), false/*html*/, true/*emotion*/, true/*mvnCode*/, false/*newLine*/, false/*URL*/)%></b><br/>
<%=MyUtil.filter(StringUtil.getShorterString(postBean.getPostBody(), MVNForumConfig.getMaxCharsInLongSummary()), false/*html*/, true/*emotion*/, true/*mvnCode*/, true/*newLine*/, true/*URL*/)%>
</td>
</tr>
<tr>
<td class="trow<%=(i%2)+1%>">
<fmt:message key="mvnforum.common.reply_count"/>: <%=threadBean.getThreadReplyCount()%> ::
<% if (MVNForumConfig.getEnableNewPost() && (onlineUser.isGuest()||permission.canAddPost(forumBean.getForumID())) && (threadBean.getThreadStatus()==ThreadBean.THREAD_STATUS_DEFAULT) && (forumBean.getForumStatus()==ForumBean.FORUM_STATUS_DEFAULT) ) { %>
<a href="addpost?parent=<%=postBean.getPostID()%>" class="command"><fmt:message key="mvnforum.user.viewthread.link.reply_post"/></a>
<% }//if can new post%>
</td>
</tr>
</table>
<br/>
<% }
}%>
<% if ( i == 0 ) { %>
<table class="tborder" border="0" cellpadding="4" cellspacing="1" width="100%">
<tr>
<td align="center" class="trow1"><fmt:message key="mvnforum.user.index.no_post"/></td>
</tr>
</table>
<%}%>
</td>
<!-- End of Center section -->
<%--
[minhnn]: I comment out this as a default for most site, if you need a
right column for logo advertisement, please uncomment it.

<td style="width: 5px;">&nbsp;&nbsp;</td>
<!-- Right section -->
<td width="30%" valign="top">
<table class="tborder" border="0" cellspacing="1" cellpadding="4" width="100%">
<tr>
<td align="center" class="theader">Advertisement</td>
</tr>
<tr>
<td class="trow1">
<a href="http://www.mvnforum.com"><img src="<%=contextPath%>/mvnplugin/mvnforum/images/logo.gif" border="0" alt="mvnForum" title="mvnForum"></a>
</td>
</tr>
<tr>
<td class="trow2">
<a href="http://www.mvnforum.com"><img src="<%=contextPath%>/mvnplugin/mvnforum/images/logo.gif" border="0" alt="mvnForum" title="mvnForum"></a>
</td>
</tr>
</table>
</td>
<!-- End of Right section -->
--%>
</tr>
</table>

<br/>
</fmt:bundle>
<%@ include file="footer.jsp"%>
</body>
</html>

回頭查看com.mvnforum.user.ForumUserServlet

public String postProcess(HttpServletRequest request, HttpServletResponse response, String responseURI) {
return responseURI;
}

姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
摩客空间2.0为您提供手机和互联网同步的个人空间,带给你不一样的体验