凡人泛舟

逝者如斯
网志分类
· 所有网志
· 手机开发
· 软件工程
· 程序人生
· p2p
· db2
· struts
· spring
· hibernate
· JAVA
· Web2.0
· 未分类
最新评论
搜索本站
友情链接
· 我的歪酷 非非共享界
· 新浪体育
· 程序员大本营
· mandy的博客
· DLL文件集合
· 开复学生网
· 微软亚洲研究院
· Advanced JAVA
· IBM中国开发者
· java-sum
· 分享java快乐
· javaworld
· java爱好者
· 铁手java
· java在线教程(e文)
· P2P天空
· 8848software
· http://www.donews.com/
· 嘟嘟老窝

订阅 RSS

0033602

歪酷博客


@ 2009-04-12 16:24

使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处
 
作者:Arthur V. English 出处:IBM
 
本文内容包括:
本文来自于 Rational Edge:学习有关业务用例与系统用例相似和不同之处的知识,包括应该使用什么样的 UML 图,通过 IBM Rational Software Architect 或者其它建模工具来建模这些用例。

绝大多数构架师都认为业务建模是开发软件解决方案中到一个非常重要的活动。成功的解决方案会支持这个业务,它们能够解决业务问题并确保业务目标的实现。

当开发一个合理的业务模型以后,业务流程分析员能够探究不同业务改进的选项,比如取消多余的任务,使重复且平凡的任务或者容易出现的错误实现自动化操作。 IBM® Rational Unified Process®,或者 RUP®,以及 Unisys 3D Visual Enterprise, 或者 3D-VE, 或者 3D-VE,提供了一个系统化的方法,利用统一建模语言(UML)可以直观地表现业务模型,同时还可以派生出一个一致的且能够追溯到这个业务模型的起点系统用例模型。

这篇文章提供了 RUP 业务建模的概述,并解决了以下的问题:

  • 业务用例模型与系统用例模型有怎样的相似之处?
  • 业务用例模型与系统用例模型有什么不同之处?
  • 构建业务模型应该使用哪个 UML 图?
  • 业务用例模型与系统用例模型之间有什么关系?

背景

在谈论这个问题之前,我想解释一下为什么要挑选这个特殊的话题来写。自从1990年我就作为一名软件构架师从事系统用例的工作。当我是一名由 Unisys Global Public Sector 开发的 Integrated Justice Information Sharing (IJIS) 框架解决方案的总构架师时,还没有接触到业务用例,直到2002年。IJIS 现在已经发展成为 Unisys Information Sharing Management Framework (ISM)。

ISM 是一套支持信息共享的总体业务过程的可重用的组件。ISM Framework 利用 Service Oriented Architecture (SOA) 技术整合了不同类型的司法与公共安全系统,从而在关键决定点时分配关键的数据,文档以及图片。ISM 解决方案将为司法与公共安全 团体提供了一个业务框架、技术框架、基础应用软件以及方法,使政府机构能够继续使用他们的遗留系统。

ISM 是使用 RUP 进行设计的,ISM 业务模型是为 ISM 项目开发的首批工件之一。开发 ISM 业务模型对我来说是一个有意义的学习经历:我认识到的一个问题是,对于如何开发一个业务模型有很多含混不清的地方,为开发 UML 业务模型提供指导的文献相对比较少,而且有些不一致。

自 从我离开 Unisys Global Public Sector 加入到 Unisys University 作为一名培训和开发顾问后,就一直负责开发和交付软件构架和 IBM Rational 工具培训。我的职责之一就是 IBM Rational 课程 "Mastering Requirements Management with Use Cases" (MRMUC) 的教学。这门课程主要阐述的是开发系统用例,但是这门课程仅仅提供了什么是业务模型以及它如何与这个系统用例模型相联系的一个很有限的讨论。因此这篇文章 的目的之一就是为 MRMUC 课程补充材料。

这篇文章假定您已经有了系统用例建模和 RUP 需求规程的基本知识。如果您对系统用例建模并不熟悉,我建议您学习 RUP 需求规程的知识。

正如前面提到的,这篇文献关于业务建模的内容比较少,但是我们发现了一些非常有用的参考资料,远远多于您在 RUP 中找到的信息:

  • Writing Effective Use Cases, 由 Alistair Cockburn 编著。这是我最喜欢的关于业务和系统用例说明的著作。Alistair 强调一个业务或者系统用例模型最重要的部分是用例说明。这本书强调的就是用例说明,而不是 UML。
  • UML for the IT Business Analyst, 由 Howard Podeswa 编写。本书主要强调的是利用 UML 来开发一个业务模型,以及对 Alistair 的书进行补充。 UML for the IT Business Analyst 帮助我完成了关于如何开发一个有效的业务用例模型的课程培训。
  • Rational Edge 中的文章“Effective Business Modeling with UML: Describing Business Use Cases and Realizations”,由 Pan-Wei Ng 编写。那篇文章与这篇文章有些类似。那篇文章是从 UML 1.x 的角度来编写的。而这篇文章是从一个 UML 2.0 的角度来编写的,并且阐述了业务用例模型,业务分析模型,以及系统用例模型之间更深刻的关系。

既然我已经完成了预备工作,就让我们开始提一些问题。

业务用例模型与系统用例模型有什么相似之处?

业务用例模型与系统用例模型有很多相似之处。两个模型都有用例说明。如果您对业务用例模型以及系统用例模型的 RUP 模版进行检查,您会发现它们的格式十分相似。两者都包含先决条件、后置条件、扩展点 以及特殊需求。业务用例说明有基本的工作流和可选择的工作流,从而取代了基本的事件流和可选流。

业务用例说明与系统用例说明的格式十分相似,但是在设计范围上有些分歧。业务用例的设计范围是业务操作。它是这个组织外部的业务参与者,实现与业务组织相关的业务目标。让我们查看这个业务用例的 RUP 定义:

" 业务用例从一个外部的,增加值的角度来描述一个业务过程。为了给这个业务的涉众创造价值,业务用例是超越组织边界的业务过程,很可能包括合作伙伴和供应商。"

简单地说,这个定义标识了一些重要点,比如:

  • 一个业务用例描述的是业务过程——而不是软件系统过程。
  • 一个业务用例为涉众创造价值。这些涉众要么是业务参与者要么是业务工作者。
  • 一个业务用例可以超越组织的边界。有些构架师对于这一点有非常严密的态度。许多业务用例确实超越来组织的边界,但是有些业务用例仅仅关注于一个组织。我稍后将在这篇中给出一些例子。

让我们也看看 Podeswa 的书 UML for the IT Business Analyst 中对业务用例的定义:

"业务用例:业务过程是描述这个业务的具体工作流的;一次涉众与实现业务目标的业务之间的交互。它可能包含手工和自动化的过程,也可能发生在一个长期的时间段中。"

这个定义表明了通过实现业务目标创造价值的观点。它通过把一个业务过程描述成一个可能包含手工和自动化过程的具体工作流来详述 RUP 的定义。这个定义还指出,工作流可能发生在一个长期时间段中。所有的这些都十分的重要。

那么系统用例又是怎样的呢?系统用例的设计范围就是这个计算机系统设计的范围。它是一个系统参与者,与计算机系统一起实现一个目标。系统用例就是参与者如何与计算机技术相联系,而不是业务过程。

Cockburn 的 Writing Effective Use Cases 给业务和系统用例使用了相同的用例说明模版。业务用例与系统用例说明使用这个模版的区别是设计范围,而不是模版。Cockburn 想通过目标层次对用例进行分类,如表格1所示。

图1: Alistair Cockburn 对业务和系统用例的分类
cloud 高层概要
kite 概要
waves 用户目标
fish 子功能
clam 最低层

Cockburn 编写 Writing Effective Use Cases 的最初目标是系统用例,但他在业务用例上也花了很多精力。他利用目标层次来区分业务与系统用例,而不是使用不同的模版类型。那么这些图标和目标层次又意味着什么呢?

这些图标本身代表着一个简单的系统,它是根据用例与“海平面”(用户的实际层次)的相对高低来确定的。系统用例的最佳点是用户目标,通过海平面图标来表 明。有时候需要将复杂的系统用例分解成其它有子功能目标、通过鱼图标表明的用例。但是您应该尽量避免将海平面系统用例分解成蛤或者最低层系统用例。

也许您会猜测到,概要或者蛤用例应该是业务用例。云或者高层概要也可能是业务用例。

Cockburn 的方法是将这些用例看作是一个光谱,从一个组织的最高层次业务目标,到为实现这些业务目标而执行的软件解决方案的需求详细资料。这种方法将系统用例看作是 一个业务用例的分解。这个用例分解方法可以用来帮助您从这个业务模型驱动系统用例模型,我稍后会对这个问题进行讨论。

那么业务用例模型与系统用例模型图有什么其他相似之处呢?

  • 两者都有参与者。在业务用例图中,您将一个参与者原型化为 <<BusinessActor>>。
  • 两者都有用例。在业务用例模型中,您将一个用例原型化为 <<BusinessUseCase>>。
  • 在参与者与用例之间两者都有一个通信关联。
  • 业务用例和系统用例都能够包含、扩展,以及一般化关联。

用例图中的通信关联对于学习用例建模的人们来说,通常是一个容易混淆的地方。我应该使用箭头吗?这个箭头应该指向什么方向呢?通信关联已经被描绘出来,因 为 1.4 UML 规范是一条实线。这条线可以配上一个箭头。这条线和箭头代表角色与系统之间的双方对话。如果呈现出一个箭头,那么说明只有这个关联末尾的“这个事物”能够 发起通信。没有箭头的表明任何一方都可以发起通信(而不是两端都发起通信)。

