2008年12月29日星期一

SVN常用分支模式

发布分支

这是版本控制可以做的帮助,典型的过程如下:

开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。

这个主干被拷贝到“发布”分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。

项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试“停滞”了。

分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。

分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。

整个过程随着软件的成熟不断重复:当2.0完成,一个新的2.0分支被创建,测试、打标签和最终发布,经过许多年,版本库结束了许多版本发布,进入了“维护”模式,许多标签代表了最终的发布版本。

特性分支

最终,有一个问题就是怎样保持一个特性分支“同步”于工作中的主干,在前面提到过,在一个分支上工作数周或几个月是很有风险的,主干的修改也许会持续涌入,因为这一点,两条线的开发会区别巨大,合并分支回到主干会成为一个噩梦。

可以用另一种考虑这种模式,每周按时同步分支到主干,类似于在工作拷贝执行svn update的命令,最终的合并操作类似于在工作拷贝运行svn commit,毕竟,工作拷贝不就是一个非常浅的分支吗?只是它一次只可以保存一个修改。

2008年12月23日星期二

#Pragma

在所有的预处理指令中,#pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #pragma para
其中para为参数,下面来看一些常用的参数。

(1)message 参数
message参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,
这对于源代码信息的控制是非常重要的。其使用方法为:
#pragma message("消息文本")
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏,可以用下面的方法:
#ifdef _X86
#pragma message("_X86 macro activated!")
#endif
我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示"_X86 macro activated!"。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg
格式如:
#pragma code_seg( ["section-name" [, "section-class"] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,
但是考虑到兼容性并没有太多的使用它。

(4)#pragma hdrstop
表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,
但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init),BCB就会根据优先级的大小先后编译。

(5)#pragma resource "*.dfm"
表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。

(6)#pragma warning( disable: 4507 34; once: 4385; error: 164 )
等价于:
#pragma warning( disable: 4507 34 ) // 不显示4507和34号警告信息
#pragma warning( once: 4385 ) // 4385号警告信息仅报告一次
#pragma warning( error: 164 ) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [, n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n )保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable: 4705 )
#pragma warning( disable: 4706 )
#pragma warning( disable: 4707 )
//.......
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。

(7)#pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。如:
#pragma comment(lib, "comctl32.lib")
#pragma comment(lib, "vfw32.lib")
#pragma comment(lib, "wsock32.lib")

每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。
例如,对循环优化功能:
#pragma loop_opt(on) // 激活
#pragma loop_opt(off) // 终止

有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,
如“Parameter xxx is never used in function xxx”,可以这样:
#pragma warn —100 // Turn off the warning message for warning #100
int insert_record(REC *r)
{ /* function body */ }
#pragma warn +100 // Turn the warning message for warning #100 back on
函数会产生一条有唯一特征码100的警告信息,如此可暂时终止该警告。

每个编译器对#pragma的实现不同,在一个编译器中有效在别的编译器中几乎无效。可从编译器的文档中查看。

补充 —— #pragma pack 与 内存对齐问题

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐,而这个k则被称为该数据类型的对齐模数(alignment modulus)。
Win32平台下的微软C编译器(cl.exe for 80x86)在默认情况下采用如下的对齐规则:
任何基本数据类型T的对齐模数就是T的大小,即sizeof(T)。比如对于double类型(8字节),就要求该类型数据的地址总是8的倍数,而char类型数据(1字节)则可以从任何一个地址开始。

Linux下的GCC奉行的是另外一套规则(在资料中查得,并未验证,如错误请指正):
任何2字节大小(包括单字节吗?)的数据类型(比如short)的对齐模数是2,而其它所有超过2字节的数据类型(比如long,double)都以4为对齐模数。

ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和。
填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间。那么结构体本身有什么对齐要求吗?有的,ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。

如何使用c/c++中的对齐选项
vc6中的编译选项有 /Zp[1|2|4|8|16] ,/Zp1表示以1字节边界对齐,相应的,/Zpn表示以n字节边界对齐。n字节边界对齐的意思是说,一个成员的地址必须安排在成员的尺寸的整数倍地址上或者是n的整数倍地址上,取它们中的最小值。也就是:
min ( sizeof ( member ), n)

