2006年4月12日
#
StringTokenizer tokenizer
= new StringTokenizer(number, ",");
boolean bool = true;
while (tokenizer.hasMoreTokens()) {
try {
Double.valueOf(tokenizer.nextToken());
} catch (Exception e) {
bool = false;
}
}
//将字符串转化为数组的方法
int gv[];
int i = 0;
StringTokenizer tokenizer = new StringTokenizer(goodsVolume, ",, ");
gv = new int[tokenizer.countTokens()];//动态的决定数组的长度
while (tokenizer.hasMoreTokens()) {
String d = tokenizer.nextToken();
gv[i] = Integer.valueOf(d);//将字符串转换为整型
i++;
}
//字符串解析
private String[] stringAnalytical(String str, String divisionChar) {
String string[];
int i = 0;
StringTokenizer tokenizer = new StringTokenizer(str, divisionChar);
string = new String[tokenizer.countTokens()];// 动态的决定数组的长度
while (tokenizer.hasMoreTokens()) {
string[i] = new String();
string[i] = tokenizer.nextToken();
i++;
}
return string;// 返回字符串数组
}
int countTokens()
计算在生成异常之前可以调用此 tokenizer 的 nextToken 方法的次数。
boolean hasMoreElements()
返回与 hasMoreTokens 方法相同的值。
boolean hasMoreTokens()
测试此 tokenizer 的字符串中是否还有更多的可用标记。
Object nextElement()
除了其声明返回值是 Object 而不是 String 之外,它返回与 nextToken 方法相同的值。
String nextToken()
返回此 string tokenizer 的下一个标记。
String nextToken(String delim)
返回此 string tokenizer 的字符串中的下一个标记。
public class StringAnalytical {
// 字符串解析,将字符串转根据分割符换成字符串数组
private String[] stringAnalytical(String string, char c) {
int i = 0;
int count = 0;
if (string.indexOf(c) == -1)
return new String[] { string };// 如果不含分割符则返回字符本身
char[] cs = string.toCharArray();
int length = cs.length;
for (i = 1; i < length - 1; i++) {// 过滤掉第一个和最后一个是分隔符的情况
if (cs[i] == c) {
count++;// 得到分隔符的个数
}
}
String[] strArray = new String[count + 1];
int k = 0, j = 0;
String str = string;
if ((k = str.indexOf(c)) == 0)// 去掉第一个字符是分隔符的情况
str = str.substring(k + 1);
if (str.indexOf(c) == -1)// 检测是否含分隔符,如果不含则返回字符串
return new String[] { str };
while ((k = str.indexOf(c)) != -1) {// 字符串含分割符的时候
strArray[j++] = str.substring(0, k);
str = str.substring(k + 1);
if ((k = str.indexOf(c)) == -1 && str.length() > 0)
strArray[j++] = str.substring(0);
}
return strArray;
}
public void printString(String[] s) {
System.out.println("*********************************");
for (String str : s)
System.out.println(str);
}
public static void main(String[] args) {
String[] str = null;
StringAnalytical string = new StringAnalytical();
str = string.stringAnalytical("1aaa", '@');
string.printString(str);
str = string.stringAnalytical("2aaa@", '@');
string.printString(str);
str = string.stringAnalytical("@3aaa", '@');
string.printString(str);
str = string.stringAnalytical("4aaa@bbb", '@');
string.printString(str);
str = string.stringAnalytical("@5aaa@bbb", '@');
string.printString(str);
str = string.stringAnalytical("6aaa@bbb@", '@');
string.printString(str);
str = string.stringAnalytical("@7aaa@", '@');
string.printString(str);
str = string.stringAnalytical("@8aaa@bbb@", '@');
string.printString(str);
str = string.stringAnalytical("@9aaa@bbb@ccc", '@');
string.printString(str);
str = string.stringAnalytical("@10aaa@bbb@ccc@eee", '@');
string.printString(str);
}
}
摘要: import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar; import java.util.regex.Pattern;
import o...
阅读全文
java访问xml文件
- Java code
-
import java.io.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class xmljava
{
public static void main(String args[])
{
Element element=null;
File f =new File("a.xml");
DocumentBuilder db=null; //documentBuilder为抽象不能直接实例化(将XML文件转换为DOM文件)
DocumentBuilderFactory dbf=null;
try{
dbf= DocumentBuilderFactory.newInstance(); //返回documentBuilderFactory对象
db =dbf.newDocumentBuilder();//返回db对象用documentBuilderFatory对象获得返回documentBuildr对象
Document dt= db.parse(f); //得到一个DOM并返回给document对象
element = dt.getDocumentElement();//得到一个elment根元素
System.out.println("根元素:"+element.getNodeName()); //获得根节点
NodeList childNodes =element.getChildNodes() ; // 获得根元素下的子节点
for (int i = 0; i < childNodes.getLength(); i++) // 遍历这些子节点
{
Node node1 = childNodes.item(i); // childNodes.item(i); 获得每个对应位置i的结点
if ("Account".equals(node1.getNodeName()))
{
// 如果节点的名称为"Account",则输出Account元素属性type
System.out.println("\r\n找到一篇账号. 所属区域: " + node1.getAttributes().getNamedItem ("type").getNodeValue() + ". ");
NodeList nodeDetail = node1.getChildNodes(); // 获得<Accounts>下的节点
for (int j = 0; j < nodeDetail.getLength(); j++)
{ // 遍历<Accounts>下的节点
Node detail = nodeDetail.item(j); // 获得<Accounts>元素每一个节点
if ("code".equals(detail.getNodeName())) // 输出code
System.out.println("卡号: " + detail.getTextContent());
else if ("pass".equals(detail.getNodeName())) // 输出pass
System.out.println("密码: " + detail.getTextContent());
else if ("name".equals(detail.getNodeName())) // 输出name
System.out.println("姓名: " + detail.getTextContent());
else if ("money".equals(detail.getNodeName())) // 输出money
System.out.println("余额: "+ detail.getTextContent());
}
}
}
}
catch(Exception e){System.out.println(e);}
}
}
- XML code
-
<?xml version="1.0" encoding="gbk"?>
<Accounts>
<Account type="by0003">
<code>100001</code>
<pass>123</pass>
<name>李四</name>
<money>1000000.00</money>
</Account>
<Account type="hz0001">
<code>100002</code>
<pass>123</pass>
<name>张三</name>
<money>1000.00</money>
</Account>
</Accounts>
方法没有确认
import java.util.*;
public class Lottery {
public static void main(String[] args) {
int[] data1 = {3, 5, 6, 8, 9, 15, 18, 24, 27, 30, 32};
Random r = new Random();
int irdm = 0;
for(int i = 0; i < 7; i ++) {
irdm = r.nextInt(11 - i);
System.out.println(data1[irdm]);
for(int j = irdm; j < 11 - i - 1; j ++) {
data1[j] = data1[j + 1];
}
}
}
}
方法没有确认不知道是否可行public class AAAAA {
public static void main(String[] args) {
int i = 0;
int j = 0;
int[] temp = new int[20];
for (j = 0; j < temp.length; j++) {
temp[j] = Math.random() * 100 + 1;
System.out.print(temp[j] + ",";
}
HashSet hh = new HashSet();
while (hh.size() < 7) {
int aa = (int) (Math.random() * 100 + 1);
hh.add(aa);
}
System.out.println(hh.size());
Iterator ii = hh.iterator();
while (ii.hasNext()) {
System.out.print(ii.next() + ",";
}
}
}
java从指定数组中取不重复的7个随机数
如何用java从指定数组中取不重复的7个随机数,以下是我写的代码,但是是有重复的,哪位大侠赐教一下如何使用Random类的种子,帮我实现不重复的随机数。。。
import java.util.*;
public class Lottery {
public static void main(String[] args)
{
int[] data1 = {3,5,6,8,9,15,18,24,27,30,32};
Random r=new Random();
StringBuffer str1=new StringBuffer();
for(int i=0;i<6;i++)
{
str1.append(data1[r.nextInt(11)]);
}
System.out.println(str1);
}
}
char []a={'v','f',',','e','f'};
Arrays.sort(a);
for(char b:a)
{
System.out.println(b);
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumGlobal.java,v 1.17 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.17 $
* $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 MVNForumGlobal {
private MVNForumGlobal() {
}
/*************************************************************************
* NOTE: below constants can be changed for each build,
* these constant MUST NOT break the compatibility
*************************************************************************/
public final static String IMAGE_DIR = "/mvnplugin/mvnforum/images";
public final static String EMOTION_DIR = "/mvnplugin/mvnforum/images/emotion/";
public final static String CSS_FULLPATH = "/mvnplugin/mvnforum/css/style.css";
public final static String LOGO_FULLPATH = "/mvnplugin/mvnforum/images/logo.gif";
// Note that we cannot put / at the end because getRealPath will remove it in Tomcat 4.1.7 :((
public final static String UPLOADED_AVATAR_DIR = "/mvnplugin/mvnforum/upload/memberavatars";
public final static String UPLOADED_COMPANY_DIR = "/mvnplugin/mvnforum/upload/company";
public final static String COMPANY_DEFAULT_CSS_PATH = "/mvnplugin/mvnforum/upload/company/style.css";
public final static String COMPANY_DEFAULT_LOGO_PATH = "/mvnplugin/mvnforum/upload/company/logo.gif";
public final static String RESOURCE_BUNDLE_NAME = "mvnForum_i18n";
/** value to control the flood prevention. Note value from 0 to 999 is belong to mvnCore */
public final static Integer FLOOD_ID_NEW_POST = new Integer(1000);
public final static Integer FLOOD_ID_NEW_MEMBER = new Integer(1001);
public final static Integer FLOOD_ID_LOGIN = new Integer(1002);
public final static Integer FLOOD_ID_NEW_MESSAGE = new Integer(1003);
/** The maximum length of the email in database */
public final static int MAX_MEMBER_EMAIL_LENGTH = 60;
/** The maximum length of the member login name in database */
public final static int MAX_MEMBER_LOGIN_LENGTH = 30;
public final static String TEMPLATE_SENDACTIVATECODE_PREFIX = "sendactivemailtemplate";
public final static String TEMPLATE_SENDACTIVATECODE_SUBJECT = "sendactivemailtemplate-subject.ftl";
public final static String TEMPLATE_SENDACTIVATECODE_BODY = "sendactivemailtemplate-body.ftl";
public final static String TEMPLATE_FORGOTPASSWORD_PREFIX = "forgotpasswordtemplate";
public final static String TEMPLATE_FORGOTPASSWORD_SUBJECT = "forgotpasswordtemplate-subject.ftl";
public final static String TEMPLATE_FORGOTPASSWORD_BODY = "forgotpasswordtemplate-body.ftl";
public final static String TEMPLATE_WATCHMAIL_PREFIX = "watchmailtemplate";
public final static String TEMPLATE_WATCHMAIL_SUBJECT = "watchmailtemplate-subject.ftl";
public final static String TEMPLATE_WATCHMAIL_BODY = "watchmailtemplate-body.ftl";
// Constant for Company module
public final static String COMPANY_GROUP_FREFIX = "CompanyGroup: ";
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumFactoryConfig.java,v 1.12 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.12 $
* $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.File;
import net.myvietnam.mvncore.configuration.DOM4JConfiguration;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import net.myvietnam.mvncore.util.FileUtil;
/**
* Class that loads and makes accesible the factory configuration.
*
* @author <a href="luish@germinus.com">Luis Miguel Hernanz</a>
* @version $Revision: 1.12 $
*/
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);
}
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumContextListener.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: Mai Nguyen mai.nh@MyVietnam.net
*/
package com.mvnforum;
import java.sql.Timestamp;
import javax.servlet.*;
import net.myvietnam.mvncore.util.DateUtil;
import net.myvietnam.mvncore.util.FileUtil;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MVNForumContextListener implements ServletContextListener {
private static Log log = LogFactory.getLog(MVNForumContextListener.class);
private static MVNForumContextListener instance;
private Timestamp startTimestamp;
/**
* The servlet context with which we are associated.
*/
private ServletContext context = null;
public MVNForumContextListener() {
instance = this;
}
/**
* Notification that the web application is ready to process requests.
*
* @param event ServletContextEvent
*/
public void contextInitialized(ServletContextEvent event) {
log.debug("contextInitialized");
this.context = event.getServletContext();
String realPath = context.getRealPath("/WEB-INF/classes");// Add '/' before WEB-INF to fix the Oracle 10G bug
FileUtil.setServletClassesPath(realPath);
startTimestamp = DateUtil.getCurrentGMTTimestamp();
}
/**
* Notification that the servlet context is about to be shut down.
*
* @param event ServletContextEvent
*/
public void contextDestroyed(ServletContextEvent event) {
log.debug("contextDestroyed");
this.context = null;
instance = null;
}
// below are add on method
public static MVNForumContextListener getInstance() {
return instance;
}
public Timestamp getStartTimestamp() {
return startTimestamp;
}
}
/*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumConstant.java,v 1.8 2005/01/18 11:52:08 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.8 $
* $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
* @author: Igor Manic imanic@users.sourceforge.net
*/
package com.mvnforum;
public final class MVNForumConstant {
/** Cannot instantiate. */
private MVNForumConstant() {
}
/*************************************************************************
* NOTE: below constants MUST NOT be changed IN ALL CASES,
* or it will break the compatibility
*************************************************************************/
/** Guest/anonymous site visitor. */
public static final int MEMBER_ID_OF_GUEST = 0;
/** System administrator. */
public static final int MEMBER_ID_OF_ADMIN = 1;
/**
* The highest reserved MemberID.
* All IDs from 0 through this value should not be used for "regular" members.
*/
public static final int LAST_RESERVED_MEMBER_ID = 1;
/* IMPORTANT: When we have a group without group owner, GroupOwnerID is set to 0.
* Similiar is for other IDs in the database - 0 means there is no reference.
* Also, the other reason why MemberID=0 should not be used for Guest is
* that DBMS could refuse to insert a record with 0 in that field, since it's
* marked as non-null autoincrement primary key.
*/
/** Unused GroupID. */
public static final int GROUP_ID_UNUSED0 = 0;
/**
* Unused GroupID. In the previous versions of mvnForum it was used for some
* special purposes, but should not be used anymore.
*/
public static final int GROUP_ID_OF_GUEST = 1;
/** "Registered Members" virtual group. All members are listed in this group. */
public static final int GROUP_ID_OF_REGISTERED_MEMBERS = 2;
/**
* The highest reserved GroupID.
* All IDs from 0 through this value should not be used for "regular" groups.
*/
public static final int LAST_RESERVED_GROUP_ID = 2;
/** "Inbox" message folder created by default for each member. */
public static final String MESSAGE_FOLDER_INBOX = "Inbox";
/** "Sent" message folder created by default for each member. */
public static final String MESSAGE_FOLDER_SENT = "Sent";
/** "Draft" message folder created by default for each member. */
public static final String MESSAGE_FOLDER_DRAFT = "Draft";
/** "Trash" message folder created by default for each member. */
public static final String MESSAGE_FOLDER_TRASH = "Trash";
public static final String dtdschemaDecl="<!DOCTYPE mvnforum SYSTEM \"http://www.mvnforum.com/dtd/mvnforum_1_0_rc2.dtd\">";
public static final String VN_TYPER_MODE = "mvnforum.vntypermode";
}
摘要: /*
* $Header: /cvsroot/mvnforum/mvnforum/src/com/mvnforum/MVNForumConfig.java,v 1.75 2005/01/29 19:29:26 minhnn Exp $
* $Author: minhnn $
* $Revision: 1.75 $
* $Date: 2005/...
阅读全文
/*
* $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
点击应用确定
目标:
1.管理J2EE工程:发布WEB程序,启动/关闭服务器等
2.编辑JSP/HTML/XML:有代码提示,语法着色,错误提示等功能
3.跟踪调试JSP/SERVLET:可设置断点,单步执行,变量/栈/线程跟踪等
(3).快速指南
1.New Project -> Tomcat Project
2.输入Project Name 下一步(不能建在已有的目录里)
3.输入Context Name 就是web应用程序的名称,决定访问时的地址; 输入Subdirectory to set as web application root(设置为web应用程序根目录的目录名),就是web目录,可以输入webapp(JBuilder默认的名称),或其他的,如果不输入的话,就直接建在Project目录下.
4.此时建立的目录有:
webapp/WEB-INF/src 默认的源文件是放在WEB-INF目录下(Tomcat Plugin的)
work 执行JSP时,编译成的servlet源文件会放在此处(Tomcat Plugin的)
bin eclipse默认的放置编译后生成的classes文件
src eclipse默认的源文件目录
webapp web应用程序的目录
5.以上的目录都可以在project属性里改,我一般喜欢把源文件放在src目录下,而不是WEB-INF/src下,输出到WEB-INF/classes目录,而不是bin目录.
6.以上建好的web应用程序没有web.xml,如果要自动建这个文件,那么可以执行一次lomboz的J2EE Module向导.
7.运行tomcat(点击tomcat插件在界面上新增的小猫图标即可启动/关闭tomcat,具体的安装看上面的链接)
8.编辑JSP/HTML等文件,按右键->Open with->JSP editor(红色图标那个).文件关联可以在Window菜单->Preferences->Workbench->File Association里面设置.
9.
调试Servlet或struts的Action时,只要在程序的相应位置的行号上双击就可以设置一个断点,刷新相应的页面(即发出请求),程序就会在断点的位置中断.
如果要调试JSP,稍微麻烦一点,因为它不能直接支持JSP的断点调试.要先把那个页面请求一次,再刷新eclipse里的左侧目录(右键->刷新),会发现work目录下出现相应JSP文件的java源文件.打开这个源文件,在里面设置断点即可.
(转移自2004年9月的一篇随笔)