UML 2.0 规范使它更简单。UML 2.0 不允许角色与用例之间或者业务角色与业务用例之间存在这种可灵活操作的关联。我个人比较喜欢箭头,但是如果您把 IBM Rational Software Architect (RSA) 当作您的 UML 建模工具,您就不能在角色和用例之间描绘出一个箭头。此时的 RSA 是完全没有错的。 UML 2.0 是通信关联不可灵活操作的原因。

既然我们已经讨论了业务用例模型和系统用例模型之间的相似之处,下面我们就看看它们的不同点。

业务用例模型与系统用例模型之间究竟有怎样的差别呢?

业务用例模型与系统用例模型之间主要有三点重大不同之处:设计范围、白盒测试与黑盒测试,以及业务操作者。

范围

在前面的部分中,我借助 Alistair Cockburn 的处于“水平线”上面、下面,或正好处于“水平线”的规定对设计范围进行了讨论。

业务用例着重于业务操作。它们表示实现业务目标的业务中的具体工作流。业务过程可能涉及手工和自动过程,并且在一段长期的时间内进行。

系统用例着重于要设计的软件系统。参与者如何与软件系统进行交互?我们在系统用例说明中书写的事件流应该足够详细,从而用作编写系统测试脚本的出发点。

白盒与黑盒

业务用例常常是以白盒形式编写的。它们描述了被建模的组织中的人和部门之间的交互。我们使用业务用例来说明在“现有”业务模型中组织如何工作。然后我们重 构“现有”的业务用例模型,让其面向将要建模的组织的未来设计。我们需要创建什么新角色和部门来提供更多价值,或者消除业务问题?什么角色和部门需要消 失?

系统用例几乎总是以黑盒形式编写的。它们描述了软件系统之外的参与者如何与将被设计的系统进行交互。系统用例详细阐明了系统需求。系统用例模型的目的是从涉众的角度说明需求,而不是设计如何满足需求。

业务角色

那么业务角色是什么?在系统用例图中,您只让参与者与用例进行交互。但在业务用例图中,您可以让业务参与者和业务角色与业务用例进行交互。

业务参与者是业务之外的人。它可以是一个角色或其他组织实体。例如,在刑事审判系统中,业务参与者可以是证人、嫌疑犯、外部的政府机构,例如健康服务,或业务实体,例如,业务资信咨询机构。

业务角色是业务内部的某个人或某个部门。在刑事审判系统中,业务角色可以是治安人员、法官、检察官,或假释官。当您实现了一个业务用例,并且创建了时序图和/或 通信图来显示业务参与者、业务角色,和业务实体如何协作执行业务用例时,您将会把业务角色从业务用例模型转入业务分析模型,并且加入所需的额外业务角色来提供业务用例功能。图 1 显示了基于 ISM 项目的示例业务用例图。

绘制刑事审判系统的业务用例

图 1:ISM 业务用例图

图 1 显示了一个业务参与者:嫌疑犯(Suspect)。有三个业务角色:执法人(Law Enforcement)、检察官(Prosecutor)和法院(Court)。有四个业务用例:逮捕被告(Arrest Subject)、请求担保(Request Warrant)、获得指纹和嫌疑犯照片(Capture Fingerprints and Mugshot),以及保释(Release on Bail)。获取指纹和嫌疑犯照片总是作为来自逮捕被告基础业务用例的强制行为。保释是继承逮捕被告业务用例的可选行为。

早先,我讨论了业务用例如何跨越组织边界,许多情况都是这样的。请求担保就是一个好例子。它涉及执法人和法院 。业务用例还可以只集中在一个组织上。获得指纹和嫌疑犯照片就是这样一个好例子。

我应该为业务建模使用哪些 UML 图?

在我讨论您在业务建模中使用的 UML 图之前,我想说一些关于使用 RSA 和 UML 2.0 创建业务用例图的提示:

  • 在 UML 1.x 中,您可以将参与者原型化为业务角色。在 UML 2.0 中,您必须创建一个类,然后将其原型化为业务角色。在 UML 2.0 中,您可以将参与者原型化为业务参与者,但您不能将参与者原型化为业务角色。
  • 在 UML 2.0 中,业务用例和业务角色之间的关联是可导航的。业务参与者和业务用例之间的关联是不可导航的。
  • 作为最佳实践,我推荐断开业务用例和业务角色之间的导航,从而保持业务角色与业务参与者的一致。业务角色及其用例关联应该按照业务参与者与业务用例通信的同样方式来绘制。
  • 您必须在您的工程的 Properties 标签页中选择 Profiles 选项卡,然后单击 Add Profile 按钮,来向您的工程中添加业务建模和健壮性分析原型。在 IBM Rational Rose 中,这是自动包含的。在 UML 2.0 中,概要文件用于包装原型和标记值 UML 扩展。UML 2.0 规范要求您向 UML 建模工程中添加概要文件来使用业务建模原型。

UML 业务模型包括两个模型:用例视图(Use-Case View)中的业务用例模型和逻辑视图(Logical View)中的业务分析模型。 1 业务用例模型中的主图是业务用例图。您还可以随意加入表示单个业务用例的 UML 活动图,来图形化地显示工作流过程,如图 2 所示,逮捕被告业务用例的活动图。

UML 2.0 活动图的插图实例

图 2:ISM 逮捕被告业务用例活动图

业务分析模型描述了通过业务角色和业务实体的交互来实现业务用例。它用作业务角色和业务实体需要如何相关联,以及它们需要如何协作,来执行业务用例的抽象。业务分析模型中有三种类型的 UML 图,如图 3 所示:类(Class)、时序(Sequence)和通信(Communication)图。

三种类型图的插图实例

图 3:业务分析模型图

业务分析模型中的主要的图是时序图。您手工地创建显示出业务参与者、业务角色,和业务实体如何交互执行业务用例的时序图。时序图显示出以时间时序安排的对象交互。特别是,它显示出参与交互的对象,以及消息交换的顺序。

通 信图是以前在 UML 1.x 中所称的协作图(Collaboration diagram),它描述了对象之间交互的模式,通过对象间的链接和发送给对方的消息来展示参与交互的对象。通信图和时序图都显示出交互,但它们强调了不 同的方面。时序图清楚地显示出时间顺序,但没有明确地显示出对象关系。通信图清楚地显示出对象关系,但必须从顺序号那儿获得时间顺序。

两个图都显示出同样的行为,但方式不同。我个人喜欢时序图,因为它通常比较容易读懂。您还可以使用参与类的视图(View of Participating Classes,VOPC)来显示协作执行业务用例的业务参与者、业务角色和业务实体的静态视图。

图 4 显示出 ISM 逮捕被告业务用例实现的时序图。图 5 显示出 ISM 逮捕被告业务用例实现的 VOPC。图 6 显示出 ISM 逮捕被告业务用例实现的通信图。

时序图

图 4:ISM 逮捕被告业务用例实现的时序图

在 ISM 逮捕被告业务时序图这部分中,如图 4 所示,有三个从业务用例模型转入的业务角色:执法人、签署者(Subscriber)和刑事审判系统。刑事审判系统是执法人、法院、检察官,等等的一般化。为了让时序图简单化,我们使用该泛化来表示 ISM 可以使用的任意刑事审判系统。

图 4 还显示出引入到业务分析模型中的两个新的业务角色:档案管理系统(Records Management System,RMS)和 ISM Broker。RMS 通常是商业化成品(commercial off-the-shelf,COTS)解决方案,它将地方的执法用作刑事案件管理系统。ISM Broker 是 Unisys 计划开发的软件解决方案的自动化候选者或代理。

Unisys ISM 解决方案利用中心辐射型 SOA 技术整合了多个各种各样的司法系统,从而在重要决策点处,分享关键任务的数据、文档、图像和事务。ISM 可以在 Microsoft BizTalk Server 或 IBM WebSphere Business Integration 上实现。ISM Broker 作为在审判团之中数据共享的导管,并且利用当前的技术来推、拉、发布和订阅信息,从而支持日常的审判操作。

参与类的视图

图 5:ISM 逮捕被告业务用例实现的 VOPC 图

图 5 中的 VOPC 图显示了参与逮捕被告业务用例的业务参与者、业务角色和业务实体的静态视图。注意为每个业务角色显示的操作。这些操作被称为业务职责。VOPC 图的更精确的名称是参与的业务参与者、业务角色和业务实体的视图(View of Participating Business Actors,、Business Workers 和 Business Entities)。在本实例中,只有业务角色协作执行业务用例。

通信图

图 6:ISM 逮捕被告业务用例实现的通信图

如前面所提到的,通信图(如图 6 所示)是观察时序图中所示行为的另一种方法。RSA 提供了从时序图创建通信图的自动能力,反之亦然。

还有一个要回答的问题。

业务用例模型和系统用例模型之间的关系是什么?

图 7,业务用例到系统用例的向下流动(Business to System Use-Case Flow Down),出自我所教授的 IBM Rational 课程“Mastering Requirements Management with Use Cases”。

从业务到系统级用例的向下流动过程

图 7,业务用例到系统用例的向下流动

图 7 例举了课程中最难教授的主题之一,因为您要理解该图所需的大部分基础不在标准课程材料之内。本文的其中一个目的是提供额外的基础。

图 7 显示了业务模型中所找到的东西和系统用例模型中的东西之间的清晰映射。在此特殊的实例中,可以看出,系统能够将业务角色的职责自动化。它还显示出关键的业务角色是自动化的候选者。

记住,业务模型包含业务用例模型和业务分析模型。业务分析模型是业务用例模型的实现,并且拥有紧密的集成化和可追溯性。系统用例模型可以追溯到业务分析模型。业务分析模型可以追溯到业务用例模型。

使用该方法,您可以构建从业务分析模型演化来的系统用例模型。这向您的整个 UML 模型提供了一致性和可追溯性。