实际上,1字节边界对齐也就表示了结构成员之间没有空洞。
/Zpn选项是应用于整个工程的,影响所有的参与编译的结构。
要使用这个选项,可以在vc6中打开工程属性页,c/c++页,选择Code Generation分类,在Struct member alignment可以选择。

要专门针对某些结构定义使用对齐选项,可以使用#pragma pack编译指令:
(1) #pragma pack( [ n ] )
该指令指定结构和联合成员的紧凑对齐。而一个完整的转换单元的结构和联合的紧凑对齐由/Zp 选项设置。紧凑对齐用pack编译指示在数据说明层设置。该编译指示在其出现后的第一个结构或联合说明处生效。
该编译指示对定义无效。
当你使用#pragma pack ( n ) 时, 这里n 为1、2、4、8 或16。
第一个结构成员之后的每个结构成员都被存储在更小的成员类型或n 字节界限内。
如果你使用无参量的#pragma pack, 结构成员被紧凑为以/Zp 指定的值。该缺省/Zp 紧凑值为/Zp8 。

(2) 编译器也支持以下增强型语法:
#pragma pack( [ [ { push | pop } , ] [ identifier, ] ] [ n] )

若不同的组件使用pack编译指示指定不同的紧凑对齐, 这个语法允许你把程序组件组合为一个单独的转换单元。带push参量的pack编译指示的每次出现将当前的紧凑对齐存储到一个内部编译器堆栈中。
编译指示的参量表从左到右读取。如果你使用push, 则当前紧凑值被存储起来;
如果你给出一个n 的值, 该值将成为新的紧凑值。若你指定一个标识符, 即你选定一个名称, 则该标识符将和这个新的的紧凑值联系起来。

带一个pop参量的pack编译指示的每次出现都会检索内部编译器堆栈顶的值,并且使该值为新的紧凑对齐值。如果你使用pop参量且内部编译器堆栈是空的,则紧凑值为命令行给定的值, 并且将产生一个警告信息。
若你使用pop且指定一个n的值, 该值将成为新的紧凑值。若你使用p o p 且指定一个标识符, 所有存储在堆栈中的值将从栈中删除, 直到找到一个匹配的标识符, 这个与标识符相关的紧凑值也从栈中移出, 并且这个仅在标识符入栈之前存在的紧凑值成为新的紧凑值。如果未找到匹配的标识符,
将使用命令行设置的紧凑值, 并且将产生一个一级警告。缺省紧凑对齐为8 。

pack编译指示的新的增强功能让你编写头文件, 确保在遇到该头文件的前后的紧凑值是一样的。

(3) 栈内存对齐

在vc6中栈的对齐方式不受结构成员对齐选项的影响。它总是保持对齐,而且对齐在4字节边界上。

2008年12月18日星期四

在VC2003中编译x264

1、到 http://www.videolan.org/developers/x264.html
下载 x264 源代码,可以从代码库中取:
# git clone git://git.videolan.org/x264.git
或者下载一个 daily snaptshot,这是每天凌晨生成的一个tar.gz文件,例如:
ftp://ftp.videolan.org/pub/videolan/x264/snapshots/x264-snapshot-20081217-2245.tar.bz2

2、用VC2003打开 x264\build\win32\x264.sln 文件,会显示有2个工程:
libx264
x264

3、编译会显示找不到 yasm,显然 x264工程用了一个开源的汇编编译器 yasm,其网址是:
http://www.tortall.net/projects/yasm/下载win32版本:
http://www.tortall.net/projects/yasm/releases/yasm-0.7.2-win32.exe将其改名为 yasm.exe 并放到 PATH 路径中,例如 C:\tools

4、再次编译,会报2个错,一个出在 #define ERROR(...),这是因为 VC2003 不支持可变参数的宏函数,得 VC2005 以上才支持,所以这里需要修改为:
#if defined(_MSC_VER) && _MSC_VER < 1400 // Support for variadic macros was introduced in Visual C++ 2005.
#define ERROR { ret = 1; }
#else
#define ERROR(...)\
{\
if( verbose )\
x264_log( h, X264_LOG_WARNING, __VA_ARGS__ );\
ret = 1;\
}
#endif

另一个错在编译不会有问题,但是link的时候可能会报错,说 _fseeki64 和 _ftelli64 找不到,这两个函数支持 64bit 文件访问,但是在 VC2005 以后才支持,所以需要在 osdep.h 中进行修改为:
#if _MSC_VER >= 1400 // _fseeki64 and _ftelli64 introduced in VC2005 and above
#define fseek _fseeki64
#define ftell _ftelli64
#endif

