#
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/ManagerFactory.java,v 1.6 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.6 $
* $Date: 2005/01/18 11:52:08 $
*
* ====================================================================
*
* 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: Luis Miguel Hernanz <luish@germinus.com>
* @author: Minh Nguyen minhnn@MyVietnam.net
*/
package com.mvnforum;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mvnforum.auth.Authenticator;
import com.mvnforum.auth.OnlineUserFactory;
/**
* Instance that returns the right implementation for the different
* parts of the mvnforum system.
*
* @author <a href="luish@germinus.com">Luis Miguel Hernanz</a>
* @version $Revision: 1.6 $
*/
// @todo : split this class to new class DAOFactory
public class ManagerFactory {
private static Log log = LogFactory.getLog(ManagerFactory.class);
/**
* Creates a new <code>ManagerFactory</code> instance.
*/
protected ManagerFactory() {}
private static OnlineUserFactory onlineUserFactory = null;
private static Authenticator authenticator = null;
private static RequestProcessor requestProcessor = null;
public static synchronized OnlineUserFactory getOnlineUserFactory() {
if (onlineUserFactory == null) {
try {
Class c = Class.forName(MVNForumFactoryConfig.getOnlineUserFactoryClassName());
onlineUserFactory = (OnlineUserFactory) c.newInstance();
log.info("onlineUserFactory = " + onlineUserFactory);
} catch (Exception e) {
log.error("Error returning the online user factory.", e);
throw new RuntimeException(e.getMessage());
}
}
return onlineUserFactory;
}
public static synchronized Authenticator getAuthenticator() {
try {
String authenticatorClass = MVNForumFactoryConfig.getAuthenticatorClassName();
if ((null != authenticatorClass) && !authenticatorClass.trim().equals("")) {
log.debug("Using the authenticator: " + authenticatorClass);
if (authenticator == null) {
Class c = Class.forName(authenticatorClass);
authenticator = (Authenticator) c.newInstance();
log.info("authenticator = " + authenticator);
}
return authenticator;
}
} catch (Exception e){
log.error("Error getting the authentication object", e);
}
return null;
}
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;
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/URLMap.java,v 1.3 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.3 $
* $Date: 2005/01/18 11:52:08 $
*
* ====================================================================
*
* 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
*/
package com.mvnforum;
public class URLMap {
private String response = null;
public URLMap() {
}
public void setResponse(String newvalue) {
response = newvalue;
}
public String getResponse() {
return response;
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/RequestProcessorDefault.java,v 1.3 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.3 $
* $Date: 2005/01/18 11:52:08 $
*
* ====================================================================
*
* 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: Luis Miguel Hernanz <luish@germinus.com>
* @author: Minh Nguyen minhnn@MyVietnam.net
*/
package com.mvnforum;
import java.io.UnsupportedEncodingException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Empty implementation of the RequestProcessor interface.
*
* @author <a href="luish@germinus.com">Luis Miguel Hernanz</a>
* @version $Revision: 1.3 $
*/
public class RequestProcessorDefault implements RequestProcessor {
private static Log log = LogFactory.getLog(RequestProcessorDefault.class);
/**
* This is the first method called in the request processing. This
* method returns always <code>null</code>.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
*/
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;
}
/**
* The method receives the user request just before the
* authentication has been checked. This method always returns
* <code>null</code>.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
*/
public String preProcess(HttpServletRequest request, HttpServletResponse response) {
return null;
}
/**
* This method is called just before the call to the final request
* dispatcher forward. This method always returns
* <code>responseURI</code>.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
* @param responseURI the path to which the control will be
* forwarded after this method has finished.
*/
public String postProcess(HttpServletRequest request, HttpServletResponse response, String responseURI) {
return responseURI;
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/RequestProcessor.java,v 1.3 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.3 $
* $Date: 2005/01/18 11:52:08 $
*
* ====================================================================
*
* 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: Luis Miguel Hernanz <luish@germinus.com>
* @author: Minh Nguyen minhnn@MyVietnam.net
*/
package com.mvnforum;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Interface to hook additional preprocessing to the user request.
* This interface is meatn as extension points to ease the integration
* of the forum system with external systems.
*
* @author <a href="luish@germinus.com">Luis Miguel Hernanz</a>
* @version $Revision: 1.3 $
*/
public interface RequestProcessor {
/**
* This is the first method called in the request processing.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
* @return the new responseURI to redirect to. The control will be
* forwarded to this page (if responseURI is an jsp). No furher
* processing will take place.
*/
public String preLogin(HttpServletRequest request, HttpServletResponse response);
/**
* The method receives teh user request just before the
* authentication has been checked.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
* @return the new responseURI to redirect to.
*/
public String preProcess(HttpServletRequest request, HttpServletResponse response);
/**
* This method is called just before the call to the final request
* dispatcher forward.
*
* @param request a <code>HttpServletRequest</code> value
* @param response a <code>HttpServletResponse</code> value
* @param responseURI the path to which the control will be
* forwarded after this method has finished.
* @return the new responseURI to redirect to.
*/
public String postProcess(HttpServletRequest request, HttpServletResponse response, String responseURI);
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MyUtil.java,v 1.30 2005/01/29 11:58:09 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.30 $
* $Date: 2005/01/29 11:58:09 $
*
* ====================================================================
*
* 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
*/
package com.mvnforum;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.*;
import javax.servlet.ServletContext;
import javax.servlet.http.*;
import com.mvnforum.auth.*;
import com.mvnforum.common.PrivateMessageUtil;
import com.mvnforum.db.*;
import com.mvnforum.search.member.MemberIndexer;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import net.myvietnam.mvncore.MVNCoreInfo;
import net.myvietnam.mvncore.exception.*;
import net.myvietnam.mvncore.filter.*;
import net.myvietnam.mvncore.util.*;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MyUtil {
private static Log log = LogFactory.getLog(MyUtil.class);
private static RankCache rankCache = RankCache.getInstance();
public static String filter(String input, boolean enableHTML, boolean enableEmotion,
boolean enableMVNCode, boolean enableNewLine, boolean enableURL) {
String output = input;
if (enableHTML) {
output = EnableHtmlTagFilter.filter(output);
} else {
output = DisableHtmlTagFilter.filter(output);
}
if (enableEmotion) {
output = EnableEmotionFilter.filter(output, ParamUtil.getContextPath() + MVNForumGlobal.EMOTION_DIR);
}
if (enableMVNCode) {
output = EnableMVNCodeFilter.filter(output);
}
if (enableNewLine) {
output = HtmlNewLineFilter.filter(output);
}
if (enableURL) {
output = URLFilter.filter(output);
}
return output;
}
public static String getMemberTitle(int postCount) {
String title = "";
try {
ArrayList rankBeans = rankCache.getBeans();
for (int i = 0; i < rankBeans.size(); i++) {
RankBean rankBean = (RankBean)rankBeans.get(i);
if (rankBean.getRankMinPosts() <= postCount) {
title = EnableMVNCodeFilter.filter(rankBean.getRankTitle());
} else {
break;
}
}//for
} catch (Exception ex) {
log.error("Exception in getMemberTitile", ex);
}
return title;
}
public static String getForumIconName(long lastLogon, long lastPost) {
String forumIcon = null;
if (lastLogon > lastPost) {// no new post
forumIcon = "f_norm_no.gif";
} else {// new post
forumIcon = "f_norm_new.gif";
}
return forumIcon;
}
public static String getThreadIconName(long lastLogon, long lastPost, int postCount) {
String threadIcon = null;
if (postCount < MVNForumConfig.getHotTopicThreshold()) {//not hot topic
if (lastLogon > lastPost) {// no new post
threadIcon = "f_norm_no.gif";
} else {// new post
threadIcon = "f_norm_new.gif";
}
} else {// hot topic
if (lastLogon > lastPost) {// no new post
threadIcon = "f_hot_no.gif";
} else {// new post
threadIcon = "f_hot_new.gif";
}
}
return threadIcon;
}
public static String getThreadStatusName(Locale locale, int threadStatus) {
String result = null;
switch (threadStatus) {
case ThreadBean.THREAD_STATUS_DEFAULT:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.status.normal");
break;
case ThreadBean.THREAD_STATUS_DISABLED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.status.disabled");
break;
case ThreadBean.THREAD_STATUS_LOCKED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.status.locked");
break;
case ThreadBean.THREAD_STATUS_CLOSED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.status.closed");
break;
default:
//throw new AssertionException("Cannot find matching thread status.");
}
return result;
}
public static String getThreadTypeName(Locale locale, int threadType) {
String result = "Unknown";
switch (threadType) {
case ThreadBean.THREAD_TYPE_DEFAULT:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.type.normal_thread");
break;
case ThreadBean.THREAD_TYPE_STICKY:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.type.sticky_thread");
break;
case ThreadBean.THREAD_TYPE_FORUM_ANNOUNCEMENT:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.type.announcement_thread");
break;
case ThreadBean.THREAD_TYPE_GLOBAL_ANNOUNCEMENT:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.thread.type.global_announcement_thread");
break;
default:
//throw new AssertionException("Cannot find matching thread type.");
}
return result;
}
public static String getForumStatusName(Locale locale, int forumStatus) {
String result = null;
switch (forumStatus) {
case ForumBean.FORUM_STATUS_DEFAULT:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.forum.status.normal");
break;
case ForumBean.FORUM_STATUS_DISABLED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.forum.status.disabled");
break;
case ForumBean.FORUM_STATUS_LOCKED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.forum.status.locked");
break;
case ForumBean.FORUM_STATUS_CLOSED:
result = MVNForumResourceBundle.getString(locale, "mvnforum.common.forum.status.closed");
break;
default:
//throw new AssertionException("Cannot find matching forum status.");
}
return result;
}
public static boolean canViewAnyForumInCategory(int categoryID, MVNForumPermission permission) {
try {
Collection forumBeans = ForumCache.getInstance().getBeans();
for (Iterator iter = forumBeans.iterator(); iter.hasNext(); ) {
ForumBean forumBean = (ForumBean)iter.next();
if (forumBean.getCategoryID() == categoryID) {
if (canViewForum(forumBean, permission)) {
return true;
}
}
}
} catch (DatabaseException ex) {
log.error("Cannot load the data in table Forum", ex);
}
return false;
}
public static boolean canViewForum(ForumBean forumBean, MVNForumPermission permission) {
if (permission.canReadPost(forumBean.getForumID()) &&
(forumBean.getForumStatus() != ForumBean.FORUM_STATUS_DISABLED) ) {
return true;
}
return false;
}
public static int getViewablePosts(Collection forumBeans, MVNForumPermission permission) {
int count = 0;
for (Iterator iter = forumBeans.iterator(); iter.hasNext(); ) {
ForumBean forumBean = (ForumBean)iter.next();
if (canViewForum(forumBean, permission)) {
count += forumBean.getForumPostCount();
}
}
return count;
}
public static int getViewableThreads(Collection forumBeans, MVNForumPermission permission) {
int count = 0;
for (Iterator iter = forumBeans.iterator(); iter.hasNext(); ) {
ForumBean forumBean = (ForumBean)iter.next();
if (canViewForum(forumBean, permission)) {
count += forumBean.getForumThreadCount();
}
}
return count;
}
public static int getViewableForums(Collection forumBeans, MVNForumPermission permission) {
int count = 0;
for (Iterator iter = forumBeans.iterator(); iter.hasNext(); ) {
ForumBean forumBean = (ForumBean)iter.next();
if (canViewForum(forumBean, permission)) {
count++;
}
}
return count;
}
public static int getViewableCategories(Collection categoryBeans, MVNForumPermission permission) {
int count = 0;
for (Iterator iter = categoryBeans.iterator(); iter.hasNext(); ) {
CategoryBean categoryBean = (CategoryBean)iter.next();
if (canViewAnyForumInCategory(categoryBean.getCategoryID(), permission)) {
count++;
}
}
return count;
}
/**
* Get the String with a slash character '/' before the locale name
* @param localeName the user's preferred locale
* @return the String with a slash character '/' before the locale name if
* this locale is configed to support it. Otherwise,
* an empty String will be return
*/
public static String getLocaleNameAndSlash(String localeName) {
if ( (localeName == null) || (localeName.length() == 0) ) {
return "";
}
String retValue = "";
String[] supportedLocales = MVNForumConfig.getSupportedLocaleNames();
if (supportedLocales == null) {
log.error("Assertion in MyUtil.getLocaleNameAndSlash. Please check your configuration.");
return "";
}
for (int i = 0; i < supportedLocales.length; i++) {
if (localeName.equals(supportedLocales[i])) {
retValue = "/" + localeName;
break;
}
}
return retValue;
}
public static String getCompanyCssPath(CompanyBean companyBean, String contextPath) {
String cssPath = null;
if (companyBean.getCompanyCss().length() > 0) {
cssPath = companyBean.getCompanyCss();
} else {
// use default company css
cssPath = MVNForumGlobal.COMPANY_DEFAULT_CSS_PATH;
}
return contextPath + cssPath;
}
public static String getCompanyLogoPath(CompanyBean companyBean, String contextPath) {
String logoPath = null;
if (companyBean.getCompanyLogo().length() > 0) {
logoPath = companyBean.getCompanyLogo();
} else {
// use default company logo
logoPath = MVNForumGlobal.COMPANY_DEFAULT_LOGO_PATH;
}
return contextPath + logoPath;
}
/**
* Get the locale from locale name
* @param localeName : in this format la_CO_VA, eg. en_US
* @return the locale instance of the localeName
*/
public static Locale getLocale(String localeName) {
// now, find out the 3 elements of a locale: language, country, variant
String[] localeElement = StringUtil.getStringArray(localeName, "_");
String language = "";
String country = "";
String variant = "";
if (localeElement.length >= 1) {
language = localeElement[0];
}
if (localeElement.length >= 2) {
country = localeElement[1];
}
if (localeElement.length >= 3) {
variant = localeElement[2];
}
return new Locale(language, country, variant);
}
public static void ensureCorrectCurrentPassword(HttpServletRequest request)
throws BadInputException, AssertionException, DatabaseException, AuthenticationException {
OnlineUser onlineUser = OnlineUserManager.getInstance().getOnlineUser(request);
OnlineUserFactory onlineUserFactory = ManagerFactory.getOnlineUserFactory();
try {
if (onlineUser.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_REALM) {
onlineUserFactory.ensureCorrectPassword(onlineUser.getMemberName(), OnlineUserManager.PASSWORD_OF_METHOD_REALM, true);
} else if (onlineUser.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION) {
if(MVNForumConfig.getEnablePasswordlessAuth()) {
// dont need password
onlineUserFactory.ensureCorrectPassword(onlineUser.getMemberName(), OnlineUserManager.PASSWORD_OF_METHOD_CUSTOMIZATION, true);
} else {
// must have password
// @todo: implement this case by using Authenticator
onlineUserFactory.ensureCorrectPassword(onlineUser.getMemberName(), OnlineUserManager.PASSWORD_OF_METHOD_CUSTOMIZATION, true);
}
} else {
//This user did not login by REALM or CUSTOMIZATION
String memberPassword = "";
String memberPasswordMD5 = ParamUtil.getParameter(request, "md5pw", false);
if (memberPasswordMD5.length() == 0 || (memberPasswordMD5.endsWith("==") == false)) {
// md5 is not valid, try to use unencoded password method
memberPassword = ParamUtil.getParameterPassword(request, "MemberCurrentMatkhau", 3, 0);
}
if (memberPassword.length() > 0) {
// that is we cannot find the md5 password
onlineUserFactory.ensureCorrectPassword(onlineUser.getMemberName(), memberPassword, false);
} else {
// have the md5, go ahead
onlineUserFactory.ensureCorrectPassword(onlineUser.getMemberName(), memberPasswordMD5, true);
}
}
} catch (AuthenticationException e) {
Locale locale = I18nUtil.getLocaleInRequest(request);
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.wrong_password");
throw new BadInputException(localizedMessage);
//throw new BadInputException("You have typed the wrong password. Cannot proceed.");
}
}
public static void writeMvnForumImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
BufferedImage image = MVNForumInfo.getImage();
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
encoder.encode(image);
outputStream.flush();
} catch (IOException ex) {
throw ex;
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException ex) { }
}
}
}
public static void writeMvnCoreImage(HttpServletRequest request, HttpServletResponse response) throws IOException {
BufferedImage image = MVNCoreInfo.getImage();
OutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
response.setContentType("image/jpeg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outputStream);
encoder.encode(image);
outputStream.flush();
} catch (IOException ex) {
throw ex;
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException ex) { }
}
}
}
public static void checkClassName(Locale locale, String className, boolean required) throws BadInputException {
if (required == false) {
if (className.length() == 0) return;
}
try {
Class.forName(className);
} catch (ClassNotFoundException ex) {
throw new BadInputException("Cannot load class: " + className);
}
}
public static void saveVNTyperMode(HttpServletRequest request, HttpServletResponse response) {
String vnTyperMode = ParamUtil.getParameter(request, "vnselector");
if (vnTyperMode.equals("VNI") || vnTyperMode.equals("TELEX") ||
vnTyperMode.equals("VIQR") || vnTyperMode.equals("NOVN")) {
Cookie typerModeCookie = new Cookie(MVNForumConstant.VN_TYPER_MODE, vnTyperMode);
typerModeCookie.setPath("/");
response.addCookie(typerModeCookie);
}
}
public static Hashtable checkMembers(String[] memberNames, Locale locale)
throws AssertionException, DatabaseException, BadInputException {
Hashtable memberMap = new Hashtable();
boolean isFailed = false;
StringBuffer missingNames = new StringBuffer(512);
for (int i = 0; i < memberNames.length; i++) {
int receivedMemberID = -1;
String memberName = memberNames[i];
StringUtil.checkGoodName(memberName);
try {
receivedMemberID = DAOFactory.getMemberDAO().getMemberIDFromMemberName(memberName);
} catch (ObjectNotFoundException ex) {
isFailed = true;
if (missingNames.length() > 0) {
missingNames.append(", ");
}
missingNames.append(memberName);
continue;
}
memberMap.put(new Integer(receivedMemberID), memberName);
} // end for
if (isFailed) { // the receivers does not exist.
String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.BadInputException.receivers_are_not_members", new Object[] {missingNames});
throw new BadInputException(localizedMessage);
}
return memberMap;
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumResourceBundle.java,v 1.6 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.6 $
* $Date: 2005/01/18 11:52:08 $
*
* ====================================================================
*
* 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: Pavel Av
*/
package com.mvnforum;
import java.util.Locale;
import java.util.ResourceBundle;
import net.myvietnam.mvncore.i18n.CacheResourceBundle;
public class MVNForumResourceBundle {
private static CacheResourceBundle cacheResourceBundle = new CacheResourceBundle(MVNForumGlobal.RESOURCE_BUNDLE_NAME);
private MVNForumResourceBundle() {
}
public static ResourceBundle getResourceBundle(Locale locale) {
return cacheResourceBundle.getResourceBundle(locale);
}
public static String getString(Locale locale, String key) {
return cacheResourceBundle.getString(locale, key);
}
public static String getString(Locale locale, String key, Object[] args) {
return cacheResourceBundle.getString(locale, key, args);
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumInfo.java,v 1.36.2.2 2005/06/17 17:53:37 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.36.2.2 $
* $Date: 2005/06/17 17:53:37 $
*
* ====================================================================
*
* 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
*/
package com.mvnforum;
import java.awt.*;
import java.awt.image.BufferedImage;
public class MVNForumInfo {
private MVNForumInfo() {
}
private static String PRODUCT_NAME = "mvnForum";
private static String PRODUCT_DESC = "mvnForum 1.0.0 RC4 Update 4";
private static String PRODUCT_VERSION = "1.0.0-RC4_04";
private static String PRODUCT_RELEASE_DATE = "18 June 2005";
private static String PRODUCT_HOMEPAGE = "http://www.mvnForum.com";
public static String getProductName() {
return PRODUCT_NAME;
}
public static String getProductDesc() {
return PRODUCT_DESC;
}
public static String getProductVersion() {
return PRODUCT_VERSION;
}
public static String getProductReleaseDate() {
return PRODUCT_RELEASE_DATE;
}
public static String getProductHomepage() {
return PRODUCT_HOMEPAGE;
}
public static BufferedImage getImage() {
String str = PRODUCT_VERSION + " on " + PRODUCT_RELEASE_DATE;
int IMAGE_WIDTH = 250;
int IMAGE_HEIGHT = 30;
BufferedImage bufferedImage = new BufferedImage(IMAGE_WIDTH, IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bufferedImage.createGraphics();
g.setBackground(Color.blue);
g.setColor(Color.white);
g.draw3DRect(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, false);
FontMetrics fontMetrics = g.getFontMetrics();
int strWidth = fontMetrics.stringWidth(str);
int strHeight = fontMetrics.getAscent() + fontMetrics.getDescent();
g.drawString(str, (IMAGE_WIDTH - strWidth) / 2, IMAGE_HEIGHT - ((IMAGE_HEIGHT - strHeight) / 2) - fontMetrics.getDescent());
g.dispose(); // free resource
return bufferedImage;
}
}
代码的复用有两种方法————1就是直接在新类中生成旧有的类的对象 (合成)2是创建一个新的类 这个类会全盘接受旧有的类 并且在不对旧有类修改的前提下 添加新的代码(继承)
合成所使用的方法
只要把对象的引用reference放到新的类里面就可以了。当primitive数据作为类的成员时候会自动初始化为零,对象的reference也会为null,这时候调用这个reference会抛出nullpoint异常。
reference的初始化有以下三种方式:
1 在定义对象的时候。这就意味着在调用构造函数之前,他们已经初始化完毕了。
2在这个类的构造函数里。
3在即将使用那个对象之前。如果碰到创建对象的代价很高,或者不是每次都需要创建对象的时候,这种做法就能降低程序的开销。
继承所使用的方法
继承的时候 必须使用extends关键词和基类的名字。之后新类就会自动获得基类的全部成员和方法。继承不会限定只能使用基类的方法。也可以往派生类里加入新的方法。
基类的初始化
当创建一个派生类的对象的时候,这个对象立门还有一个基类的对象。这个对象同基类自己创建的对象没有任何的差别。只是从外面看来这个对象是被包裹在派生类的对象里面。
基类的初始化只有一个方法能保证:调用基类的构造函数来进行初始化,只有这样才能掌握怎样才能正确地进行初始化的信息和权限。java会让派生类的构造函数自动地调用基类的构造函数。
带参数的构造函数
调用带参数的构造函数必须使用super关键词以及合适的参数明确调用基类的构造函数。
确保进行妥善地清理
一般情况下java会将需要清理的对象留给垃圾回收器去处理,它不会主动的进行清理。由于不知道垃圾回收器甚么时候启动,也不知道会不会启动,所有需要进行清理,就必须明确地写一个专门干这件事情的方法,为了应付异常,还要将这个方法放入finally子句里面去。不要去调用finalize方法。
用合成还是继承
一般来说,合成用于新类要使用旧类的功能,而不是其接口的场合,也就是说把对象嵌进去,用它来实现新类的功能,但用户看到的是新类的接口,而不是嵌进去的对象的接口,因此在新类里嵌入private的旧类对象,有时为了让用户直接访问新类的各个组成部分也可以嵌入public的旧类对象。通常都应该将基类的成员数据定义为privite类型。继承表达的是一种“是(is-a)”关系,合成表达的是“有(has-a)”关系,对于一些需要对外部世界隐藏,但要对它的继承类开放的基类 可以使用protected来定义那些开放的部分。最好的做法是,将数据成员设成private 的;你应该永远保留修改底层实现的权利。然后用protected 权限的方法来控制继承类的访问权限。
渐进式的开发
继承的优点之一就是,它支持渐进式的开发(incremental develop)。添加新的代码的时候,不会给老代码带来bug;实际上新的bug 全都被圈在新代码里。通过继承已有的,已经能正常工作的类,然后再添加一些数据成员和方法(以及重新定义一些原有的方法),你可以不去修改那些可能还有人在用的老代码,因而也就不会造成bug 了。一旦发现了bug,你就知道它肯定是在新代码里。相比要去修改老代码,新代码会短很多,读起来也更简单。继承实质上是在表达这样一种关系:“新的类是一种旧的类”。
上传
继承最重要的特征不在于它为新类提供了方法,而是它表达了新类同基类之间的关系。这种关系可以被归纳为一句话“新类就是一种原有的类。” (upcasting)”。上传总是安全的,因为你是把一个较具体的类型转换成较为一般的类型。也就是说派生类是基类的超集(superset)。它可能会有一些基类所没有的方法,但是它最少要有基类的方法。在上传过程中,类的接口只会减小,不会增大。这就是为什么编译器会允许你不作任何明确的类型转换或特殊表示就进行上传的原因了。
合成还是继承,再探讨
在判断该使用合成还是继承的时候,有一个最简单的办法,就是问一下你是不是会把新类上传给基类。如果你必须上传,那么继承就是必须的,如果不需要上传,那么就该再看看是不是应该用继承了。
final 关键词
final 的三种用途:数据(data),方法(method)和类(class)。
Final 的数据
很多编程语言都有通知编译器“这是段『常量(constant)』 数据”的手段。常量能用于下列两种情况:
1. 可以是“编译时的常量(compile-time constant)”,这样就再也不能改了。
2. 也可以是运行时初始化的值,这个值你以后就不想再改了。
如果是编译时的常量,编译器会把常量放到算式里面;这样编译的时候就能进行计算,因此也就降低了运行时的开销。在Java 中这种常量必须是primitive 型的,而且要用final 关键词表示。这种常量的赋值必须在定义的时候进行。
一个既是static 又是final 的数据成员会只占据一段内存,并且不可修改。
当final 不是指primitive,而是用于对象的reference 的时候,意思就有点搞了。对primitive 来说,final 会将这个值定义成常量,但是对于对象的reference 而言,final 的意思则是这个reference 是常量。初始化的时候,一旦将reference 连到了某个对象,那么它就再也不能指别的对象了。但是这个对象本身是可以修改的;Java 没有提供将某个对象作成常量的方法。(但是你可以自己写一个类,这样就能把类当做常量了。)这种局限性也体现在数组上,因为它也是一个对象。
空白的final 数据 (Blank finals)
Java 能让你创建“空白的final 数据(blank finals)”,也就是说把数据成员声明成final 的,但却没给初始化的值。碰到这种情况,你必须先进行初始化,再使用空白的final 数据成员,而且编译器会强制你这么做。不过,空白的final 数据也提供了一种更为灵活的运用final 关键词方法,比方说,现在对象里的final 数据就能在保持不变性的同时又有所不同了。
你一定得为final 数据赋值,要么是在定义数据的时候用一个表达式赋值,要么是在构造函数里面进行赋值。为了确保final 数据在使用之前已经进行了初始化,这一要求是强制性的。
Final 的参数
Java 允许你在参数表中声明参数是final 的,这样参数也编程final了。也就是说,你不能在方法里让参数reference 指向另一个对象了。
Final 方法
使用final 方法的目的有二。第一,为方法上“锁”,禁止派生类进行修改。这是出于设计考虑。当你希望某个方法的功能,能在继承过程中被保留下来,并且不被覆写,就可以使用这个方法。
第二个原因就是效率。如果方法是final 的,那么编译器就会把调用转换成“内联的(inline)”。当编译器看到要调用final 方法的时候,它就会(根据判断)舍弃普通的,“插入方法调用代码的”编译机制(将参数压入栈,然后跳去执行要调用的方法的代码,再跳回来清空栈,再处理返回值),相反它会用方法本身的拷贝来代替方法的调用。当然如果方法很大,那么程序就会膨胀得很快,于是内联也不会带来什么性能的改善,因为这种改善相比程序处理所耗用的时间是微不足道的。Java 的设计者们暗示过,Java 的编译器有这个功能,可以智能地判断是不是应该将final 方法做成内联的。不过,最好还是把效率问题留给编译器和JVM去处理,而只把final 用于要明确地禁止覆写的场合。
final 和private
private 方法都隐含有final 的意思。由于你不能访问private 的方法,因此你也不能覆写它。你可以给private 方法加一个final 修饰符,但是这样做什么意义也没有。这个问题有可能会造成混乱,因为即使你覆写了一个private 方法(它隐含有final 的意思),看上去它还是可以运行的,而且编译器也不会报错。
只有是基类接口里的东西才能被“覆写”。也就是说,对象应该可以被上传到基类,然后再调用同一个方法(这一点要到下一章才能讲得更清楚。)如果方法是private 的,那它就不属于基类的接口。它只能算是被类隐藏起来的,正好有着相同的名字的代码。如果你在派生类里创建了同名的public 或protected,或package 权限的方法,那么它们同基类中可能同名的方法,没有任何联系。你并没有覆写那个方法,你只是创建了一个新的方法。由于private 方法是无法访问的,实际上是看不见的,因此这么作除了会影响类的代码结构,其它什么意义都没有。
Final 类
把整个类都定义成final 的(把final 关键词放到类的定义部分的前面)就等于在宣布,你不会去继承这个类,你也不允许别人去继承这个类。换言之,出于类的设计考虑,它再也不需要作修改了,或者从安全角度出发,你不希望它再生出子类。
注意,final 类的数据可以是final 的,也可以不是final 的,这要由你来决定。无论类是不是final 的,这一条都适用于“将final 用于数据的”场合。但是,由于final 类禁止了继承,覆写方法已经不可能了,因此所有的方法都隐含地变成final 了。你可以为final 类的方法加一个final 修饰符,但是这一样没什么意义。
小心使用final
看来,设计类的时候将方法定义成final 的,会是一个很明智的决定。可能你会觉得没人会要覆写你的方法。有时确实是这样。
本章主要是介绍如何对代码进行封装,并解释为什么类库中有些部分会被公之于众,有些部分被隐藏的起来:类库创建时保证在不影响类库使用者代码的前提下对类库进行修改和改进,在对类库进行修改的时候不能删减现有方法,对于那些只有类内部实现有关的,不应该会使用的部分进行封装,限制用户使用这部分代码,便于类库创建者对类库进行修改,这就是java提供的访问控制符 access specifier ,public protected package private
使用import导入一个完整的类或类库。package的名称是独一无二的 ,不要import两个同名的类否则会引起冲突
java的访问控制符:类只能被定义public 或 package(默认的没有定义访问控制符的),而类内部数据成员和方法 被定义public的可以被任何类都能访问,被定义protected的数据成员或方法只能被该类的子类访问,定义package的数据成员或方法只能被同一目录下的类访问,private的成员或方法只能被类的内部数据成员或方法访问。
类的访问权限:每个编译单元只能有一个public类,只是为了保证每个编译单元只能有一个公共接口,可以根据需要往这个编译单元里添加package权限的类,public的类必须和这个编译单元一样的文件名
一、安装准备
在进行安装以前,你应该准备以下软件:
软件:J2se
版本:1.4.2_04
官方下载:http://java.sun.com/j2se/1.4.2/download.html
备注:
软件:Tomcat
版本:5.0.19
官方下载:http://www.apache.org/dist/jakarta/
备注:
软件:Struts
版本:1.1
官方下载:http://www.apache.org/dist/jakarta/struts/
备注:
软件:Eclipse
版本:2.1.3
官方下载:http://www.eclipse.org/downloads/index.php
备注:目前eclipse最新版为eclipse3.0R1
软件:EclipseLanguagePack
版本:2.1.2.1
官方下载:http://www.eclipse.org/downloads/index.php
备注:该版本只能汉化eclipse2.1.3及以下版本
软件:TomcatPlugin
版本:2.2.1
官方下载:http://www.sysdeo.com/eclipse/tomcatPlugin.html
备注:该版本只能汉化eclipse2.1.3及以下版本
软件:Lomboz
版本:2.1.3
官方下载:http://www.objectlearn.com/index.jsp
备注:该版本只能汉化eclipse2.1.3及以下版本
软件:EasyStruts
版本:0.6.4
官方下载:http://sourceforge.net/projects/easystruts
备注:该版本只能汉化eclipse2.1.3及以下版本
以上软件版本为安装成功的版本,为了使您的安装不至于出错请遵照以上版本准本软件。
hodesoft公司内部员工可以访问\\192.168.0.23获取
如果要找其他eclipse插件可以去下面这个站点
http://www.eclipse-plugins.info
二、JDK安装
1.安装J2SE-SDK到E:\j2sdk1.4.2
部分目录结构如下:
E:\j2sdk1.4.2\in
E:\j2sdk1.4.2\lib
E:\j2sdk1.4.2\jre
...
2.配置环境变量如下:
JAVA_HOME = E:\j2sdk1.4.2
PATH = %JAVA_HOME%\in;.;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;
CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\jre\lib;
三、Tomcat安装
1.解压jakarta-tomcat-5.0.19.zip到E:\tomcat
部分目录结构如下:
E:\tomcat\in
E:\tomcat\conf
E:\tomcat\webapps
...
2.配置环境变量如下:
TOMCAT_HOME = E:\tomcat
四、Struts安装
1.解压jakarta-struts-1.1.zip到E:\jakarta-struts-1.1
部分目录结构如下:
E:\jakarta-struts-1.1\lib
E:\jakarta-struts-1.1\webapps
...
五、Eclipse安装
1.解压eclipse-SDK-2.1.3-win32.zip到E:\eclipse213
部分目录结构如下:
E:\eclipse213\features
E:\eclipse213\plugins
...
2.启动Eclipse,看看安装是否成功
如果启动不成功,请查看JRE是否安装
3.启动Eclipse,点击菜单 windows->preferences 在左边树中点击展开java,选择Installed JREs,
如果Installed JREs如下则正确:
JRE Type:Standard VM
Name:j2sdk1.4.2
Location:E:\j2sdk1.4.2
六、Eclipse汉化
1.解压eclipse2.1.2.1-SDK-win32-LanguagePackFeature.zip到E:\eclipse213下
将目录名eclipse2.1.2.1-SDK-win32-LanguagePackFeature改为eclipse2.1.2.1Language
部分目录结构如下:
E:\eclipse213\eclipse2.1.2.1Language\eclipse\features
E:\eclipse213\eclipse2.1.2.1Language\eclipse\plugins
...
2.在E:\eclipse213下新建文件夹links,使得文件夹links和文件夹eclipse2.1.2.1Language同级
3.在E:\eclipse213\links下新建文件,文件名任取,这里我们命名为language.link,打开此文件,
加入 path = E:\\eclipse213\\eclipse2.1.2.1Language
4.启动Eclipse,看看汉化是否成功,如不成功请检查language.link文件中配置信息path =
E:\\eclipse213\\eclipse2.1.2.1Language和汉化文件夹eclipse2.1.2.1Language的安装路径是否一
致
七、TomcatPlugin安装
1.解压tomcatPluginV221.zip
2.将解压目录tomcatPluginV221下文件夹com.sysdeo.eclipse.tomcat_2.2.1复制到eclipse安装目
录中的plugins目录中,即E:\eclipse213\plugins
3.启动Eclipse
4.启动后你将看到你的菜单上多了一个下拉项Tomcat,快捷栏里多了三个Tomcat的猫图表,如
果没有看到,请点击 窗口->定制透视图,展开树结构中的“其它”,选择“Tomcat”
5.点击 窗口->首选项
在左边树中点击tomcat,设置tomcat version为version 5.x
设置tomcat version为version 5.x
设置tomcat-home为E:\tomcat
设置perspective to switch when tomcat is started为java
在左边树中点击tomcat->JVM setting,设置JRE为j2sdk1.4.2
点击应用确定
6.点击快捷按钮“Start Tomcat”来启动Tomcat吧
八、Lomboz安装
1.解压lomboz.213.zip
2.将解压目录lomboz.213\plugins下文件夹com.objectlearn.jdt.j2ee和com.objectlearn.jdt.j2ee.editors
复制到eclipse安装目录中的plugins目录中,即E:\eclipse213\plugins
3.启动Eclipse
4.点击 窗口->首选项
在左边树中点击lomboz,设置JDK tools.jar位置为E:\ j2sdk1.4.2\lib\tools.jar
在左边树中点击lomboz->server definitions,设置Server Type为Apache Tomcat v5.0.x
设置Application Server Directory为E:\tomcat
设置classpath Variable Name为TOMCAT_HOME
设置classpath Variable为E:\tomcat
点击应用确定
九、easyStruts安装
1.解压org.easystruts.eclipse_0.6.4.zip
2.将解压目录org.easystruts.eclipse_0.6.4下文件夹com.cross.easystruts.eclipse_0.6.4复制到eclipse
安装目录中的plugins目录中,即E:\eclipse213\plugins
3.启动Eclipse
4.点击 窗口->首选项
在左边树中点击Easy Struts,选择struts1.1
ADD JREs如下:
struts.jar-E:\jakarta-struts-1.1\lib\struts.jar
ADD TLDs如下:
struts-tiles.tld-E:\jakarta-struts-1.1\lib\struts-tiles.tld
struts-template.tld-E:\jakarta-struts-1.1\lib\struts-template.tld
struts-nested.tld-E:\jakarta-struts-1.1\lib\struts-nested.tld
struts-logic.tld-E:\jakarta-struts-1.1\lib\struts-logic.tld
struts-html.tld-E:\jakarta-struts-1.1\lib\struts-html.tld
struts-bean.tld-E:\jakarta-struts-1.1\lib\struts-bean.tld
点击应用确定