那么系统参与者和系统用例从那里来的呢?系统参与者是根据业务分析模型中的业务参与者和业务角色而生成的。与业务角色自动化候选者交互的业务参与者总是成为系统参与者。不是自动化候选者的,与业务角色自动化候选者交互的业务角色成为系统参与者。例如,ISM 业务分析模型中的执法人和法院成为了系统参与者。ISM Broker 是“纯”自动化候选者。它不会成为系统参与者。

我所谓的纯是什么意思呢?简单的说,自动化候选者的唯一目的就是成为我们正在开发的软件解决方案的代理。注意到图 7 中的 Loan Specialist。Loan Specialist 业务角色转换为系统参与者和系统用例。让我来解释一下。

Loan Specialist 是图 7 中所示的业务模型中的角色。在我们的系统用例模型中,需要有作为 Loan Specialist 角色的参与者。但是,在我们正在开发的新的软件解决方案中将 Loan Specialist 的一些业务职责自动化了。业务分析模型中的那些业务职责成为了系统用例模型中的系统用例。

其他的纯业务角色自动化候选者将不会转换为系统用例模型中的系统角色。这回答了问题,“系统用例是从哪里来的?”系统用例是根据业务分析模型中的业务角色自动化候选者的业务职责而创建的。如果您回到图 5,显示了 ISM Broker 的 VOPC 图,每个业务职责,例如 Query for Information,都可以转换为系统用例模型中的系统用例。

分析模型显示了业务实体如何映射到系统分析模型中的类上。这些类表示系统将使用的“数据”。

总结

我的目标是概括出 RUP 业务建模和系统用例建模的比较情况。我讨论了相似点和差别,以及业务用例模型和系统用例模型之间的关系。如果您对这些比较和关系有任何疑问,可以通过 arthur.english@unisys.com 联系我。

注释

1用例视图(Use-Case View)、逻辑视图(Logical View)是 UML 4+1 视图模型架构(UML 4+1 View Model Architecture)的一部分。要了解更多关于 4+1 视图模型架构的信息,您应该学习分析与设计规程中的 URUP 软件架构概念。

现在对本文进行讨论!

尊敬的读者:现在有了一个特别为 Rational Edge 的文章创办的 新论坛,现在您就可以分享您对本文或本期杂志或以前杂志中的其他文章的想法。阅读世界各地您的同行们所说的内容,生成您自己的讨论,或者加入正在进行的讨论。单击 此处开始。

参考资料

  1. Cockburn,Alistair。 Writing Effective Use Cases. Addison-Wesley:2001 年。
  2. Podeswa,Howard。 UML for the IT Business Analyst. Thomson Course Technology:2005 年。
  3. Eriksson、Hans-Erik 和 Magnus Penker. Business Modeling with UML: Business Patterns and Business Objects. Wiley:1999 年。
  4. Ng,Pan-Wei。 “Effective Business Modeling with UML: Describing Business Use Cases and Realizations.” Rational Edge:2002 年。
  5. Booch、Grady、Jacobson、Ivar,和 Rumbaugh, James。The Unified Modeling Language Reference Manual,第二版. Addison-Wesley:2005 年。



 
@ 2006-12-13 13:05

用java程序高效的解压jar文件(转载)

来源:http://topic.csdn.net/t/20050721/19/4159928.html

我写了一个方法,但是占有大量的cpu,希望大侠指教   


  我的代码入下:  
  public   static   boolean   unJarFile(String   jarFileName,String   outputDirectory)  
      {  
          JarInputStream   in=null;  
          try  
          {  
              in=new   JarInputStream(new   FileInputStream(jarFileName));  
              JarEntry   jen;  
              while((jen=in.getNextJarEntry())!=null)  
              {  
                  if(jen.isDirectory())  
                  {  
                        String   name   =   jen.getName();  
                        name   =   name.substring(0,   name.length()   -   1);  
                        File   file   =   new   File(outputDirectory   +   File.separator   +   name);  
                        file.mkdir();  
                  }  
                  else  
                  {  
                      String   fname=outputDirectory   +   File.separator   +   jen.getName().substring(0,jen.getName().indexOf("/"));  
                      File   dt=new   File(fname);  
                      if(!dt.exists())  
                      {  
                            dt.mkdir();  
                      }  
                      File   file   =   new   File(outputDirectory   +   File.separator   +   jen.getName());  
                      file.createNewFile();  
                      FileOutputStream   out   =   new   FileOutputStream(file);  
                      int   b;  
                      while   (   (b   =   in.read())   !=   -1){  
                          out.write(b);  
                      }  
                      out.close();  
                  }  
              }  
              in.close();  
          }  
          catch(Exception   e)  
          {  
              try   {  
                  //e.printStackTrace();  
                  in.close();  
                  return   false;  
              }  
              catch   (IOException   ex)   {  
                  return   false;  
              }  
          }  
          return   true;  
      }  
  希望能有一个高效的算法



 
@ 2006-12-13 13:03

最近由于一个工程需要做应用程序启动时,自动更新的项目
在GOOGLE上找了半天也没见到什么比较好的办法
自己动手写了一个通过版本号检查网络上是不是存在新的更新文件,并自动通过HTTP下载文件的程序
希望对正在找此类程序的朋友有帮助

本地文件需要一个ver.txt  此文件内容为本地软件版本号
网络上我直接在一个页面上打印出网络存在的版本号
 例如,这个例子里,我在 http://XXX.XXX.XXX/AutoUpdate/ver  这里直接打印出版本号

源文件:http://211.136.109.100/beiouwolf/AutoUpdate.rar 

 

import javax.swing.*;
import java.awt.*;
import java.net.*;
import java.io.*;

public class CheckUpdate extends JFrame {
    JFrame c = this;

    public CheckUpdate() {
        //设置窗体属性
        setAttb();

        JLabel title = new JLabel("正在检查网络上的更新资源...");
        this.add(title, BorderLayout.NORTH);
        JTextArea msg = new JTextArea();
        this.add(msg, BorderLayout.CENTER);
        JLabel process = new JLabel();
        this.add(process, BorderLayout.SOUTH);
       
        //启动更新线程
        new Check(msg, process).start();
    }

    private class Check extends Thread {
        //标识,是否存在新的更新文件
        private boolean isUpdated = false;
        //保存最新的版本
        String netVersion;
        //本地版本文件名
        String LocalVerFileName = "ver.txt";

        //显示信息
        private JTextArea msg;
        private JLabel process;

        public Check(JTextArea msg, JLabel process) {
            this.msg = msg;
            this.process = process;
        }

        public void run() {
            //更新文件版本标识URL
            String versionUrl = "http://XXX.XXX.XXX/AutoUpdate/ver";

/*
这里是通过HTTP访问一个页面,以取得网络上的版本号
比如这里就是在这个页面直接打印出 6.19.1.1
然后把这个版本号比对本地的版本号,如果版本号不同的话,就从网络上下载新的程序并覆盖现有程序

*/

            URL url = null;
            InputStream is = null;
            InputStreamReader isr = null;
            BufferedReader netVer = null;

            //读取网络上的版本号
            try {
                url = new URL(versionUrl);
                is = url.openStream();
                isr = new InputStreamReader(is);

                netVer = new BufferedReader(isr);
                String netVerStr = netVer.readLine();
                String localVerStr = getNowVer();

                if (netVerStr.equals(localVerStr)) {
                    msg.append("当前文件是最新版本\n");
                    isUpdated = false;
                } else {
                    msg.append("存在更新文件,现在开始更新...\n");
                    isUpdated = true;
                    netVersion = netVerStr;
                }

            } catch (MalformedURLException ex) {
            } catch (IOException ex) {
            } finally {
                //释放资源
                try {
                    netVer.close();
                    isr.close();
                    is.close();
                } catch (IOException ex1) {
                }
            }

            //如果版本不同,下载网络上的文件,更新本地文件
            if (isUpdated) {
                //本地需要被更新的文件
                File oldFile = new File("client.exe");
                //缓存网络上下载的文件
                File newFile = new File("temp.exe");
               
                //网络上的文件位置
                String updateUrl =
                        "http://XXX.XXX.XXX/downloads/simpkle.exe";

                HttpURLConnection httpUrl = null;
                BufferedInputStream bis = null;
                FileOutputStream fos = null;

                try {
                    //打开URL通道
                    url = new URL(updateUrl);
                    httpUrl = (HttpURLConnection) url.openConnection();

                    httpUrl.connect();

                    byte[] buffer = new byte[1024];

                    int size = 0;

                    is = httpUrl.getInputStream();
                    bis = new BufferedInputStream(is);
                    fos = new FileOutputStream(newFile);

                    msg.append("正在从网络上下载新的更新文件\n");

                    //保存文件
                    try {
                        int flag = 0;
                        int flag2 = 0;
                        while ((size = bis.read(buffer)) != -1) {
                            //读取并刷新临时保存文件
                            fos.write(buffer, 0, size);
                            fos.flush();

                            //模拟一个简单的进度条
                            if (flag2 == 99) {
                                flag2 = 0;
                                process.setText(process.getText() + ".");
                            }
                            flag2++;
                            flag++;
                            if (flag > 99 * 50) {
                                flag = 0;
                                process.setText("");
                            }
                        }
                    } catch (Exception ex4) {
                        System.out.println(ex4.getMessage());
                    }

                    msg.append("\n文件下载完成\n");

                    //把下载的临时文件替换原有文件
                    CopyFile(oldFile,newFile);
                   
                    //把本地版本文件更新为网络同步
                    UpdateLocalVerFile();

                } catch (MalformedURLException ex2) {
                } catch (IOException ex) {
                    msg.append("文件读取错误\n");
                } finally {
                    try {
                        fos.close();
                        bis.close();
                        is.close();
                        httpUrl.disconnect();
                    } catch (IOException ex3) {
                    }
                }
            }

            //启动应用程序
            try {
                msg.append("启动应用程序");
                Thread.sleep(500);
                Process p = Runtime.getRuntime().exec("client.exe");
            } catch (IOException ex5) {
            } catch (InterruptedException ex) {
            }
           
            //退出更新程序
            System.exit(0);
        }
//复制文件
        private void CopyFile(File oldFile, File newFile) {
            FileInputStream in = null;
            FileOutputStream out = null;
           
            try {
                if(oldFile.exists()){
                    oldFile.delete();
                }
                in = new FileInputStream(newFile);
                out = new FileOutputStream(oldFile);

                byte[] buffer = new byte[1024 * 5];
                int size;
                while ((size = in.read(buffer)) != -1) {
                    out.write(buffer, 0, size);
                    out.flush();
                }
            } catch (FileNotFoundException ex) {
            } catch (IOException ex) {
            } finally {
                try {
                    out.close();
                    in.close();
                } catch (IOException ex1) {
                }
            }

        }