然后再进行编译就可以了,编译完成之后,在 x264\bin\ 下面生成2个文件:
libx264.lib
x264.exe

2008年12月16日星期二

项目管理专家(PMP)认证的条件与方法

  项目管理是指把各种系统、资源和人员有效地结合在一起,采用规范化的管理流程,在规定的时间、预算和质量目标范围内完成项目。项目管理广泛应用于建筑、工程、电子、通讯、计算机、金融、制造、咨询、国防以及政府机关等行业。

1. 认证程序
  PMI认证程序提供国际一流水平的项目管理产品和服务,以保证项目管理专家证书在全球范围内(包括公共和私有部门)的可靠信誉。

2.项目管理协会认证概述
  项目管理认证程序是由项目管理协会PMI发起的,其目的是使严格的、基于考试基础上的最高品质的专业认证程序得到开发、保持、评价、提高和管理。 项目管理专家(PMP)认证程序支持项目管理专家国际团体,客观评估和测试专业知识水平。PMP程序的要求和合格的标准是公平的、公正的,并与适用法律是一致的。无论考生是否属于任何组织、协会或团体,PMP程序遵守美国各州和联邦政府的反歧视法并独立授予证书。 申请者必须达到PMI规定的所有教育和经历要求,并对项目管理专家认证考试测试的关于对项目管理的理解和知识达到认可及合格程度才能获得PMP证书。另外,为满足行业发展计划的需要,PMP证书获得者必须继续致力于项目管理领域。

3.申请资格
  PMP认证申请者必须满足以下类别之一规定的教育背景和专业经历:
  第一类: 申请者需具有学士学位或同等的大学学历,并且须至少具有4500小时的项目管理经历。PMI要求申请者需 至少3年以上,具有4500小时的项目管理经历。仅在申请日之前6年之内的经历有效。需要提交的文件一份详细描述工作经历和教育背景的最新简历(请提供所有雇主和学校的名称及详细地址);一份学士学位或同等大学学历证书或副本的拷贝件;能说明至少3年以上,4500小时的经历审查表。
  第二类: 申请者虽不具备学士学位或同等大学学历,但持有中学文凭或同等中学学历证书,并且至少具有7500小时的项目管理经历。PMI要求申请者需至少5年以上,具有7500小时的项目管理经历。仅在申请日之前8年之内的经历有效。
  所需支持文件:一份详细描述工作经历和教育背景的最新简历(请提供所有雇主和学校的名称及详细地址);能说明至少5年以上,7500小时的经历审查表。

4.申请程序
  PMP认证考试申请资料包括四项内容。申请者需将经历审查表、一份最新的个人简历(应详细说明工作经历和教育背景)、一份毕业证书或副本(如需要的话)拷贝和考试申请表随相应的费用提交PMI认证部。所有申请资料和文件应用英文书写并且属实。

5.经历审查内容
  项目管理经历审查表是PMP认证考试资料的一部分,供申请者以书面资料全面报告其项目管理经历。申请者必须完成并签名一份合格的项目管理经历审查表,随PMP认证考试申请表一起提交。经历审查表不全的申请将被退回。 在有效时间范围内,每个项目都要提交一份经历审查表。
  每份中以下内容必须填写:
  申请者全名
  列出项目管理经历的雇主名称和详细地址
  雇主的电话和传真号码
  项目开始和完成日期(在申请时若项目未完成,用申请日期代替完成日期)
  在项目管理五个过程中的大约工时数(对任何五个过程无最低要求)
  申请者签名和日期
  
6.项目管理五个过程
  立项:确立一个项目或一个项目阶段。
  计划:为完成项目,制定和维护一个可操作的计划。
  执行:协调人力和其他资源以执行计划 。
  控制:通过监控和进度测量及必要时采取纠正措施以确保项目目标的实现。
  收尾:正式验收项目或项目阶段并使其有条不紊地圆满结束。
  *源于项目管理知识体系(The PMBOK Guide)

7.个人简历
  申请者必须提交一份最新的个人简历,须详细说明经历审查表中的工作经历。在个人简历中要 简要陈述所有项目管理工作经历。应试者须提供所有就学学校(包括中学)的名称及详细地址。