        private void UpdateLocalVerFile() {
            //把本地版本文件更新为网络同步
            FileWriter verOS = null;
            BufferedWriter bw = null;
            try {
                verOS = new FileWriter(LocalVerFileName);

                bw = new BufferedWriter(verOS);
                bw.write(netVersion);
                bw.flush();

            } catch (IOException ex) {
            } finally {
                try {
                    bw.close();
                    verOS.close();
                } catch (IOException ex1) {
                }
            }
        }

        private String getNowVer() {
            //本地版本文件
            File verFile = new File(LocalVerFileName);

            FileReader is = null;
            BufferedReader br = null;

            //读取本地版本
            try {
                is = new FileReader(verFile);

                br = new BufferedReader(is);
                String ver = br.readLine();

                return ver;
            } catch (FileNotFoundException ex) {
                msg.append("本地版本文件未找到\n");
            } catch (IOException ex) {
                msg.append("本地版本文件读取错误\n");
            } finally {
                //释放资源
                try {
                    br.close();
                    is.close();
                } catch (IOException ex1) {
                }
            }
            return "";
        }
    }


    private void setAttb() {
        //窗体设置
        this.setTitle("Auto Update");
        this.setSize(200, 150);
        this.setLayout(new BorderLayout());
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        // 窗体居中
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension frameSize = this.getSize();
        if (frameSize.height > screenSize.height) {
            frameSize.height = screenSize.height;
        }
        if (frameSize.width > screenSize.width) {
            frameSize.width = screenSize.width;
        }
        this.setLocation((screenSize.width - frameSize.width) / 2,
                         (screenSize.height - frameSize.height) / 2);
    }

    public static void main(String[] args) {
        CheckUpdate checkupdate = new CheckUpdate();
        checkupdate.setVisible(true);
    }
}





 
@ 2006-12-10 14:38