8.PMP认证考试申请表内容说明 应试者必须完成本手册中的PMP证书考试申请表,用印刷体清楚地填写以下内容(须大写的部分请大写):
  申请表第I页:
  社会保险号码和母亲的婚前姓(仅用于身份鉴别)
  PMI身份或会员号(无此号码者将被分配一个号码)
  全名,雇主信息,包括公司名称、工作职位、详细地址及电话号码 详细家庭邮寄地址和电话号码 第一电子邮件地址和传真号,注明希望的邮寄地址和电话号码 阅知了PMP认证与应试者的协议 所有会员资格和证书资料将被寄往注明的希望邮寄地址。
  申请表第II页:
  信息来源 会员状况 课程培训情况和PMI分会代码 职业代码和行业代码 最高学历,授予年月和学习领域 经历审查表中的项目管理经历合计(小时) 付款金额和付款方式(一旦支付,非会员费用不再变更,不管以后是否加入PMI) 阅知考试取消和退款条例 完成的申请资料连同认证申请费须一起递交. 传真复印件无效。请勿将您的PMI 会员申请资料和会员费同PMP认证考试申请资料放入同一信封。
  
9.申请资料审查
  PMP认证部按一定比例抽查审核申请资料。提交给PMI证书部的任何虚假和错误信息将受到惩罚,包括中止或撤消考试资格或(和)证书。
  
10.申请合格通知
  在收到PMP认证考试申请资料10到14个工作日之内,将寄给合格的申请者一封PMP认证考试资格信。此信确认申请者考试资格,3个月内有效。

11.延期
  在3个月资格有效期内不能参加PMP认证考试的应试者可申请一次性延期。应试者须提前一个月提交一份书面延期申请报告,包括延期理由。

2008年12月10日星期三

用jni实现java使用dll

使用jni调C++功能,也要之前用java声明出预调用的函数,然后用javah和生成的class文件生成一个.h文件,做的是针对这个.h文件,实现.cpp。

1:写一个Java类,在这个类中包含了需要调用的本地方法的描述。
public class Main {
static{
System.loadLibrary("TestDLL");
}

public native int get();

public static void main(String[] args) {
Main m = new Main();
System.out.println(m.get);
}
}

2:编译,然后命令行下使用命令javah -jni (-classpath . )Main,此时会在当前目录下产生一个Main.h文件
3:使用VC来编写本地方法的实现函数,最后编译成.dll文件。过程如下:
1) 选择new->projects(选择Win32 Dynamic-Link Library)->OK->An ampty DLL project->Finish。
2) 选择Tools->Options->Directories(添加目录..\J2SDK\INCLUDE和..\J2SDK\INCLUDE\WIN32)。
3) 将Main.h添加到工程。
4) 添加源文件Main.cpp,内容如下:
#include "Main.h"

JNIEXPORT jint JNICALL Java_Main_get(JNIEnv *, jobject)
{
return 1;
}

5) 编译生成TestDLL.dll文件。并将这个.dll文件拷贝到java工程的目录中。
4:运行java工程就可以了。

问题:dll中如果使用了dynamic_cast,就必须把工程的rtti打开,而且dll编译为debug版本,因为rtti要记录每个类的一些信息。否则不能使用这个dll。

注意: 整个过程要保证jdk的版本统一,如vc环境下和javah部分。

Tomcat 6.0快速配置

第一步:下载j2sdk和tomcat:到sun官方站点
最新的jdk为1.6.04,tomcat为6.0,建议jdk1.4以上,tomcat4.0以上

第二步:安装和配置你的j2sdk和tomcat:执行j2sdk和tomcat的安装程序,然后设置按照路径进行安装即可。
1.安装j2sdk以后,需要配置一下环境变量,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的j2sdk安装在c:\j2sdk1.4.2):
JAVA_HOME=c:\j2sdk1.4.2
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;(.;一定不能少,因为它代表当前路径)
path=%JAVA_HOME%\bin

接着可以写一个简单的java程序来测试J2SDK是否已安装成功:
public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}

将上面的这段程序保存为文件名为Test.java的文件。
然后打开命令提示符窗口,cd到你的Test.java所在目录,然后键入下面的命令
javac Test.java
java Test
此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印出这句话,你需要仔细检查一下你的配置情况。