VS.NET 学习方法论

      ——我的VS.NET学习之旅

          屠恩海(
SunHai

   开发工具:Microsoft Visual Studio .NET 2003
   操作系统:Windows XP

  题记即使你没有一点编程经验,只要你愿意,并理解本文介绍的学习方法,你也可以象作者一样轻松、愉快地步入程序设计之门。让我们一起开始激动人心的VS.NET之旅。
  

  26岁的时候,给自己定下目标,35岁之前必须掌英语和程序设计。至今刚过而立,程序和英语都学得不怎么样,对学习方法倒是有所体悟,愿与大家分享。
   
  在此先介绍一下我的情况。26岁前主要从事语文教学,对计算机及英语可以说一窍不通。说出来可能让您笑话:计算机不会上网;英语不认识音标。我这人水平虽然不怎样,志向却比天高,下决心改变自己,说干就干,花7000大洋购来电脑,开始自学计算机。26岁,人生翻开新篇章。
  首先把自家电脑来个开膛破肚,把硬件拆了装,装了拆(可怜我的主板,修了几次,还是报废;显卡由于带电插拔烧断了“脚”,还是手机店的朋友帮忙焊接上的)。为了从网上快速查找到需要的教程文章,忍痛每月花100大洋窄带包月,想当时Down个X片足足用了两天两夜,结果下集只有声音没有图像,还把他听完,呜乎!
  我一向提倡在工作中学习,学的东西要和工作相关,工作和学习互相促进。做语文教师虽也可以自学计算机,但我觉得进程太慢了(那时我所在学校还未设计算机课程)。于是,刚学计算机不到半年的人“一不小心”就成了电脑教师。还好基本是入门级培训,不过也逼着我学得更快。本来我是用拼音加加输入法的,因为工作关系,只好改用五笔。全国计算机等级考试要考DOS,于是又学了DOS。本来用FrontPage做网页,现在改用Dreamweaver MX,还有FireWorks MX,Flash MX也懂一点。对着主板随机手册和英文词典尝试几次,开机CMOS也可以进出自如。什么系统优化,GHOST系统备份都不在话下。做的网页虽然界面不怎么样,IP日访问量却是每天300以上。直到29岁,对Windows应用编程却还是一点不懂,VB6删了装,装了删,反复几次,觉得很难,始终未跨过编程第一道门槛。

  前日跟在嵊州信息港工作的MM交流,言及在自学Visual Studio .NET编程,MM问:你在闭关学习吗?我回答:你“赞助”学费的话我也许会考虑考虑。是的,网络是所大学,最大的大学,网络可以改变世界,终将改变世界。网络更可以改变人生,可以让我们的学习生活无比精采,只要你懂得利用,善于利用。现在已是网络时代,网络交流基本弥补了自学的不足,网络交流更有学校教育无可替代的优点。
  你看到这里,如果你没有接触过程序语言,想了解一下Visual Studio .NET是个什么“东东”,你会如何做?
  第一,查手头书籍,个人开个计算机图书馆是不现实的,要查找的知识往往在手头书籍中找不到;
  第二,打电话问朋友,朋友懂不懂是个问题,即使懂,他有没有空?他有空,他不清楚你这边的实际情况,他说的并不一定是你想要的,或者你不一定听得懂;
  第三,上图书馆查资料;
  第四,上书店;
  第五,跑去问老师;
  第六,……
  是的,传统是这么做的。但现在是网络时代了。你完全可能在不到一分钟之内找到你想要的答案。现在开启你的电脑(前提是你不认为购买电脑是极大的浪费),拨号上网(前提是你认为有必要给电脑配置Modem并接入网络),打开Internet Explorer,在地址栏输入http://www.google.com,然后回车,在打开的页面中间输入框中敲入Visual Studio .NET 编程,注意中、英文中间有个空格。然后再回车,页面显示:共有 12,800 项查询结果,这是第 1 - 10 项。 搜索用时 0.28 秒,怎么样,还用我给你介绍Visual Studio .NET是什么东东吗。你就尽情地点击标题,查看您需要的知识吧。

  “软件是一个过去的时代,Web Service将要来临。”微软高级副总裁李开复说,“Web Service本身可以说是一个赌博,一个风险;因为你可以相信,也可以不相信这件事情的发生。我只能说微软把整个公司都赌下去了,我们赌的未来就是Web Service。” 你可不要告诉我你比盖茨厉害多了。我们追求超越盖茨不一定现实,但我们可以早一步接触网络,利用网络。

  第一点体会:掌握计算机的基础知识,学会利用网络来进行学习,特别是利用搜索引擎(如http://www.google.com)来查找你所需要的答案。

 

  29岁,开始从事企业管理工作。由于工作的关系,要用到MicroSoft Office办公软件,Office办公软件中有个 Visual Basic For Application (VBA)语言,是VB的一个子集,具备VB的所有优点,内置于Office中,只能在Office中创建、编程和运行,可以录制宏并自动转换为代码。由于初次接触编程语言,感到自学VBA有难度。每逢在学习中遇到难题、困惑的时候,我就到会到网上寻找学习资源,寻找答案。很快就找到关于MicroSoft Office的极好社区,如OfficeFans(http://www.officefans.net) , ExcelHome(http://club.excelhome.net/) ,于是立即在社区注册名字,学习VBA时中碰到疑问就到社区去问,每次都有网友热心解答。
  比如我的工作需要经常在Excel工作表第十行前插入空白行,要先选取工作表,鼠标指针定位到指定行,然后单击右键,选“插入”。重复操作,不胜其烦。于是在OfficeFans提问,经版主kengzeng指点,得到如下VBA代码:

  Sub insert()
    Sheets("sheet2").Rows("10:10").Insert
  End Sub

  原来要四步操作,现在一按快捷键就完成了。我原来并不懂VBA,对“集合”、“对象”、“方法”、“属性”、“事件”、“枚举”等编程概念也不甚了了,但由于有网上高手的指点、帮助,我仍旧可以在工作中应用VBA,多次应用下来,用到的一些VBA代码不去死记也差不多会背了,对VBA的一些概念、理论开始有所了解。

  万事开头难。学习一开始碰到难题,如果解决不掉,就可能从此放弃学习了,如果这时有热心人解答他的疑问,然后在实际中立即可以应用新知识,新知识得到了即时巩固,学习的兴趣得到激发和增强,学习就得以继续和深化。当然,对于有“悬梁刺股”精神的朋友,自己看书刻苦钻研也可能会解决所有疑难问题,但那毕竟是极少数,我想多数人是象我这样的普通人。

  来而不往非礼也。在网上得到诸多大侠的指点,总感到好像欠了谁什么似的,就想到编一本电子书,把常见的Excel VBA学习教程集中到一起,可以帮助初学者快速入门。 2003年6月较空闲,刚好自己对Html语法也懂一点,就花了二周的时间,搜集整理了一本电子书,叫《Excel 应用宝典》,其中重点内容是Excel VBA。把电子书放到OfficeFans上供网友下载,极受欢迎。我为什么编这本电子书呢?真的是比较空闲的缘故?有空去泡MM不是很好,何必去做枯燥的文字整理工作,其实我是存有“私心”的?

  什么“私心”?这叫帮人即帮己,助人即助己。“佛”渡人其实也是为了渡己啊。我为了领悟这个道理,诸子百家,佛道儒易医,无所不涉,并在生活中曲折浮沉,这样还是用了“30年”时间(太夸张了,一出生就……?呵呵),各位比我聪明,应该早就明白此理。

  为什么助人即助己?
   在学术上帮助别人,指点别人,就要站在别人的角度考虑,思考别人的思考,打破了小我的思维局限。
   从信息角度讲,个人自修,知识的附加信息量较小,而在帮助别人过程中,存在人与人的信息交流,在信息交流中,知识信息得到强化。
  举一个例子,小孩子生活在英语环境中,3岁即口语流利,而我们的学校教育,大学毕业,英语学了十多年,还是哑巴英语的大有人在,为什么?
  小孩子记一个单词或句子,是在和外界信息交流中记忆的,确切地说,小孩子记住了当时信息交流的情境,通过情境的自然记忆实现单词或句子的自然记忆。学习口语如此,学习编程何尝不如此呢?你在某个问题上指点过别人,你的记忆印象可能就特别深,如果是个人看书自学,对于某个问题当时虽然理解,但附助记忆的情境信息量很小,时间长了就容易遗忘。
  所以,在学习编程的过程中,多和别人交流,多向高手虚心求教,多指点初学者,是在人为创造学习情境,在情境中强化记忆,强化理解。
  李阳提倡“疯狂英语”学习法,我则提倡“疯狂编程”学习法,也就是创造一切机会和别人交流编程经验,从交流中进行强化训练和学习。也要注意,交流是手段不是目的。
  交流编程经验的途径有很多:如论坛交流,媒体投稿,QQ、icq等通讯软件交流。个人觉得CSDN为我们提供的“个人专栏”非常好,您可以一边学习编程,一边记下心得,通过个人专栏和大家交流。


  VBA是VB的应用分支,我在工作中应用VBA,并自然地对VBA的概念、理论有了初步了解,这时再去看VB的教程,就感到分外亲切。因为VBA和VB在本质上是没有区别的。我终于可以跨入VB编程之门了。

  第二点体会:学习编程的过程中,既要善于向高手寻求帮助,更要乐于指导初学者。在交流中学习编程,这决不是宗教式道德说教,而是极其重要的学习方法和学习手段。


   程序语言种类很多,Pconline工具平台就列有VB/VB.NET、VC/C#、Delphi、Java、C++Builder等。到底学什么语言好呢?在Google输入语言 比较,查到一篇文章《编程语言的宗教狂热和十字军东征》第一段就是:
  
业余程序员最喜欢做的一件事就是对不同的语言进行比较。Java是否比C++好?C#是否会成为终极语言?凡此种种。从专业程序员的角度看来,这是最低级无趣的游戏。其一,在项目诸元确定之后,通常并没有选择语言的余地;其二,语言的生存本身就是一个达尔文主义的问题:设若两种语言有明确的可比较性,其中较劣的那一种必定早已被淘汰出局,又何来比较的必要?
  
  我基于两个原则选择编程语言:
   其一,适用自己的就是最好的。
   其二,如果不知道什么适用自己(业余程序员开发软件基于个人爱好,往往有此困惑),那么优先选择MicroSoft的开发语言。

  我选的是VB(每个人的具体情况不,我的选择不一定适合你),我目前只考虑开发普通Windows应用软件,并希望Windows应有软件的开发和MicroSoft VBA的应用互相促进,说穿了,是精力有限,最好是一种语言,到处应用。
  于是在网上Down了N多的电子书,收藏夹里VB网站一大堆。常去的VB网站有1000VB ,AppleVB , cnDevx51DoNET等,但我发现,除了CSDN,VB社区论坛的人气大多不旺。
  
   第一次接触VB,没有基础,业余自学,如何快速掌握VB编程?
   如果我有足够的时间(业余自学,时间显然不足),有足够的耐心(恰恰我是耐心不那么足的人),可以按照教程一个一个控件学习、练习,这个过程无疑是有益的,但对我来说显然是过于枯燥的。或许如此下去,半年以后,我的VB基础比较好了,但可能不到半年,早就被我放弃。这就要另辟蹊径。我的设想是,一开始就定下一个软件项目,带着目的去学,以一个控件为核心,在完成项目的过程中,逐步掌握VB控件的使用和编程基本理论。项目基本完成的时候,VB编程也就入门了。由于是带着项目去学,目的明确,学习过程就不会枯燥。如果你做共享软件,你的项目创意又比较好,你VB编程入之门之日,也许你的软件也就可以为你带来Money了,呵呵!
  开发一个什么样的软件呢? SUN提出了激动人心的口号:“网络就是计算机”。计算机的应用主要在于网络,于是定位于开发网络软件。我经常到网络社区论坛交流,注册时要一项项填写信息,发言时也要一项项填写信息,感觉很费时间,打算自己编软件来实现自动注册,自动发言。  
  
   2003年5月学VBA时想用VBA实现在论坛自动注册和发言,实现起来有难度,就在网上找替代软件,找到了按键精灵”(http://www.vrbrothers.com/cn/qmacro),按键精灵是一个模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘的动作。 觉得很不错,就编写了一个脚本,用按键精灵自动实现如下功能:打开Internet Explorer,输入并打开网址,移动鼠标到指定座标,输入字符,然后按回车完成注册发言。比起手工输入,用按键精灵省力不少,但是不同网站,输入框的座标不同,要手动抓取,有没有更方便的软件呢?按键精灵社区里有人讲到EzScript(http://ezscript.seed.cx/)功能更多,试用后发现在WindowsXP里反应不灵敏,再在Google狂搜,找到了比按键精灵更好的软件PCWorker(http://www.pcworker.net) 。PCWorker配合网络填表软件FORMGHOST ,再加上MyIE,可实现双击注册或发言,需要的话,还可在标题加上随机数,而且在PCWorker中代码的可读性较强,且作者能及时听取网友意见对软件加以改进。
  PCWorker虽然好用,但要读取识别码图片上的数字,这是PCWorker类软件不能胜任的。于是决心用VB6来实现所有自己想要实现的功能。2003年10月开始学习VB6,到11月半,项目基本完成。我是怎么做的呢?

  
首先浏览各VB网站有关文章,发现用WebBrowser控件能实现我所欲求的功能。
  其次,大量搜集WebBrowser控件相关文章和代码。
    Google搜寻。如用“WebBrowser”为关键词搜索,共有 216,000 项查询结果 。
     CSDN论坛搜索。导航到http://expert.csdn.net/Expert/Forum.asp,登陆论坛,点击“搜索”,选“全部论坛”,点选“最新数据搜索”,用“WebBrowser”为关键词,然后点击“对选择的大类进行搜索”,哇,有好几百篇有关“WebBrowser”的问答。
     在CSDN论坛 作全文检索,寻找更多有检值的内容。
     CSDN文档搜索,导航到http://www.csdn.net/develop,在右上角搜索输入框输入"WebBrowser",选择“文档标题”,再单击“搜索”,我得到30篇有关“WebBrowser"相关文档。

    在实际编程中遇到困难,还可以到CSDN论坛提问,寻求帮助。我就曾在CSDN论坛问了不下十个有关Webbrowser有关问题,并都得到了解答。
  
  由于善于运用以上三步,1个半月时间,我的软件基本出炉,VB编程也已基本入门。软件实现原理是,用WebBrowser控件,先Navigate到指定网址,然后填写表单。主要代码如下:

Private Sub cmdfill_click()  '点击按钮开始发言
On Error Resume Next
  Dim vdoc As IHTMLDocument2
  Dim vTag

  Dim i As Integer
  If Not brow.Busy Then '如果下载完成,就执行下面程序
    Set vdoc = brow.Document  
    For i = 0 To vdoc.All.Length - 1 '检测所有标签
      If UCase(vdoc.All(i).tagName) = "INPUT" Or UCase(vdoc.All(i).tagName) = "TEXTAREA" Then
       '找到input标签
        Set vTag = vdoc.All(i)
          If vTag.Type = "text" Or vTag.Type = "password" Then '看看是不是我们需要的
            Select Case vTag.Name
              Case "name"
                vTag.Value = "sunHai"
              Case "passwd"
                vTag.Value = "sunHaiGood"
              Case "subject" '写标题,不同的网页表单,vTage.name的值不同,要查看网页源码修改
                vTag.Value = "Hello,sunHai!"
            End Select

          'ElseIf vTag.Type = "submit" And vTag.Value = "发表" Then '找到发表按钮。
            ' vTag.Click
          End If
      End If
    Next i

    vdoc.Forms(0).submit '也可以用这句来提交表单
  End If
End Sub


第三点体会:从应用入手,从解决实际问题出发,在完成项目的过程中,逐步掌握控件的使用技巧和编程基本理论。

  在学习VB6的同时自然接触到 Microsoft Visual Studio .NET(简称VS.NET)。在十年之前,Visual Basic 1.0 成为数以百万计的开发人员的革命性的应用程序开发语言。现在,Visual Studio .NET 为未来的十年做好了准备(有点象为MicroSoft打广告,你说呢),VS.NE是用于创建下一代应用程序的理想而又现实的开发工具,是一个从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据,XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。Visual Studio .NET 和 XML Web 服务提供简单、灵活、基于标准的模型,允许开发人员从新的和现有的代码汇编应用程序,而与平台、编程语言或对象模型无关。
  VS.NET 2003中主要有包含以下几种开发工具:
    Visual Basic .NET 2003
   Visual C# .NET 2003
   Visual C++ .NET 2003
   Visual J# .NET 2003
  核心是 Visual Basic .NET 2003和Visual C# .NET 2003。我主要用VB.NET。在VS.NET中的不同开发工具的差别主要表现为语法的差异,因此,用VB.NET的人,一般也可以看懂C#.NET的代码,反之亦然。

  有人说,“学习要面向未来”,2003年12月,我的主要开发工具从VB6转为VB.NET,2004年1月1日,把我新开发的软件从VB6语言转写为VB.NET语言,并正式命名为网络广告王(AdKing)

  在转向VB.NET的时候,我考虑:
  第一、VS.NET的本质是什么?
  VS.NET是从一开始就是为 XML Web 服务创建的开发环境。通过允许应用程序通过 Internet 沟通和共享数据,XML Web 服务使业务能够从 Internet 转换为用于集成和传送它们的核心商业价值的真正平台。
   学习要面向未来,就要学习最新的技术,现在的学习为将来的应用作铺垫。我的软件要突出两点,一是基于Internet的应用,二是要应用XML技术。这样,我就可以在应用中尽快掌握新技术,否则,只是为学习而学习,无疑会是比较枯燥,也容易遗忘。
  第二、原来用VB6写的AdKing,主要用到WebBrowser控件,网页加载速度慢,会下载图片,Flash等许多不需要的东西,在VS.NET中必须用其他方法实现同样功能。
  在CSDN诸位朋友的帮助下,并参考许多资料,我的AdKing已基本具备.NET特征。
  
  1.应用了XML技术
  VB6中,INI文件通常用来保存系统信息、配置信息,读写INI文件要用到API函数,使用起来不是很方便。在VS.NET中,已经没有必要用INI文件来保存和读取一些信息了,可以改用VS.NET中的读写XML文件的类。而且,在VS.NET 2003的后续版本中,处理XML有关功能将得到进一步增强。
  读取XML到DataGrid代码:

 Public MyXMLDataSet As New DataSet("XMLDataSet")
' DataSet 是数据的一种内存驻留表示形式,无论它包含的数据'来自什么数据源,它都会提供一致的关系编程模型。一个 'DataSet 表示整个数据集,其中包含对数据进行包含、排序和约束的'表以及表间的关系。
 MyXMLDataSet.ReadXml("regid.xml")   '读入XML文件
 form1.DefInstance.DataGrid1.DataSource = MyXMLDataSet   'DefInstance是form1的共享属性, 我们不用创建实'例就可以直接用‘类名 .共享成员'的方法进行调用 , 《Henry 的 VB.NET 之旅 ( 三 )— 共享成员》中有论述。
 strName = MyXMLDataSet.Tables(0).Rows(0).Item("name").ToString '   从DataGrid中读取用户名信息。


  
  从DataGrid1更新信息到XML文件代码:

 Dim MyXmlDataSet As DataSet
 MyXmlDataSet = CType(DataGrid1.DataSource, DataSet) '类型转换
 MyXmlDataSet.WriteXml("regid.xml")           '把信息写入XML文件


  
  如果不用DataGrid控件,读写XML文件中特定信息可以更简单:

  Dim xmlInfo As New XmlDocument      
  xmlInfo.Load("info.xml")    '载入XML文件
  Dim str As string=xmlInfo.Item("RegInfo").Item("name").InnerText  '用“Item”可以逐级往下读数据
  xmlInfo.Item("RegInfo").Item("pass").InnerText="MyPass"
  xmlInfo.Save("info.xml")    '保存信息到xml文件


  我原来打算用INI格式来保存AdKing的注册信息和发言信息,但是,一则读写INI不是很方便,二则XML在软件开发中越趋重要,于是一开始就用XML文件来保存有关信息。在刚接触VS.NET时本不知XML为何物,现在可自如读写XML,是否有点“高手”的感觉呢?(自我陶醉一下先)

  2.用HttpWebResponse相关类GET和POST信息
  用GET方式读取网页源代码:

  Dim httpReq As System.Net.HttpWebRequest  'HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持',也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。
  Dim httpResp As System.Net.HttpWebResponse  ' HttpWebResponse 类用于生成发送 HTTP 请求和接收 HTTP 响'应的 HTTP 独立客户端应用程序。
  Dim url as String="http://sunhai.tianyablog.com"   '这是我的小站,有空来坐坐
  Dim httpURL As New System.Uri(url)
  httpReq = CType(WebRequest.Create(httpURL), HttpWebRequest)
  httpReq.Method = "GET"
  httpResp = CType(httpReq.GetResponse(), HttpWebResponse)    
  Dim reader As StreamReader = _
  New StreamReader(httpResp.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312")) '如是中文,要设置编码格式为“GB2312”。
  Dim respHTML As String = reader.ReadToEnd()  'respHTML就是网页源代码
  httpResp.Close()



  向服务器POST信息:

  Dim httpUrl2 As New System.Uri("http://sunhai.tianyablog.com?" & "name=1&pass=6") ' “&”号后面是'注册信息,改成你自己的
  Dim req As HttpWebRequest
  req = CType(WebRequest.Create(httpUrl2), HttpWebRequest)
  req.Method = "POST"
  req.ContentType = "application/x-www-form-urlencoded"
  Dim bytesData() As Byte = System.Text.Encoding.ASCII.GetBytes("name=1&pass=6")
  req.ContentLength = bytesData.Length
  Dim postStream As Stream = req.GetRequestStream()
  postStream.Write(bytesData, 0, bytesData.Length)   '以上为向网络服务器POST信息

  Dim res As HttpWebResponse = CType(req.GetResponse(), HttpWebResponse)
  Dim reader As StreamReader = _
  New StreamReader(res.GetResponseStream, System.Text.Encoding.GetEncoding("GB2312"))
  Dim respHTML As String = reader.ReadToEnd()  'respHTML为POST后网络服务器返回的信息
    MsgBox(respHTML)               '可用MsgBox查看返回的信息
  res.Close()



  3.用正则表达式从网页源代码中提取网址
  得到网页源代后,我们可以对源代码进行处理,比如提取其中的链接,Email地址,图片地址,Flash等等。

  Dim r As System.Text.RegularExpressions.Regex
  Dim m As System.Text.RegularExpressions.MatchCollection
  Dim respHtml As String = "http://www.NETsh.Net/subdomains/f_s_o.php?leibie=shangmao" '以这个地址举例
  strRegex = "http://([\w]+\.)+[\w]+(/[\w.?]+)+leibie[=]{1}[\w]+"  '用这个正则表达式可以提取上面地址。通用'的提取链接正则表达式为“http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?”。  
  r = New System.Text.RegularExpressions.Regex(strRegex,    System.Text.RegularExpressions.RegexOptions.IgnoreCase)
  m = r.Matches(respHTML)   
  Dim i As Integer 
  For i = 0 To m.Count - 1
    MsgBox(m(i).Value)
  Next i 



  第四点体会:要学习新技术,尽量在你的项目中应用新技术,在应用中学习,进步最快。

 
现在我的AdKing已经用.NET全面改写,并用上继承,重载,多线程等,所有这些在VB6中能否实现,从VB6转到.NET是否明智?

  从2003年10月开始学习VB6编程,11月半用VB6完成第1个软件——AdKing,到现在(20040117)用VB.NET技术改写AdKing。可算基本入门。全部用的业余时间,没有当面请教一个老师。原来没有一点编程基础。如果学得还算顺利的话,很大部分要归功于掌握并利用大量网络资源。下面列出我所掌握的VS.NET网络学习资源,有什么遗漏希望大家能指出。
  1.微软支持
  在你学习VS.NET的过程中,有疑问首先要向MicroSoft求助。如果你不懂得利用MicroSoft提供的庞大的学习资源,我要告诉你,你很不幸,你舍近求远了。
  (1)首先,你要安装MSDN,他比所有VS.NET书籍详细。我为了装MSDN,可是牺牺了我的98和XP双启动,改成WindowsXP单系统。装了MSDN后,你要学习正则表达式,VS.NET 2003中点击“帮助”,再点击“搜索”,然后输入“正则”,一回车,哇,找到470个主题,这下你慢慢研究吧。实在研究不透,也不用急,还有GoogleCSDN呢。   
  (2)在线Microsoft .NET 框架 SDK 快速入门教程(http://chs.gotdotnet.com/QuickStart),可配合MSDN使用。分三块内容, ASP.NET | Windows 窗体 | 如何...?常见任务 。 “常见任务快速入门”旨在帮助您快速找到常见编程问题的答案。
  (3)微软中国社区(http://www.mscommunity.com/Profile/)。在社区注册,有问题就到社区去提问吧。
  (4)在线中文MSDN(http://www.microsoft.com/china/MSDN/default.asp);在线英文MSDN(http://msdn.microsoft.com/),考考你的E文,不过有金山词霸在,我都不怕,你还用怕什么呢!
  (5).NET主页(http://www.microsoft.com/china/net)
  (6)Visual Studio .NET主页(http://www.microsoft.com/china/msdn/vstudio/prodinfo/overview.asp)
   为什么选择VS.NET,为什么看好VS.NET,看看MicroSoft的Help文档有多详尽就知道了。如果你不去利用MicroSoft提供的庞大的Help资源,是不是有点对不起盖茨呢!  

  2.CSDN http://www.csdn.net/
  CSDN号称中国最大的开发者网络,确实不假。我最常去的是CSDN的
  文档(http://www.csdn.net/develop/)
  论坛(http://expert.csdn.net/expert/forum.asp)
  只要你善于利用搜索功能,你在开发中遇到的多数问题可在文档论坛中找到答案。如果你在开发过程中遇到疑难,而你又认为 BillGates帮不上你的忙,那么,你就上CSDN吧,一定会让你满意的。
   教你两个绝招,第一招,是“搜索大法”。遇到问题,首先是在CSDN的文档论坛进行搜索,看有无类似答案。如不行,再下一招。
   第二招,“提问大法”,只要有礼貌有诚意地在论坛提问,一定有许多人乐于回答你的问题。

  3.其他相关网站
   有不少网站开辟VS.NET专栏,常去看看,必有收获。
  pconline跟我学NET专栏(http://www.pconline.com.cn/pcedu/empolder/net/)

  yesky的Visual Studio.NET专栏(http://www.yesky.com/SoftChannel/72342380467978240/index.shtml)

  ccidnet的NET专区(http://tech.ccidnet.com/pub/column/c340.html)


  4.资料下载
  如果不是包月上网,那么下载大量资源,再断线慢慢研究就很有必要了。

  网友提供的大量VS.NET资源下载(ftp://qydn.vicp.net) 

北京希望电子出版社图书素材资料下载(http://www.b-xr.com/bbs.htm)
 
  清华大学出版社VS.NET源码下载(http://www.wenyuan.com.cn/xiazai.htm
)

  5.国外资源
   如果你的E文不错,不妨上E文网站去取经。  

  http://www.startvbdotnet.com

  http://www.vbdotnetheaven.com

  http://www.vbcity.com/

  http://www.vbip.com

  http://www.a1vbcode.com/   

  http://searchvb.techtarget.com/

  http://builder.com.com

  http://www.codeproject.com

  
  http://www.planet-source-code.com/

  http://sourceforge.net/ 

  http://www.syncfusion.com/FAQ/WinForms/

  http://www.123aspx.com

  http://panopticoncentral.net/

  http://www.regexplib.com/

  http://www.harding.edu/USER/fmccown/WWW/vbnet_csharp_comparison.html

  http://www.only4gurus.com/v2

  http://www.gotdotnet.com

  http://www.programmersheaven.com/

  http://www.aspnetpro.com

  http://www.dotnetgenius.com/

  http://www.devx.com/dotnet

  http://www.devcity.net

  http://www.devhood.com

  http://www.c-sharpcorner.com/

  http://www.csharphelp.com/   

   http://authors.aspalliance.com/aldotnet/examples/translate.aspx

  http://www.dotnet247.com

  http://www.datagridgirl.com
   
  http://www.codestudy.com    

  6.其他特色网站、专栏
  CSDN上Latitude的VS.NET专栏(http://www.csdn.net/develop/author/netauthor/Latitude/)

  【孟宪会之精彩世界】(http://xml.sz.luohuedu.net/xml/) 

  DotNet中华网(http://www.aspxcn.com/)

   ASP酷(http://www.aspcool.com/)

  http://www.chinaaspx.com

http://www.webasp.net/

  http://218.56.11.178:8009/   海波.NET的水晶报表专栏

  http://www.aspx8.cn/  asp.net资源吧

  http://www.cnblogs.com/ 博客园

  http://dotnet.mblogger.cn

  http://blog.joycode.com/ 博客堂

  
   当然,还有一个地球人都知道的,全球最大的知识仓库,我不说,你也早就应该知道的,那不是http://www.google.com又是什么!



  第五点体会:掌握并利用大量网络资源来辅助VS.NET的学习,你将事半功倍。

 

我的QQ:  26624998
我的网站:http://sunhai.tianyablog.com
本文地址:http://www.csdn.net/Develop/read_article.asp?id=23542



 

 

 


                 2004年3月8日

 





 
@ 2006-12-08 20:34

Java学习之道 

来源:http://www.javaresearch.org/forum/thread.jsp?thread=46491

前言 

本篇文章是应邀之做,由stup和Stoney共同完成,时间比较仓卒,但是还是希望能 
够给各位初学Java的朋友有用之处吧。本篇文章是按照csdn《程序员》杂志的一篇 
文章的构架并结合自己的实际经验来写的。今年是Java诞生10周年,谨以此篇先给 
我们钟爱的Java。 

工具篇 

JDK(Java Development Kit) 

JDK是整个Java的核心,包括运行环境JRE(Java Runtime Environment),一些Ja 
va工具和Java基础类库(rt.jar、tools.jar)。 

1、JDK的下载和安装 

2004年夏,Sun Miscrosystem 推出了全新的J2SE 5.0(Java 2 Platform Standar 
d Edition 5.0,也叫做 Tiger),我们可以从Sun的Java网站上免费下载到,http 
://java.sun.com/j2se/1.5.0/download.jsp。下载好的JDK是一个可执行安装程序 
,默认安装完毕以后会在c:\ Java目录下安装JDK和JRE。然后设置环境变量:在Pa 
th变量中添加C:\Java\jdk1.5.0\bin,新建CLASSPATH变量,在参数里边添加(.;C 
:\ \Java\jdk1.5.0\lib\rt.jar;C: \Java\jdk1.5.0\lib\tools.jar)。新建JAVA 
_HOME变量,设置参数为C: \Java\jdk1.5.0,安装配置完毕以后,在命令行情况下 
运行java,如果出现大量信息,则证明安装配置成功! 

2、     JDK的命令工具 

JDK里边最重要的命令行工具: 

java:启动JVM(Java Virtue Machine)执行class 

javac:编译java源文件 

jar:Java打包工具 

javadoc:Java文档生成器 

有关这些命令的具体用法,在命令行里边不带参数的直接执行上述命令,就会看到 
大量的用法信息,读者可以具体实践一下。此外,JDK Documentation上面也有详细 
的说明。 

JDK Documentation 

Documentation 可以说是Java程序员最重要的编程手册,涵盖了Java几乎所有方面 
内容的描述。可以毫不夸张的说,学习Java编程,大部分的时间都是花费在研究和 
查阅Documentation上面的。可见它的重要性,J2SE 5.0 Documentation可以到htt 
p://java.sun.com/j2se/1.5.0/download.jsp下载,解压缩以后便可以很方便的使 
用了。 

应用服务器(Applicaiton Server) 

Application Server 是用来运行Java 企业组件的平台,构成了应用软件的主要运 
行环境,当前主流的Application Server是IBM公司的Websphere、BEA公司的Weblo 
gic Server以及免费的JBoss,如果是爱好者,推荐免费的JBoss,还有比较简单的 
Tomcat。下面简要介绍几种常用的Application Server 

1、     Tomcat 

严格意义上来讲,Tomcat只是一个可以支持运行Servlet/JSP的Web容器,不过Tomc 
at也扩展了一些App Server的功能,Tomcat非常广泛的应用在中小规模的Java Web 
中,因此是初学者的首选。下面就Tomcat的下载、安装和配置进行详细的介绍: 

Tomcat是Apache组织Jakarta项目下的一个免费开源项目,目前最新版本的Tomcat5 
.5支持Servlet2.4和JSP2.,我们可以从http://jakarta.apache.org/site/downlo 
ads/index.html  免费下载到。下载以后,解压到D:\tomcat里边。新建环境变量C 
ATALINA_HOME,设置参数为D:\tomcat(或者自己的tomcat目录)。这样就将Tomca 
t安装和配置完成,运行D:\tomcat\bin里边的startup.bat,启动tomcat。默认的端 
口是8080,在浏览器中键入http://localhost:8080。如果能看到有一个雄猫的界面 
,那么恭喜您,你的tomcat配置成功了!然后我们就可以使用Tomcat进行简单的js 
p和servlet的web编程实践了。 

2、     BEA Weblogic 

Weblogic可以到BEA的网站http://commerce.bea.com/index.jsp下载最新的8.1版本 
。Weblogic是一个功能强大的Server,具体用法可以参看Weblogic的在线文档http 
://edocs.bea.com/。 

3、     IBM Websphere 

Websphere同样可以下载到免费的试用版本,可以到IMB的网站下载:http://www-1 
28.ibm.com/developerworks/websphere/downloads/。做为IBM的产品,Websphere 
更能非常强大,现在已经取代Weblogic成为应用最广泛的java服务器。 

4、     JBoss 

JBoss是免费的开源Application Server,可以免费从JBoss网站下载:http://www 
.jboss.org/index.html,做为一个免费的Server,Jboss是学习J2EE的首选Server。 


Java应用的分类及其运行环境 

Java现在应用的非常广泛,从大型的企业服务器,到手机PDA都可以看到Java的身影 
。简单的可以分为一下几个方面: 

1、     Java的桌面应用 

仅需要JRE的支持,我们就可以编写出可以跨平台的应用程序。 

2、     Java Web应用 

Java的Web应用至少需要安装JDK和一个web容器(例如Tomcat),以及多用户数据库 
,Web应用可以分为三层: 

Browser层:浏览器显示用户界面 

Web层:运行Servlet/Jsp 

DB层后台数据库,提供数据访问服务。 

3、     Java企业级应用 

Java目前应用最广泛的领域,目前全球大部分的服务器都是使用J2EE服务器。企业 
级应用非常复杂,可以扩展到n层,最简单的情况也有4层: 

Browser层:浏览显示用户界面 

Client层:Java客户端应用程序直接和Web层或者EJB层交互 

Web层:运行Servlet/Jsp 

EJB层:运行EJB,完成业务逻辑运算 

DB层后台数据库:提供数据服务 

4、     Java嵌入式应用 

现在的大多数手机和PDA都支持Java,其实就是支持Java嵌入式开发,这需要在Sun 
的主页上下载J2ME开发包,还需要到特定的厂商那里下载模拟器。对于串口通讯, 
IC卡等Java都提供了良好的开发环境。据悉,在某太空探测器上控制程序改为Java 
语言来编写了。 

书籍篇: 

对于Java的初学者来说,如果找一本比较合适的入门教材的话,完整地介绍Java的 
语法、面向对象和主要的API核心库等知识,那将对学习起到相当的促进作用。 

我个人认为,一些经典的国外教材确实值得推崇,首先推荐要看的是《21天学通Ja 
va 2》、《循序渐进Java 2教程》、《Java2从入门到精通》等书看起来比较浅显易 
懂,将Java的基本只是都涉及到了,使你在很短的时间内掌握Java的基本内容。 

看完这这本书之一以后,你就想对Java全面深入的学习,现在向你推荐《Java大学 
教程》、《Java 2编程指南》等书,这几本书对Java的语法、面向对象的知识和AP 
I函数库等介绍的比较详尽。让你能够比较熟练的使用Java来编程,解决一般的问题 
。 

最后向大家推荐的是《Java2核心技术》,这本书主要讲述了Java的核心技术也是J 
ava的难点之处,具有很高的参考价值,无论是Java的初学者还是Java编程老手,都 
能从此书受益。 

这时候大家可能会注意到,其中竟然没有大名鼎鼎的《Thinking in Java》这本书 
。其实,这本书主要是从编程思想上来讲的,并没有完整的讲述Java的整个体系, 
而是一种类似Tips的方法来对Java的知识点进行深入的分析和解释,就好像C++的经 
典教材《C++ Primier》一样,并不适合作为初学语言的入门教材,蛋是在深入学习 
Java的过程中的同时来读这本书会觉得受益匪浅。 

值得一提的是,其实最有实用价值的是JDK-Document(下文中简称doc,http://ja 
va.sun.com/j2se/1.5.0/download.jsp中有离线版下载的,本例中只是列举了1.5的 
doc,在相应的地方可以下载1.4甚至1.3的doc)和Java Tutorial在线教程(http:/ 
/java.sun.com/docs/books/tutorial/这个是在线查看的,离线版的下载本人目前 
还不知道)。在doc中有四个部分API 文档(对SDK自带的标准Java API都进行了详 
细的介绍,它是按照package来组织的,详细介绍了每一个class的继承关系,接口 
的实现情况,以及所有public的属性和方法,对于每个方法的用途、调用的参数、 
参数的类型,返回值的类型、以及方法可能抛出的异常等等)、guide(对一些Jav 
a技术和概念进行讲述)、relnotes(这个介绍新版本的JDK的发布信息以及新特点 
)、tooldocs(主要对Java的所有命令进行讲述)。Doc是我们每一个Java工作者在 
编程时必须的手册,目前只有英文版,sun中国社区正在进行汉化,相信不久就会出 
现中文版的doc了。Tutorial也相当的不错,主要针对初学者,不过对于其他阶段的 
Java学习者也有很大的帮助了。 

以上主要针对J2SE的学习进行讲述的,Java主要有J2SE、J2EE、J2ME三个部分,J2 
SE是基础。当我们对J2SE的学习掌握的差不多的时候,其实我们就会对Java的学习 
有自己独特的体会,就会发现每一个Java技术自己所带的doc都对我们的学习有很大 
的帮助。此外,经常去一些著名的网站上去看看各位网友的作品,对Java学习的心 
得,确实对我们有很大提高,这里推荐http://blog.csdn.net。经常去图书馆或者 
到书店去看看有关Java的书,看看它们是不是自己所需要的,这时候,选择学习Ja 
va的书籍就会自己拿主意了。 

在上述的一些书籍的介绍中,并非每本书都要看,可根据自己的实际情况进行选择 
,或者像Java先行者咨询即可。 

过程篇 

在Java的学习过程中,大家首先要搭建一个Java的环境,安装好JDK。对于初学者来 
说,在安装JDK的过程中,CLASSPATH的设置是初学者经常会问题的地方,其中,". 
"表示当前路径,是CLASSPATH中必不可少的地方,否则,在有时候调试程序时,会 
出现意想不到的错误。PATH的设置主要是为了在调试程序时方便而已,这个同Wind 
ows的PATH含义一样。对于初学者,我个人强烈推荐使用UE(UltraEdit)+命令行( 
Windows下附件中的命令提示符,Linux下面的Shell等)。在你自己对Java的操作比 
较熟悉,对Java的底层只知识掌握的差不多的时候,然后再根据自己的需要选择合 
适的IDE,在此处我向各位推荐的都是免费软件,Eclipse(http://www.eclipse.o 
rg)和Netbeans(http://netbeans.org/),前者使用SWT编写的,后者是用Swing 
编写的,我推荐使用前者,不过各位可根据实际情况尽心选择,此外还有付费软件 
JBuilder,功能确实不错。 

在第二步学习Java语法的过程中,其实你会发现和C++很相似,其实Java是继承了很 
多语言的优点而诞生的一个优秀的编程语言。对于Java语法的学习不需要多长时间 
,但是对于一些区别于C++的地方确实需要斟酌。每一本入门教材都会对语法进行大 
篇幅的论述,因为这是基础。在学习中,一定要仔细,弄清出每一个细节问题,在 
《Thinking in Java》中,对于语法的难点进行了详尽的论述,可以参考这本书。 


Java是一种面向对象的语言,涉及到比如继承,构造器,抽象类,接口,方法的多 
态, 

重载,覆盖,Java异常处理机制等方面的概念,这里面有很多个知识点需要我们理 
解,如果我们没有C++的基础的话,确实需要花费很长的时间,在这学习中,我觉得 
应该是一个循序渐进的过程,而不可能是一步到位,在学习过程多反复几次,就会 
有不小的收获。如果你对C++有基础的话,不妨考虑在对Java学习的差不多的时候, 
学学UML(统一建模语言)和Java设计模式,会在今后编制Java程序中保持一个良好 
的习惯。 

对于Java中类库的学习。Java的类库很多,除了JDK标准类库意外,还有很多第三方 
Java类库值得我们学习。我个人认为在学习中,以下几个经常用到的类库是我们必 
须掌握的 

java.io.*; 

java.util.*; 

java.net.*; 

java.lang.*; 

值得一提的是,在Java编程中,系统默认import java.lang.*,所以我们在书写的 
时候就不需要在些这句了。 

在学习中,我们不可能对每个类的每个方法进行仔细的学习和掌握,因为我们没有 
那么多的时间。我们所作的只是了解整个package的框架,在Doc文档里面每一个pa 
ckage前面都有一个Uses of Class,我们可以阅读一下这个,了解这个包内所有类 
的用法,再对几个常用的核心类进行掌握即可。我们学习API达到知道在什么情况下 
该用什么类就可以了,其实就有很多人,在编程的时候,也是在翻阅API文档,来寻 
找呵护自己需要的类。说白了,对于类的积累,主要是在实践当中多多积累,在调 
试过程中提炼出自己的心得,才有好处。对于其它包,只需要了解这个包的框架和 
大致的类的分类就可以了,用的时候再仔细看看。 

最后谈谈J2EE编程,其中J2EE编程中包括了JSP/Servlet技术。在JSP/Servlet的学 
习中,最好能熟悉HTTP协议,这对我们进行编写程序有很大的帮助。我们主要的参 
考工具就是servlet document了,我们花上不长的时间把doc里面的内容过一遍,然 
后再参考Tomcat提供的范例学习后,我们就可以书写这方面的程序了。在JSP的学习 
中,还有JSP标记,这个记不住,可以临时可以了,不过你得备好资料才能查询哦。 
此外在学习JSP中,还有对定制标志的学习,这个学习一下它的用法,JavaBean等的 
引入使得代码可重用。在设计模式上,按照MVC(模型-视图-控制)的设计模式来 
完成,以及Web Appliacation等的部署等等。 

在J2EE的学习中,除了要J2EE Document意外,找几本比较经典的教材看看。因为这 
方面的难度比较大。掌握的知识涉及面主要有EJB、JMS、JNDI、JTA等,这些方面的 
东西除了看书籍之外,对于网络上网友总结的心得的学习也有很大的益处。 

最后是Web Services的学习,这个其实是把不同的服务统一起来提供一个统一的调 
用接口,目前这方面的代表主要是SOAP(简单对象访问协议),对于这方面的学习 
我们可以看看SOAP的规范http://www.w3.org/TR/soap/,此外Apache提供了soap( 
http://ws.apache.org/soap/index.html )包可以和Tomcat配合使用,它的学习可 
以参看soap包自己的doc。 

说了这么多,其实最主要是看doc,然后再看看相关的经典教材。 

方法篇 

学习一门语言,最有效的办法是在学习的同时能够书写代码,调试,这样我们对学 
习的记忆比较深刻,但是我们学习时候不能满足于调通了这个程序,我们可以尝试 
一下,修改代码中的部分内容,看看会出现什么情况,最后在想一想,为什么这样 
写。 

还要注意的是,在自己书写代码的时候一定要写注释,养成一个良好的习惯,仿照 
JDK提供的sample里面的书写规则,使得代码的结构比较清晰。 

扩展篇 

在Java的学习中,不能只局限于学习Sun提供的Java技术,目前,Java开源社区开展 
的如火如荼,也贡献出不少精品,比如Hibernate+Spring,Eclipse,JBOSS等等。 
我们可以根据需要有选择性的学习这些技术。但起码平时要对这些技术 有些大致的 
了才对。 

资源篇 

在Java的学习过程中,我一直提到网上资源的重要性和新颖性,经常查看网上资源 
,有时候,一篇文章可以是你茅塞顿开或者是为你开辟了一条新的学习道路。 

下面列举一些较好的网络资源: 

1、     http://java.sun.com                       sun的Java主页 

2、     http://www-900.ibm.com/devebperWorks/cn/      IBM的开发者社区,极力推 
荐 

3、     http://www.javaworld.com 

4、http://dev2dev.bea.com.cn/index.jsp  

5、     http://www.huihoo.com  

6、     http://gceclub.sun.com  

7、     http://www.javaresearch.com 

8、     http://www.matrix.org.cn 

9、     http://www.cn-java.com