2.安装Tomcat后,在我的电脑->属性->高级->环境变量->系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat):
CATALINA_HOME:c:\tomcat
CATALINA_BASE:c:\tomcat
TOMCAT_HOME: C:\Tomcat
然后修改环境变量中的classpath,把tomat安装目录下的common\lib下的servlet.jar追加到classpath中去,修改后的classpath如下:
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet-api.jar;
接着可以启动tomcat,在IE中访问http://localhost:8080,如果看到tomcat的欢迎页面的话说明安装成功了。

第三步:建立自己的jsp app目录
1.到Tomcat的安装目录的webapps目录,可以看到ROOT,examples, tomcat-docs之类Tomcat自带的的目录;
2.在webapps目录下新建一个目录,起名叫myapp;
3.myapp下新建一个目录WEB-INF,注意,目录名称是区分大小写的;
4.WEB-INF下新建一个文件web.xml,内容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>

5.在myapp下新建一个测试的jsp页面,文件名为index.jsp,文件内容如下:
<html>
<body>
<center>
Now time is: <%=new java.util.Date()%>
</center>
</body>
</html>

6.重启Tomcat
7.打开浏览器,输入http://localhost:8080/myapp/index.jsp 看到当前时间的话说明就成功了。

第四步:建立自己的Servlet:
写入你的第一个Servlet:
在你新建的Application myapp/WEB-INF/classes/test目录下新建HelloWorld.java
package test;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)th
rows ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}

然后照样用javac HelloWorld.java来编译这个文件,如果出现无法import javax.servl
et.*
那么就是应该把C:\Tomcat\common\lib里面的servlet-api.jar文件拷贝到C:\JDK\jre\lib\ext中,再次编译,就没有问题了!
然后在Tomcat目录里面的C:\Tomcat\webapps\myapp里面按如下的文件结构:
myapp\index.jsp
myapp\WEB-INF\classes\test\HelloWorld.class(把上面生成的HelloWorld.class文件放在这个
里面)
然后在浏览器中输入http://localhost:8080/myapp/HelloWorld,于是Server众望所归的报错了:Error 404--Not Found
怎么回事呢?
Servlet必须使用C:\Tomcat\webapps\myapp\WEB-INF这个目录下面的web.xml文件进行注册,
用EditPlus打开这个web.xml文件,
在<web-app></web-app>添加下面这段程序:
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>test.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>

为什么呢?
因为 这样的结构
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>test.HelloWorld</servlet-class>//类的路径
</servlet>
表示指定包含的servlet类.
而以下的结构
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
表示指定HelloServlet应当映射到哪一种URL模式。

在修改web.xml完毕过后,重新启动Server,然后再输入http://localhost:8080/myapp/HelloWorld,,那么偌大一个Hello,World!等
着你呢,恭喜你!

第五步:建立自己java Bean

1. 在你新建的Application myapp/WEB-INF/classes/test目录下新建TestBean.java
package test;
public class TestBean
{
private String name =null;
public TestBean(String nameInit){
this.name = nameInit;
}
public void setName(String newName){
this.name=newName;
}
public String getName(){
return this.name;
}
}

然后照样用javac TestBean.java来编译这个文件。

2.然后在你新建的应用程序目录myapp下新建一个新的jsp文件:testBean.jsp
<%@ page import="test.TestBean" %>
<html>
<head>
<title>Test Bean</title>
</head>
<body>
<center>
<%
TestBean testBean = new TestBean("Http://yexin218.cublog.cn");
%>
Java Bean Test:
The author's blog address is<%=testBean.getName()%>
</center>
</body>
</html>

好了,确定各个文件的位置:
myapp\index.jsp
myapp\testBean.jsp
myapp\WEB-INF\web.xml
myapp\WEB-INF\classes\test\HelloWorld.class
myapp\WEB-INF\classes\test\TestBean.class

3.重启Tomcat如果需要的话,在浏览器输入:http://localhost:8080/myapp/testBean.jsp 幸运的话就会看到:

Java Bean Test: The author's blog address isHttp://yexin218.cublog.cn

这样就完成了整个Tomcat下的jsp、servlet和javabean的配置。

第六步:配置虚拟目录

打开 Tomcat6.0\conf\server.xml 文件,在 <Host> 和 </Host> 之间加入
<Context path="/myapp" docBase="D:\myapp" debug="0" reloadable="true" crossContext="true" />