http://code.google.com/p/google-guice/
Google公司的Bob lee开发的轻量级IoC容器,其特点是:
1、速度快,号称是spring的100倍速度
2、无配置文件,实用JDK5.0的annotation描述组件依赖,简单,而且有编译器检查和重构支持
3、简单,代码量很少
http://code.google.com/p/google-guice/wiki/SpringComparison
这是Google guice和spring IoC容器的对比
另外xwork2.0已经集成了Google guice容器了。
http://docs.google.com/Doc?id=dd2fhx4z_5df5hw8
这是Google guice的快速入门文档,用起来挺简单的。
Guice
Put simply, Guice alleviates the need for factories and the use of new in your Java code. Think of Guice's @Inject as the new new. You will still need to write factories in some cases, but your code will not depend directly on them. Your code will be easier to change, unit test and reuse in other contexts.
Guice embraces Java's type safe nature, especially when it comes to features introduced in Java 5 such as generics and annotations. You might think of Guice as filling in missing features for core Java. Ideally, the language itself would provide most of the same features, but until such a language comes along, we have Guice.
Guice helps you design better APIs, and the Guice API itself sets a good example. Guice is not a kitchen sink. We justify each feature with at least three use cases. When in doubt, we leave it out. We build general functionality which enables you to extend Guice rather than adding every feature to the core framework.
Guice aims to make development and Debugging easier and faster, not harder and slower. In that vein, Guice steers clear of surprises and magic. You should be able to understand code with or without tools, though tools can make things even easier. When errors do occur, Guice goes the extra mile to generate helpful messages.
For an introduction to Guice and a comparison to new and the factory pattern, see Bob Lee's video presentation. After that, check out our user's guide.
We've been running Guice in mission critical applications for over a year, and now you can, too. We hope you enjoy it as much as we do.
PhotoShop在线啦
让人大跌眼镜的应用
地址:https://www.photoshop.com/express/landing.html
面型服务架构SOA
SOA(service-oriented architecture,也叫面向服务的体系结构或面向服务架构)是指为了解决在Internet环境下业务集成的需要,通过连接能完成特定任务的独立功能实体实现的一种软件系统架构。SOA是一个组件模型,它将应用程序的不同功能单元(称为服务)通过这些服务之间定义良好的接口和契约联系起来。接口是采用中立的方式进行定义的,它应该独立于实现服务的硬件平台、操作系统和编程语言。这使得构建在各种这样的系统中的服务可以以一种统一和通用的方式进行交互。
传统的Web(HTML/HTTP)技术有效的解决了人与信息系统的交互和沟通问题,极大的促进了B2C模式的发展。WEB服务(XML/SOAP/WSDL)技术则是要有效的解决信息系统之间的交互和沟通问题,促进B2B/EAI/CB2C的发展。SOA(面向服务的体系)则是采用面向服务的商业建模技术和 WEB服务技术,实现系统之间的松耦合,实现系统之间的整合与协同。WEB服务和SOA的本质思路在于使得信息系统个体在能够沟通的基础上形成协同工作。
对于面向同步和异步应用的,基于请求/响应模式的分布式计算来说,SOA是一场革命。一个应用程序的业务逻辑(business logic)或某些单独的功能被模块化并作为服务呈现给消费者或客户端。这些服务的关键是他们的松耦合特性。例如,服务的接口和实现相独立。应用开发人员或者系统集成者可以通过组合一个或多个服务来构建应用,而无须理解服务的底层实现。举例来说,一个服务可以用。NET或J2EE来实现,而使用该服务的应用程序可以在不同的平台之上,使用的语言也可以不同。
一、SOA具有的特性
SOA服务具有平台独立的自我描述XML文档。Web服务描述语言(WSDL, Web Services Description Language)是用于描述服务的标准语言。
SOA 服务用消息进行通信,该消息通常使用XML Schema来定义(也叫做XSD, XML Schema Definition)。消费者和提供者或消费者和服务之间的通信多见于不知道提供者的环境中。服务间的通讯也可以看作企业内部处理的关键商业文档。
在一个企业内部,SOA服务通过一个扮演目录列表(directory listing)角色的登记处(Registry)来进行维护。应用程序在登记处(Registry)寻找并调用某项服务。统一描述,定义和集成(UDDI, Universal Description, Definition, and Integration)是服务登记的标准。
每项SOA服务都有一个与之相关的服务品质(QoS, quality of service)。QoS的一些关键元素有安全需求(例如认证和授权),可靠通信(译注:可靠消息是指,确保消息“仅且仅仅”发送一次,从而过滤重复信息。),以及谁能调用服务的策略。
二、SOA三大基本特征
1 独立的功能实体
在Internet这样松散的使用环境中,任何访问请求都有可能出错,因此任何企图通过Internet进行控制的结构都会面临严重的稳定性问题。SOA非常强调架构中提供服务的功能实体的完全独立自主的能力。传统的组件技术,如.NET Remoting,EJB,COM或者CORBA,都需要有一个宿主(Host或者Server)来存放和管理这些功能实体;当这些宿主运行结束时这些组件的寿命也随之结束。这样当宿主本身或者其它功能部分出现问题的时候,在该宿主上运行的其它应用服务就会受到影响。
SOA架构中非常强调实体自我管理和恢复能力。常见的用来进行自我恢复的技术,比如事务处理 (Transaction),消息队列(Message Queue),冗余部署(Redundant Deployment)和集群系统(Cluster)在SOA中都起到至关重要的作用。
2 大数据量低频率访问
对于.NET Remoting,EJB或者XML-RPC这些传统的分布式计算模型而言,他们的服务提供都是通过函数调用的方式进行的,一个功能的完成往往需要通过客户端和服务器来回很多次函数调用才能完成。在Intranet的环境下,这些调用给系统的响应速度和稳定性带来的影响都可以忽略不计,但是在 Internet环境下这些因素往往是决定整个系统是否能正常工作的一个关键决定因素。因此SOA系统推荐采用大数据量的方式一次性进行信息交换。
3 基于文本的消息传递
由于Internet中大量异构系统的存在决定了SOA系统必须采用基于文本而非二进制的消息传递方式。在COM、CORBA这些传统的组件模型中,从服务器端传往客户端的是一个二进制编码的对象,在客户端通过调用这个对象的方法来完成某些功能;但是在Internet环境下,不同语言,不同平台对数据、甚至是一些基本数据类型定义不同,给不同的服务之间传递对象带来的很大困难。由于基于文本的消息本身是不包含任何处理逻辑和数据类型的,因此服务间只传递文本,对数据的处理依赖于接收端的方式可以帮忙绕过兼容性这个的大泥坑。
此外,对于一个服务来说,Internet与局域网最大的一个区别就是在Internet上的版本管理极其困难,传统软件采用的升级方式在这种松散的分布式环境中几乎无法进行。采用基于文本的消息传递方式,数据处理端可以只选择性的处理自己理解的那部分数据,而忽略其它的数据,从而得到的非常理想的兼容性。
三、面向服务架构(SOA)的原则
SOA的强大和灵活性将给企业带来巨大的好处。如果某组织将其IT架构抽象出来,将其功能以粗粒度的服务形式表示出来,每种服务都清晰地表示其业务价值,那么,这些服务的顾客(可能在公司内部,也可能是公司的某个业务伙伴)就可以得到这些服务,而不必考虑其后台实现的具体技术。更进一步,如果顾客能够发现并绑定可用的服务,那么在这些服务背后的IT系统能够提供更大的灵活性。
但是,要得到种强大和灵活性,需要有一种实现架构的新方法,这是一项艰巨的任务。企业架构设计师必须要变成“面向服务的架构设计师”,不仅要理解SOA,还要理解SOA的实践。在架构实践和最后得到的架构结果之间的区别非常微妙,也非常关键。本文将讨论SOA的实践,即:面向架构的设计师在构建SOA时必须要做的事情。
SOA的原则
SOA是一种企业架构,因此,它是从企业的需求开始的。但是,SOA和其它企业架构方法的不同之处在于 SOA提供的业务敏捷性。业务敏捷性是指企业对变更快速和有效地进行响应、并且利用变更来得到竞争优势的能力。对架构设计师来说,创建一个业务敏捷的架构意味着创建这样一个IT架构,它可以满足当前还未知的业务需求。
要满足这种业务敏捷性,SOA的实践必须遵循以下原则:
* 业务驱动服务,服务驱动技术
从本质上说,在抽象层次上,服务位于业务和技术中间。面向服务的架构设计师一方面必须理解在业务需求和可以提供的服务之间的动态关系,另一方面,同样要理解服务与提供这些服务的底层技术之间的关系。
* 业务敏捷是基本的业务需求
SOA考虑的是下一个抽象层次:提供响应变化需求的能力是新的“元需求”,而不是处理一些业务上的固定不变的需求。从硬件系统而上的整个架构都必须满足业务敏捷的需求,因为,在SOA中任何的瓶颈都会影响到整个IT环境的灵活性。
* 一个成功的SOA总在变化之中
SOA工作的场景,更象是一个活的生物体,而不是象传统所说的“盖一栋房子”。IT环境唯一不变的就是变化,因此面向服务架构设计师的工作永远不会结束。对于习惯于盖房子的设计师来说,要转向设计一个活的生物体要求崭新的思维方式。如下文所写的,SOA的基础还是一些类似的架构准则。
SOA基础
在IT行业有两个越来越普遍的发展方向,一个是架构方面的,一个是方法学方面的,面向服务的架构设计师可以从中有所收获。第一个就是MDA(模型驱动架构),由提出CORBA的OMG模型提出。MDA认为架构设计师首先要对待创建的系统有一个形式化的UML(也是由OMG提出)的模型。MDA首先给出一个平台无关的模型来表示系统的功能需求和use cases,根据系统搭建的平台,架构设计师可以由这个平台无关的模型得到平台相关的模型,这些平台相关模型足够详细,以至于可以用来直接生成需要的代码。
MDA的核心就在于在设计阶段系统就已经完全描述,这样,在创建系统的时候,几乎就没有错误解释的可能,模型也就可以直接生成代码。但MDA有一些局限性:首先,MDA假设在创建模型之前,业务需求已经全部描述,而这一点,在当前典型的动态业务环境中几乎是不可能的。第二,MDA没有一个反馈机制。如果开发人员对模型有需要改动的地方,并没有提供给他们这么一个途径。
SOA的另一个基础是敏捷方法(AM),其中非常有名的方法是极限编程(XP)。象XP这样的AM提供了在需求未知或者多变的环境中创建软件系统的过程。XP要求在开发团队中要有一个用户代表,他帮助书写测试来指导开发人员的日常工作。开发团队中的所有成员都参与到设计之中,并且设计要尽量小并且非形式化。AM的目标是仅仅创建用户想要的,而不是在一些形式化模型上耗费工作量。AM的核心思想就在于其敏捷性-处理需求变更的敏捷性。AM的主要弱点是其规模上的限制,例如,XP 在一个小团队和中型项目中效果不错,但是当项目规模增大时,如果没有一个一致的清晰的计划,项目成员很难把握项目中的方方面面。
从表面看来,MDA和AM似乎是相对立的-MDA假定需求是固定的,而AM恰恰相反。MDA的中心是形式化的模型,而AM恰恰要避开它们。但是,我们还是决定冒险把这些不同方法中的一些元素提取出来,放入到一个一致的架构实践中。
在SOA中有三个抽象层次,按照SOA的第一条准则:业务驱动服务、服务驱动技术。AM将业务模型直接和实践连接起来,表现在平台相关的模型之中。MDA并没有把业务模型和平台无关模型分开来,而是把平台无关模型做为起点。SOA必须连接这些模型,或者说抽象层次,得到单一的架构方法。我们将从五个视图的架构实现方法来实现这个连接。
SOA的五视图实现方法
企业架构设计师发现他们的职业非常有竞争力并且值得骄傲,因为他们要从很多方面来通盘考虑IT系统。Kruchten(RUP的开发负责人)将这些方面提取出来,在应用到SOA时,我们称为五视图实现方法(five-view approach)。
四个方框表示对一个架构的不同审视方法,分别代表不同的涉众(stakeholder)。弟五个视图,use-case视图涵盖了其它视图,在架构中扮演的是一个特殊的角色。部署视图将软件映射到底层平台和相关硬件上,是系统部署人员对架构的视图;实现视图描述了软件代码的组织,是从开发人员角度出发的视图;业务分析人员则利用过程视图进行工作,它描述的是软件系统的运行时特性。最后,逻辑视图表示的是用户的功能需求。在SOA中,面向服务的架构必须能够以use-case视图中的用例将用户连接到服务,将服务连接到底层的技术。
为了表示面向对象的架构是如何工作在这些视图之上,让我们将他们置于SOA元模型的上下文之中。SOA中两个领域存在重叠:由业务模型和服务模型表示的业务领域和由服务模型及平台相关模型表示的技术领域(两个领域共享服务模型)。业务用户通过逻辑视图和过程视图处理粗粒度的业务服务,根据变化的业务需求,按照需要将它们安排在过程之中。另一方面,技术专家的工作是创建并维护服务和地层技术之间的抽象层。表示这些服务的中间模型,起到的是轴心的作用,业务以它为中心进行。
SOA元模型从MDA中继承平台无关模型和平台相关模型,但是添加了AM和用户交互以及敏捷的反馈这两部分,后者通过椭圆之间的双向箭头来表现。类似地,元模型通过引入由中心的服务模型提供的中间层抽象解决了AM在伸缩性方面的问题。这样,服务模型中的任何需求的变化,都会反映到用户每天的业务处理中。同样,由于底层技术是模型驱动的,技术专家也可以根据这些变化的需求迅速而有效地作出应变。
SOA实践和过去解决企业架构传统方式的不同之处就在于其对敏捷性的支持。如前所说,SOA的第三条原则就在于它总在变化之中。这种恒在的变化性环境是SOA实践的基石。如图所示,涉众(stakeholders,译者注:RUP中也有这个词,表示软件开发中涉及到的各种角色如:用户、设计人员、开发人员乃至测试人员等等。)在一个必需的基础上影响到整个架构的变化。在当技术专家在每天的日常工作中不断对变化的业务需求作出响应的这种情况下,设计阶段和运行阶段之间的界限变得模糊起来,很难清晰地分离这两个阶段。
剩下的部分
我们已经为面向服务的架构提供了一个高层次的框架,其中MDA和AM的元素帮助工具的使用者来创建和维护SOA。但是,SOA中还缺少一些内容-那就是软件开发商和专业的服务组织必需提供的。理想情况下,开发商必需提供面向服务的业务流程、工作流以及服务的协调工具和服务;另外,能够以一种敏捷的、平台无关的方式充分反映业务服务的建模工具也是必须的;技术专家必须配备可以从模型中自动生成代码,并在代码变化时更新模型的工具,最后,开发商必须提供支持SOA的软件,帮助面向服务的架构设计师以一种可信并且可伸缩的方式创建位于服务和底层技术之间的抽象层次。幸运的是,这方面的产品即将上市。
另外,最重要的就是贯穿本文的自顶而下的SOA实现方法了。今天关于Web services的大部分思考都是自底而上的:“这是如何创建Web services的方法,现在,我们来使用它们集成吧”,对Web services技术的这种方法是伟大的第一步,因为它可以惊人地降低集成的开销,这是现在的技术管理人员最乐意见到的了。但当经济进一步发展,IT走出低谷,企业会寻求IT的帮助来提高组织战略意义上的核心价值。使用面向服务的架构,IT可以提供给企业实现业务敏捷性的这样一个框架。
四、为什么选择面向服务架构(SOA)?
不同种类的操作系统,应用软件,系统软件和应用基础结构(application infrastructure)相互交织,这便是IT企业的现状。一些现存的应用程序被用来处理当前的业务流程(business processes),因此从头建立一个新的基础环境是不可能的。企业应该能对业务的变化做出快速的反应,利用对现有的应用程序和应用基础结构(application infrastructure)的投资来解决新的业务需求,为客户,商业伙伴以及供应商提供新的互动渠道,并呈现一个可以支持有机业务(organic business)的构架。SOA凭借其松耦合的特性,使得企业可以按照模块化的方式来添加新服务或更新现有服务,以解决新的业务需要,提供选择从而可以通过不同的渠道提供服务,并可以把企业现有的或已有的应用作为服务, 从而保护了现有的IT基础建设投资。

如图1的例子所示,一个使用SOA的企业,可以使用一组现有的应用来创建一个供应链复合应用(supply chain composite application),这些现有的应用通过标准接口来提供功能。
Figure 1. Supply chain application. Click on thumbnail to view full-sized image.
服务架构
为了实现SOA,企业需要一个服务架构,图2显示了一个例子:

Figure 2. A sample service architecture. Click on thumbnail to view full-sized image.
在图2中, 服务消费者(service consumer)可以通过发送消息来调用服务。这些消息由一个服务总线(service bus)转换后发送给适当的服务实现。这种服务架构可以提供一个业务规则引擎(business rules engine),该引擎容许业务规则被合并在一个服务里或多个服务里。这种架构也提供了一个服务管理基础(service management infrastructure),用来管理服务,类似审核,列表(billing),日志等功能。此外,该架构给企业提供了灵活的业务流程,更好地处理控制请求(regulatory requirement),例如Sarbanes Oxley(SOX),并且可以在不影响其他服务的情况下更改某项服务。
五、面向服务架构(SOA)基础结构
要运行,管理SOA应用程序,企业需要SOA基础,这是SOA平台的一个部分。SOA基础必须支持所有的相关标准,和需要的运行时容器。图3所示的是一个典型的SOA基础结构。接下来的章节将逐一讨论该结构的每个部分。

Figure 3. A typical SOA infrastructure. Click on thumbnail to view full-sized image.
SOAP, WSDL, UDDI
WSDL,UDDI和SOAP是SOA基础的基础部件。WSDL用来描述服务;UDDI用来注册和查找服务;而SOAP,作为传输层,用来在消费者和服务提供者之间传送消息。SOAP是Web服务的默认机制,其他的技术为可以服务实现其他类型的绑定。一个消费者可以在UDDI注册表(registry)查找服务,取得服务的WSDL描述,然后通过SOAP来调用服务。
WS-I Basic Profile
WS-I Basic Profile,由Web服务互用性组织(Web Services Interoperability organization)提供,是SOA服务测试与互用性所需要的核心构件。服务提供者可以使用Basic Profile测试程序来测试服务在不同平台和技术上的互用性。
J2EE 和 .Net
尽管J2EE和。NET平台是开发SOA应用程序常用的平台,但SOA不仅限于此。像J2EE这类平台,不仅为开发者自然而然地参与到SOA中来提供了一个平台,还通过他们内在的特性,将可扩展性,可靠性,可用性以及性能引入了SOA世界。新的规范,例如 JAXB(Java API for XML Binding),用于将XML文档定位到Java类;JAXR(Java API for XML Registry)用来规范对UDDI注册表(registry)的操作;XML-RPC(Java API for XML-based Remote Procedure Call)在J2EE1.4中用来调用远程服务,这使得开发和部署可移植于标准J2EE容器的Web服务变得容易,与此同时,实现了跨平台(如。NET)的服务互用。
服务品质
在企业中,关键任务系统(mission-critical system,译注:关键任务系统是指如果一个系统的可靠性对于一个组织是至关重要的,那么该系统就是该企业的关键任务系统。比如,电话系统对于一个电话促销企业来说就是关键任务系统,而文字处理系统就不那么关键了。)用来解决高级需求,例如安全性,可靠性,事物。当一个企业开始采用服务架构作为工具来进行开发和部署应用的时候,基本的Web服务规范,像WSDL,SOAP,以及UDDI就不能满足这些高级需求。正如前面所提到的,这些需求也称作服务品质(QoS,quality of services)。与QoS相关的众多规范已经由一些标准化组织(standards bodies)提出,像W3C(World Wide Web Consortium)和OASIS(the organization for the Advancement of Structured Information Standards)。下面的部分将会讨论一些QoS服务和相关标准。
安全
Web服务安全规范用来保证消息的安全性。该规范主要包括认证交换, 消息完整性和消息保密。该规范吸引人的地方在于它借助现有的安全标准,例如,SAML(as Security Assertion Markup Language)来实现web服务消息的安全。OASIS正致力于Web服务安全规范的制定。
可靠
在典型的SOA 环境中,服务消费者和服务提供者之间会有几种不同的文档在进行交换。具有诸如“仅且仅仅传送一次”( once-and-only-once delivery),“最多传送一次”( at-most-once delivery),“重复消息过滤”(duplicate message elimination),“保证消息传送”(guaranteed message delivery)等特性消息的发送和确认,在关键任务系统(mission-critical systems)中变得十分重要。WS-Reliability 和 WS-ReliableMessaging是两个用来解决此类问题的标准。这些标准现在都由OASIS负责。
策略
服务提供者有时候会要求服务消费者与某种策略通信。比如,服务提供商可能会要求消费者提供Kerberos安全标示,才能取得某项服务。这些要求被定义为策略断言(policy assertions)。一项策略可能会包含多个断言。WS-Policy用来标准化服务消费者和服务提供者之间的策略通信。
控制
当企业着手于服务架构时,服务可以用来整合数据仓库(silos of data),应用程序,以及组件。整合应用意味着例如异步通信,并行处理,数据转换,以及校正等进程请求必须被标准化。在SOA中,进程是使用一组离散的服务创建的。BPEL4WS 或者 WSBPEL(Web Service Business Process Execution Language)是用来控制这些服务的语言。WSBPEL目前也由OASIS负责。
管理
随着企业服务的增长,所使用的服务和业务进程的数量也随之增加,一个用来让系统管理员管理所有运行在多相环境下的服务的管理系统就显得尤为重要。WSDM(Web Services for Distributed Management)规定了任何根据WSDM实现的服务都可以由一个WSDM适应(WSDM-compliant)的管理方案来管理。
其它的qos特性,比如合作方之間的溝通和通訊,多個服務之間的事務處理,都在WS-Coordination 和 WS-Transaction 標準中描述, 這些都是OASIS 的工作。
六、SOA 不是Web服务
在理解SOA和Web服务的关系上,经常发生混淆。根据2003年4月的Gartner报道,Yefim V. Natis就这个问题是这样解释的:“Web服务是技术规范,而SOA是设计原则。特别是Web服务中的WSDL,是一个SOA配套的接口定义标准:这是 Web服务和SOA的根本联系。”从本质上来说,SOA是一种架构模式,而Web服务是利用一组标准实现的服务。Web服务是实现SOA的方式之一。用 Web服务来实现SOA的好处是你可以实现一个中立平台,来获得服务,而且随着越来越多的软件商支持越来越多的Web服务规范,你会取得更好的通用性。
七、面向服务架构(SOA)的优势
SOA的概念并非什么新东西,SOA不同于现有的分布式技术之处在于大多数软件商接受它并有可以实现SOA的平台或应用程序。SOA伴随着无处不在的标准,为企业的现有资产或投资带来了更好的重用性。SOA能够在最新的和现有的应用之上创建应用;SOA能够使客户或服务消费者免予服务实现的改变所带来的影响;SOA能够升级单个服务或服务消费者而无需重写整个应用,也无需保留已经不再适用于新需求的现有系统。总而言之,SOA以借助现有的应用来组合产生新服务的敏捷方式,提供给企业更好的灵活性来构建应用程序和业务流程。
八、采用服务驱动型方法的企业体验着以下业务和 IT 好处
面向服务架构的业务好处
效率: 将业务流程从 ” 烟囱 ” 状的、重复的流程向维护成本较低的高度利用、共享服务应用转变。
响应: 迅速适应和传送关键业务服务来满足市场需求,为客户、雇员和合作伙伴更高水准的服务。
适应性: 更高效地转入转出让整个业务变得复杂性和难度更小,达到节约时间和资金的目的。
面向服务架构的 IT 好处
复杂性降低: 基于标准的兼容性,与点到点的集成相比降低了复杂性。
重用增加: 通过重用以前开发和部署的共享服务,实现了更有效的应用程序 / 项目开发和交付。
遗留集成: 用作可重用服务的遗留应用程序降低了维护和集成的成本。
如今的服务驱动型企业都在体验着开发的高效率,服务的高可靠性和服务的高质量,以最大限度获得业务机会所带来的这些好处。
九、SOA在国际市场上反响强烈
自2004年初业界推出SOA后,Bea、IBM、Oracle、微软等业界巨头纷纷发布自己的SOA战略,建议用户在进行企业IT建设时考虑SOA。
ZapThink调研公司在最近发表的一份报告中预测,到2006年,基于SOA架构(面向服务的架构)的中间件产品将成为网络化商业系统的主要设计思路,其中70%的商业企业公司将使用SOA架构。
按照Gartner的预测,到2008年,SOA将成为占有绝对优势的软件工程实践方法,它将结束传统的整体软件体系架构长达40年的统治地位。届时,将有60%的商业公司在进行商业IT建设时会转向SOA。
IDC预测到 2007年,包括软件、服务和硬件在内的SOA市场将达到210亿美元,其中商业企业方面的市场将达到120亿美元。
综上所述SOA已经成为大势所趋,有着广阔的市场空间和巨大的发展潜力;而在商业企业中的应用,将成为SOA未来发展的一大亮点。
SOA已经引起国内商业企业的重视
国内基于SOA架构Web服务目前还是集中在一些企业内部,而国内一些有影响的行业用户正在搭建其核心业务系统,比如商业领域的流通行业和销售行业的大集中正在起步。因此当商业企业需要更好地服务客户,需要更好地与上、下游合作伙伴协同工作,并且自己内部的核心业务之间也需要协同工作时,基于SOA架构中间件产品就会为这类新的业务应用提供理想的底座,这种新的应用被称作面向服务的业务应用。
现在,很多商业企业都准备在2006年内开始规划使用这些基于SOA架构的应用,可想而知,这些SOA架构的中间件产品将在两年内迅速发展,并在五年内在整个IT行业内获得广泛应用。
商业企业信息化存在的问题
商业企业信息系统多数处于封闭运行的状态,企业之间、企业与上游供应商、下游消费者之间信息不对称。商业企业之间无法形成协同效应。信息系统即无法满足消费者的综合需求也无法达到企业间的商务协同自动化和智能化的需求。信息化的经济效益难以有效发挥。同时信息化标准不健全,如电子交换接口标准、业务流程协同标准;流通中的票证、单据格式标准;电子数据交换所必须的结构化数据标准等。
采用传统的系统架构技术和传统的EAI和B2Bi技术则存在系统封闭、厂商依赖性强、耦合度高、重用性差,扩展性差、无法和上下游企业的系统建立统一的接口等问题。而采用SOA 技术则可以有效解决上述问题,由于SOA基于HTTP/SOAP/WSDL等开放式技术,对于特定厂商产品依赖性小;系统开放、互操作性强,可以建立统一的WEB服务用于和不同的上下游企业信息系统实现供应链协同。由于SOA的松耦合特性、比较符合集团和各下属机构的商业关系,业务流程整合和项目协调的阻力会有效降低。
SOA以服务为基本单元,更加贴近于企业的商业活动,业务梳理和建模的复杂度会有效降低,重用性也会有效提高。另外采用SOA,企业IT系统所提供的服务会更容易扩展、组合和变更,符合该集团目前业务发展变化较快的特点,可以有效的降低该集团IT系统的长期拥有总体成本。我们将该集团公司作为一个试点,推进SOA技术的运用,来有效解决上述问题。
“协同商务”的新经济时代即将到来
采用SOA技术最终将使得各个商业企业之间、各个关联的经济实体之间实现高效实时的联接,使得整个产业链实现自动化的协同商务,将会有力的提高商业企业的应变能力,转变现有的商业运作模式,转变经济增长的方式。SOA技术将促进信息系统在商业企业贸易活动中的全面渗入和发展,对于简单的贸易活动,将会由信息系统自动化实现;对于复杂的贸易活动,信息系统将会为企业管理人员提供足够的决策信息并可以高效的执行决策。SOA技术的应用将会全面提高商务的自动化、智能化和实时化水平。
采用SOA技术实现协同商务可以提高城市范围内商流、物流、资金流和信息流的运行效率,扩大北京市商业企业整体规模效益,加强商业企业的整体对外竞争力,拉动经济增长,降低企业运营成本,推动城市流通信息技术创新体系的建立,提高北京市流通现代化水平,促进城市管理现代化和城市社会经济信息化的进程。
采用SOA技术可以将将物流企业、物业企业、商业企业、消费者整体整合在一起,对供应链关联企业、物流企业以及网上支付体系、安全认证体系等环境建设具有明显的带动作用,有利于促进支撑环境协同发展。
促进商业企业信息化标准的制定,完善政府职能
采用SOA技术为信息系统的沟通提供了技术基础,而随着SOA在商业企业的应用,必将促进统一的商业领域电子商务行业标准的发展和制定,对促进国家商业企业信息标准体系的建立和完善具有重要支撑作用。
SOA技术为政府对商业经济的运行状况提供了实时监测和指导的技术可能性,将从根本上改变政府对社会经济的管理方式。
基于SOA的协同商务带来的最直接的好处就是由于贸易范围的空前扩大而产生的全球贸易活动的大幅度增加,因而提高了贸易环节中大多数角色的交易量,因此,全球范围的经济形势将向一个良好的增长趋势发展。它还可以扩大地方商业企业整体规模效益,加强商业企业的业务整合和商业协同效应,提高商业企业的整体对外竞争力,通过协同商务有效降低企业运营成本,推动城市流通信息技术创新体系的建立,提高地方的流通现代化水平,促进城市管理现代化和城市社会经济信息化的进程。
SOA在商业企业的应用可以将物流企业、物业企业、商业企业、消费者整体整合在一起,对供应链关联企业、物流企业以及网上支付体系、安全认证体系等环境建设具有明显的带动作用,可推动信息化各环节的全面应用与发展,有利于促进产业链和支撑环境协同发展,从而也创造了更多的就业机会和社会财富。
信息产业是知识经济的核心和主要的推动力,而企业信息化又是目前信息产业中最具前途的发展趋势,因此说企业信息化的发展,必将直接或间接地推动知识经济的浪潮。这种知识经济有着大量的无形成本和高附加值,在东南亚金融危机的同时,高科技给美国带来的是”高增长速度、高就业率、低通货膨胀率”。这也是我国在宣传知识经济的热潮中应注意的一个真正有价值的切入点。
SOA技术由于其前所未有的信息系统整合与自动协同能力,成为继互联网以来又一个革命性的技术,将会把目前基于WEB/互联网的知识经济推进到一个前所未有的新阶段。
十、SOA 企业考虑事项
服务驱动型企业在对客户、合作伙伴和雇员的高效化服务方面得到了优化 — 并加速了业务服务响应时间。然而,成为服务驱动型企业,需要的不仅仅是产品的部署。对实现服务驱动型架构感兴趣的企业将希望能与一个有经验的 SOA 提供商合作,它提供的服务可以保护企业在业务和 IT 方面的投入,他们考虑到了以下几个方面:

业务战略: 组织需要明确驱动关键业务流程的业务战略,它将用于成形 SOA 的框架。一旦识别出业务问题,就可以用一种一致的、可复用的方法对其进行定义,并实现解决方案。在这个关键的基础阶段,业务通常需要与一个拥有开发 SOA 业务战略经验、并能共享横向和纵向市场最佳实践的提供商进行合作。
体系结构:为了解决方案快速和动态的交付,企业必须开发一种允许装配组件和服务的体系结构框架。通过与有经验的 SOA 提供商合作,企业可以获得相应的参考案例,以快速搭建一个关注复用、避免 ” 烟囱 ” ( stovepipe )式应用程序和 IT 资源 ” 孤岛 ” 的体系结构。此外,有经验的 SOA 提供商还可以帮助企业对项目的易管理性进行设计。
构建模块: 不管是对体系结构还是对编程模型来说, SOA 都是是思考构建软件模型的一种优秀方式。与 SOA 提供商进行合作能让组织能够识别可在 SOA 实现中使用或重用的构建模块代码、服务、应用程序和组件。与有经验的 SOA 提供商进行合作还有一个好处,企业可以获得对构造组件、企业域( domains )、服务和规范数据模型的参考经验。
项目和应用程序: SOA 创造了一种在更强大、更灵活的编程模式中搭建应用程序的新方法。与 SOA 提供商合作的企业可以更好地识别将被合并到 SOA 结构体系中的现存的和正在使用的应用程序。有经验的 SOA 提供商还将引导项目基础架构的搭建,并对正在进行中的项目提供有效的管理。
成本和收益: 在一个 SOA 项目中,开发和维护成本将大大削减,。有经验的 SOA 提供商可以帮助企业构造 SOA 基金模式,并构建 ” 行动案例 ” ,包括评估基础构造成本和效益、实现项目的最佳投资回报( ROI )以及开发商务案例。
组织和统辖: 组织需要为新的面向服务的 IT 组织识别角色和职责,并优化经验集便于以后使用。有经验的 SOA 提供商可以帮助企业实现这些目标,同时组织一个有效的设计 ” 复用工厂 ” ( Reuse Factory ),帮助定义统辖模式,并最终保证客户满意。
面向对象的XHTML与CSS编程
要是XHTML与CSS能面向对象。。太阳应该从北边升起了。但是,凡事都应该带着OO的思想来看问题,也勉强可以凑数拉。其实,早在零几年就有人提出了OO-style,不过已找不到。
那要怎样OO呢?现在大家都知道CSS是可以介样写滴:
.G_G { /* xxxxxx */ }我们可以把它大约看一个原型,或者说成类,-__-b 好像本来就是类的样子,然后要在HTML里“实例化”一个对象,例如:
该元素会使用上CSS相应的定义,但仅仅对应的class还是不够的,因为我们页面可能会多处应用到这个class,为了处理好“私有”的关系,把刚才的代码改成:
这样的话,这个ID为aoao的元素就会应用.G_G这个类的定义,而且可以用#aoao{}这样的选择符来进去私有效果的定义,这样也不会影响到公共用的.G_G这个类,同时,#aoao定义的优先权会比.G_G高,符合私有定义比公共定义优先高的常理^^。
由于我使用了ID这个具有唯一性的东东,对这种私有定义后的东西复用就成了问题(一个ID只能在一个页面上出现一次,不知道谁说的,反正是真理)。如果我们要实现多个相同私有化的东东怎办呢?那我们就必须来实现“多态”。挖哈哈。再改一下代码:
一个是“G_G”,另一个是“o_O”,但是我们如果使用上.o_O{}也是可以定义到元素,假如CSS是这样的话:
.G_G {width:100%}
.o_O {color:#123456}元素将都被定义到,而且由于定义不层叠,都会给应用。再假如代码是这样的话,不知道会不会更好理解。
.layout{width:100%}
.color{color:#123456}接着,要来实现“封装”。子级选择符大家应该常常用吧,换代码:
虽然.bendan{}跟.G_G .bendan{}都可以定义,但是后者只能应用在class为“G_G”的元素,我们可以简单把.bendan{}理解成全局定义,把.G_G .bendan{}理解成局部定义,这样的话就有利于我们XHTML与CSS的模块化。^^传说中的“封装”出现了,再接着。
这样的代码就可以产生无数的变化了,还不明白的从头看起。^^
其实,这些跟真正的面向对象还有很大一段距离,我只是在学标题党,不过可以用它来理解ID与class的应用。
灌水机原理
一、“灌水机”简介:
在论坛里面大量的贴出没有任何意义的文章,这种做法在网络上叫做“灌水”,实际上这是一种信息垃圾,大量的垃圾发送到论坛上面就形成了信息炸弹,所以灌水机具有一定的攻击性,它的基本编程思路和上面的内容类似,是一种演变出来的工具。不过于上面的漏洞扫描器不同的是:灌水机需要使用POST方法、而不是GET方法向服务器发送请求。
有关POST的定义如下:
当浏览器将数据从一个填写表单传给服务器时,发生POST操作。对于POST,QUERY一STRING可能为空或不空,这有赖于服务器。如果有信息,则其如GET的情况一样被格式化和传递。
来自POST查询的数据使用STDIN从服务器传到脚本。由于STDIN是一个源,脚本需要知道有多少有效数据。于是服务器还提供了另一个变量,CONTENT_LENGTH,以指出到来数据的字节数。而POST的数据格式为:
variable1=value1&variable2=value2&etc
你的程序必须检查REQUEST_METHOD环境变量以知道是否要读取STDIN。CONTENT_LENGTH变量一般只在REOUEST_METHOD为POST时有用。
当脚本被服务器引发时,服务器常常以两种途径之一向脚本传递信息:GET或POST。这两种方法被称为请求方法。所使用的请求方法是通过环境变量传给脚本,该环境变量叫作REQUEST_METHOD(还定义了另外两种请求方法一HEAD和PUT)。
二、灌水机源代码:
利用POST制作灌水机必须要先了解论坛的CGI应该获得一个什么样的string,这要依靠sniffer或者直接使用cgi编写拦截 string流的小程序,不过因为POST的格式非常简单,所以经过简单的推测就可以获得它的具体形式,例如对某个论坛我使用的灌水机源代码如下:
/********************************************/
/* 灌水机 源代码 */
/* PostForum.cpp */
/********************************************/
#include
#include
#include
main(int argc,char *argv[]){
char buff[4096];
SOCKET sock;
SOCKADDR_IN addr;
WSADATA wsa;
WORD wVersionRequested;
struct hostent *hs;
int count, len;
char *url=”www.sample.com”;
if (argc!=4) {printf(“Error!\n”); return -1; }
len=(strlen(argv[1])+strlen(argv[2])+strlen(argv[3])+49);
wVersionRequested = MAKEWORD( 2, 0 );
if (WSAStartup(wVersionRequested , &wsa)!=0)
{
printf(“Winsock Initialization failed.\n”); return -1;
}
if ((sock=socket(AF_INET,SOCK_STREAM,0))==INVALID_SOCKET){
printf(“Can not create socket.\n”); return -1;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(80);
_snprintf(buff, 4096, “POST /cgi-bin/forum.cgi HTTP/1.1\r\n”
“Host: %s\r\n”
“Content-Type: application/x-www-form-urlencoded\r\n”
“Content-Length: %d\r\n”
“\r\n”
“action=add&Title=%s&URL=http://%s&yuzi=1&Description=%s\r\n”,
url,
len,
argv[1],
argv[2],
argv[3]);
if ((addr.sin_addr.s_addr=inet_addr(url))==-1){
if ((hs=gethostbyname(url))==NULL){
printf(“Can not resolve specified host.\n”); return -1;
}
addr.sin_family = hs->h_addrtype;
memcpy((void *)&addr.sin_addr.s_addr,hs->h_addr,hs->h_length);
}
if (connect(sock,(LPSOCKADDR)&addr,sizeof(addr))==SOCKET_ERROR){
printf(“Can not connect to specified host.\n”); return -1;
}
send(sock,buff,strlen(buff),0);
recv(sock,buff,sizeof(buff),0);
closesocket(sock);
}
return 0;
}
因为程序涉及攻击性,所以将原地址用www.sample.com替代,程序使用起来是这样的“postforum <标题> <作者主页> <文章正文>”,这样运行程序之后,在论坛内就会出现一条灌水内容,因为www.sample.com已经在源代码中进行了定义,所以这个灌水机只能够在一个论坛内进行操作,对程序进行修改可以得到更完善的灌水机,例如可以对不同的论坛进行灌水;设置循环操作对论坛进行批量灌水等,功能的实现方法设计有关编程操作,在这里不再给出源代码,请读者自行修改。
学会了上面的三个基本程序编写,读者便可以进而考虑ping、ftp、telnet等程序是如何完成的,ping和上面的程序一样比较容易,因为他们所涉及的都是TCP/IP的基本协议,很容易理解,其他的网络应用程序要依靠不同的协议,所以在编写程序之前应该先熟悉各种不同的协议。
AJAX的框架汇总
此文原出于AJAX Patterns网站的一篇《Ajax Frameworks》的wiki文章,很早前我就注意到,后来在国内也有人翻译了,不过最近发现此wiki还是在不断添加维护中,截止此文发布前,作者又添加了好几个新诞生的AJAX开发工具,所以我决定重新翻译一遍,并且时常注意原文发布状态,一有新的内容立马也翻译过来,做到同步:)
此翻译稿很大一部分内容出自国内出现的那个先前版本,我只是对新加入的几项进行了翻译,并且对我熟悉的产品项着重介绍了一下,以后我会抽时间收集文中提到AJAX工具相关的文章,尽量将内容介绍和功能点评做到全面详细点。所以请关注和准备用AJAX做开发的朋友关注这篇文章,我会时常更新的。原文因为是由一个wiki系统维护,所以在所难免出现参差不齐,风格上也有不统一的情况,翻译时我也是参照原文原封不动的挪了过来,以后我会抽时间改良下。
翻译正文
基于浏览器的应用框架一般分为两种:
* Aplication frameworks:提供了浏览器功能,但其最著名的还是在于通过窗口生成组件建立桌面GUI。
* Infrastructural frameworks:提供基本的框架功能和轻便式浏览器端操作,让开发者去创建具体应用,主要功能包括:
o 基于XMLHttpRequest组件的浏览器交互功能
o XML解析和操作功能
o 根据XMLHttpRequest的返回信息进行相应的DOM操作
o 一些特殊情况下,和其他的浏览器端技术如Flash(或Java Applets)等集合到一起应用
基于服务器端的应用框架通常以下面两种方式工作(尽管它们根据不同的语言进行了分类)
* HTML/JS Generation(HTML/JS生成):通过服务器端生成HTML和JS代码在传递给浏览器端进行直接运行
* 远程交互:JavaScript调用服务器端函数(例如调用Java函数)并返回给JavaScript的回调句柄,或者请求服务器端数据信息,例如Session信息,数据库查询等。
目录
1 Pure Javascript: Application Frameworks
1.1 Bindows
1.2 BackBase
1.3 DOJO
1.4 Open Rico
1.5 qooxdoo
1.6 Tibet
1.7 AJFORM
2 Pure Javascript: Infrastructural Frameworks
2.1 AjaxCaller
2.2 Flash JavaScript Integration Kit
2.3 Google AJAXSLT
2.4 HTMLHttpRequest
2.5 Interactive Website Framework
2.6 LibXMLHttpRequest
2.7 MAJAX
2.8 RSLite
2.9 Sack
2.10 Sarissa
2.11 XHConn
3 Server-Side: Multi-Language
3.1 Cross-Platform Asynchronous INterface Toolkit
3.2 SAJAX
3.3 Javascipt Object Notation (JSON) and JSON-RPC
3.4 Javascript Remote Scripting (JSRS)
3.5 Bitkraft for ASP.NET
4 Server-Side: Java
4.1 WebORB for Java
4.2 Echo 2
4.3 Direct Web Remoting (DWR)
4.4 SWATO
4.5 AJAX JSP Tag Library
4.6 AJAX Java Server Faces Framework
5 Server-Side: Lisp
5.1 CL-Ajax
6 Server-Side: .NET
6.1 WebORB for .NET
6.2 Ajax.NET
6.3 ComfortASP.NET
6.4 AjaxAspects
7 Server-Side: PHP
7.1 AjaxAC
7.2 JPSpan
7.3 XAJAX
8 Server-Side: Ruby
8.1 Ruby On Rails
1. Pure Javascript: Application Frameworks
1.1 Bindows (成立于2003年)
Backbase是一个通过DHTML、JavaScript、 CSS和HTML等技术强劲联合起来的一套完整的Windows桌面式的WEB应用程序解决方案。Bindows无需下载安装客户端支撑组件(如 Java、ActiveX或Flash),仅需一个浏览器。纯OO的理念体现在Bindows任何地方,Bindows或许是笔者见过的最完整最强大的 AJAX应用程序平台。
Bindows是商业程序的,使用了来自于MB的技术(总部位于GA USA,主要开发中心在瑞典,成立于2002年)。
Bindows框架提供的功能和特性有:
* 基于面相对象技术的类和API
* 一套完整的Windows桌面系统,支持各种特性窗口模式,包括菜单、表单、表格、滑动条、测量仪器窗口和其他一些Windows窗口特性支持。
* 是开发zero-footprint(零空间占用)SOA客户端应用程序首选工具包
* 本机的XML,SOAP和XML-RPC支持
* 单用户到企业级开发的支持
* 内建的完美的AJAX支持
Bindows开发环境:
* 支持企业级规模的项目开发
* 跨浏览器、跨OS平台的支持
* 不受服务器结构限制
* 良好的与新的、现有的资源互操作性
* 统一的开发接口
1.2 BackBase (成立于2003年)
BackBase是一个完整的浏览器端框架,提供了丰富的浏览器操作功能,以及对.NET和JAVA平台的集成。
商业化产品,来自于Backbase B.V(总部在Amsterdam,成立于2003年)。
1.3 DOJO (开发中,成立于2004年9月)
DOJO提供完整的轻量级窗口组件和浏览器-服务器消息映射支持
* 提供创建自定义Javascript窗口组件的框架支持
* 预制的丰富的窗口类型库
* B/S消息映射支持——XMLHttpRequest和其他机制
* 支持浏览器中的URL操纵功能
* 开源许可(Academic Free License 2.1),由JotSpot的Alex Russell所领导。
1.4 Open Rico (开发中;成立于2005年5月;基于早期的一个proprietary 框架)
Open Rico是一个支持Ajax架构和用户交互的多用途框架。
* 一个XMLHttpRequest response能被一个或多个的DOM对象,或者Javascript对象调用。
* 支持拖拽操作
* 支持基于AJAX的动画模式,如缩放和变换等
* 基于Behaviors的操作库
* 使用指南,由RussMirimar的Yonah提供
* 开源。源于Sabre航空公司解决方案,由Bill Scott,Darren James及另外一些人维护。
1.5 qooxdoo (开发中; 成立于2005年5月)
qooxdoo,是另一个发展迅猛的应用框架,提供广泛的UI支持,正在开发基础架构等特性。
* 基础结构特性:
o 能轻易的捕获和操纵DOM事件
o 支持调试
o 支持一个时间操作的Timer类
o Getter/Setter支持
* UI:
o 窗口组件库和框架
o 界面布局管理
o 图像缓存和透明PNG图片处理
* 开源(LGPL).
1.6 Tibet (开发中; 创建于2005年6月)
Tibet提供了大量的易移植和完整的JavaScript API,通过这些可以快速生成大量的客户端代码,Tibet自称是企业级AJAX。
* 远程脚本调用封装在XMLHttpRequest中
* URI支持
* 支持所有的HTTP事件,不再仅仅是GET和POST
* 低级的协议-File://和WebDav也可以当作HTTP正常使用
* Web Services调用支持,包括SOAP、XML-RPC等等
* 大型的Javascript对象库
* 多种多样的XML操作支持
* IDE和开发工具
* 开源协议(OSI)
1.7 AJFORM (创建于2005年6月)
AJFORM是一个极易上手的AJAX框架,被用来编写入门级的AJAX代码,提供有以下功能:
* 三步安装
* 自动支持任意HTML表单元素
* 几乎无需编码即可实现AJAX
2 Pure Javascript: Infrastructural Frameworks
2.1 AjaxCaller(创建于2005年5月,目前是Alpha版)
AjaxCaller是一个具有多线程安全访问的XMLHttpRequest组件,主要针对Ajax开发新手,目前仍处于alpha开发阶段,仅在AjaxPatterns的在线搜索范例中使用了这个程序。
* 用明文或者XML结构的数据实现和服务器的交互(GET/POST/PUT/Delete)
* 支持XMLHttRequest对象的构析(销毁对象,C++支持内存对象的构析操作)
* 支持Response的高速缓存(尚在计划中)
* 简单的库文件代码易于新手学习使用,并且支持脚本调试
* 开源协议
2.2 Flash JavaScript Integration Kit
The Flash JavaScript Integration Kit可以使Flash和Javascript脚本实现相互集成。
* 可以实现在JavaScript中调用Flash ActionScript脚本,反之亦然。
* 几乎支持双方主要数据类型的在不同环境中的传递调用。
* 开源协议,有几个Flash开源爱好者维护。
2.3 Google AJAXSLT (2005年6月发行)
Google AJAXSLT,是一个Javascript框架,用来执行XSLT转换以及XPath查询。
* 目前在Google Map上就使用了这个。
* 开源协议(BSD)
2.4 HTMLHttpRequest(Beta版;创建于2005年)
HtmlHttpRequest最大的特点就是运用XMLHttpRequest对象和标准HTML标签IFrame来实现最大限度的跨浏览跨平台的AJAX支持,其原理是在支持XMLHttpRequest的浏览器上调用XMLHttp,如果不支持,就用IFrame来模拟实现异步交互。
* 目前支持的浏览器:IE6/Win, IE5.5/Win, IE5/Win, IE4/Win, Mozilla/Win, Opera7/Win, Safari/Mac, IE5/Mac
* 尚未测试的浏览器:IE4/Mac, Mozilla/Mac, Opera/Other, Konqueror/Linux。
* 开源协议(LGPL)
2.5 Interactive Website Framework (创建于2005年)
Interactive Website Framework定位在浏览器中支持各种各样的AJAX基础应用的开源项目。自称是通过JavaScript、CSS、XML和HTML实现高性能的交互式WEB框架,包括一个可定制易读的XML解析器。实际上,IWF是一个AJAX的基础框架,并且还包括一些通用脚本代码。
* 实现了线程安全的XMLHttpRequest
* 对XML Document进行封装,以便创建更具有可读性的代码:
var node = doc.groceries.frozen[0].pizza[0].size;
封装后的数据读取
var node = doc.documentElement.firstChild.firstChild.getAttribute(“size”);
原始的DOM操作读取
* 开源协议
2.6 LibXMLHttpRequest (2003年6月发布)
libXmlRequest是一个小型XMLHttpRequest封装包
* 用getXML()和postXML()两个事件简化XMLHttpReuqest调用
* 支持XMLHttpRequest对象池
* Response缓存处理
* 源码可以使用,但是有版权保护。
2.7 MAJAX
MAJAX是另一个非常小巧的HttpRequest封装包,为收发字符型信息提供简单接口,并为每步动作设置回调界面。
2.8 RSLite (x)
RSLite是一个XMLHttpRequest封装组件,作为Brent Ashley的JSRS(JavaScript Remote Scripting)其中的一部分功能单独发布。详情可以看JSRS的介绍
2.9 Sack(开发中,成立于2005年5月)
Sack也是一个很有名字的微型XMLHttpRequest封装包。调用者可以自定义回调函数或者是DOM对象。借助于回调DOM对象,可以把Response回来的数据直接以文本的方式嵌入DOM中。
2.10 Sarissa (发布于2003年2月)
Sarissa是一个JavaScript API,封装了在浏览器端独立调用XML的功能。
* 可移植的XMLHttpRequest对象创造
* 可移植的XPath查询
* 可移植的DOM操控
* 可移植的XSLT
* 可移植的XML序列化
* 开源协议(GPL2.0和LGPL2.1)
2.11 XHConn (2005年4月发布)
XHConn也是一个小型的XMLHttpRequest封装库。笔者也使用改良过的XHConn,其特点就是调用简单,代码也清晰易读。
* 例子:
new XHConn().connect(“mypage.php”,”POST”,”foo=bar&baz=qux”,fnWhenDone);
* 开源协议许可
3 Server-Side: Multi-Language
3.1 Cross-Platform Asynchronous INterface Toolkit (2005年5月)
CPAINT是一个真正的同时支持PHP和ASP/VBScript脚本的AJAX和JSRS工具包。CPAINT在后台提供你需求的AJAX和JSRS代码,并自动返回到浏览器端相应的Javascript脚本代码,这种方式易于实时反馈需求的WEB应用程序。
* 支持PHP和ASP
* 所有功能函数都在统一的JavaScript文件中
* 支持远程脚本和XML
* 支持本地和远程函数调用
* 可以创建单个或多个XMLHttp对象
* 返回给后台的数据即可以是文本也可以是XML/DOM文档对象
* 支持POST和GET
* 用服务端代理的方式实现远程函数和数据的访问操作
* 大部分浏览器中测试正常使用
* 在GNU、GPL、LGPL开源协议保护下发行
3.2 SAJAX (2005年3月)
SAJAX的实现方式很独特,例如:调用一个javascript方法x_calculateBudget(),将先把响应传到服务器并调用一个Java calculateBudget()方法,然后以javascript方式把值返回到x_calculateBudget_cb()中。SAJAX的名气不错,估计很多人都听过甚至用过,不过缺点就是它的这套映射理论感觉较繁锁,远不如一些轻量级的封装库好用,不过SAJAX最大的特点就是支持的平台丰富,几乎囊括了WEB下常用的编程语言和平台
* 很方便从JavaScript函数映射到服务端代理操作
* 支持多种平台(ASP/ColdFusion/Io/Lua/Perl/PHP/Python/Ruby)
* 开源协议
3.3 Javascipt Object Notation (JSON) and JSON-RPC
JSON是一个”face-free” XML,而JSON-RPC是一种远程交互协议,类似于XML-RPC,对JavaScript支持较强
* 支持多服务端平台: Java, Python, Ruby, Perl.
* 针对不同的平台有不同的包和许可协议, 如JSON-RPC-Java.
3.4 JavaScript Remote Scripting(JSRS)(2000年)
JSRS,较经典的远程脚本访问组件,支持将客户端数据通过服务器做代理进行远程的数据/操作交互。
* 支持的浏览器:IE4+,NS4.x,NS6.x,Mozilla,Opera7和Galeon。
* 服务器端脚本语言支持:ASP,ColdFusion,PerlCGI,PHP,Python和JSP(servlet)。
* 开源协议。由Brent Ashley提供支持。
3.5 Bitkraft for ASP.NET
Bitkraft是个基于(.NET)Web框架的CLR(公共语言运行库),允许用独特的方式创建和操作分布式Web内容。用C#编写,运行在微软的.NET 1.1和Mono框架下,无缝式的客户端-服务器响应方式是它的最大特点。Bitkraft没有使用XML组织数据,而是用JSON代替。
* 支持的浏览器: IE5+, Firefox1+, NS6
* 服务器端要求:ASP.NET, Mono XSP, Cassini, Apache (modMono) .NET Framework 1.1+
* 事件驱动
* 支持同步和异步的远程代理
* 客户端支持所有的.NET类型或自定义类对象映射到JSON中
* 用JSON取代XML
* 免费,开源许可协议
4 Server-Side: Java
4.1 WebORB for Java (2005年8月)
WebORB for Java是一个开发AJAX和基于Flash的富客户端应用程序的开发平台。在线例子
* WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何Java对象、XML Web Services和EJB
* 支持异步或同步的事件驱动
* 不需要在服务端修改任何代码,不需要自定义方法或属性、变量等。不要求设计时指定代理等。
* 同步调用不需要回调,异步调用需要一个回调方法。
* 客户端可以向服务端请求指定的活动方式,不需要任何编程就可以把处理结果轻易的转变为状态。
* 提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable,而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。
* 支持数据分页技术。客户应用程序能检索页面中的数据。
* 支持以参数的方式返回所有服务期端数据类型,如primitives, strings, complex types, arrays, native .net collections, remote references
* 目前有两个版本:标准版(免费),专业版(商业许可)
4.2 Echo 2 (2005年3月)
Echo 2允许你用纯Java语言编写AJAX程序。 Demo.
* 自动生成HTML和Javascript代码
* 用XML在客户端-服务端传递消息
* 如果愿意支持自定义Javascript组件
* 开源协议(Mozilla Public License or GNU LGPL)
4.3 Direct Web Remoting (DWR) (2005)
Direct Web Remoting可以在Javascript代码中直接调用Java方法的应用框架
* 类似于SAJAX,可以把Javascript中的请求调用转递到Java方法中并将执行结果返回给Javascript
* 可以和任何Web框架一起使用,如Struts、Tapestry等等
* 开源(Apache),目前该产品被加入到WebWork中
4.4 SWATO (2005)
SWATO是一套可重用的和良好集成的Java/JavaScript库,它实现了一种更容易的方式来改变你的web应用程序的交互,通过AJAX方式实现。
* 服务端Java库可以非常容易的部署到所有Servlet2.3+兼容的容器中
* 客户端Javascript库可以在所有支持XMLHttpRequest的浏览器中使用
* 使用JSON技术在服务端组织POJO数据,这样你可以在任何Javascript环境中(HTML、XUL、SVG)访问这些远程数据,这种方式很容易通过硬编码或者某种成熟的Javascript库集成到当前应用中
* 提供一个简单接口使你能在Javascript中调用远程的POJO数据
* 使用
* 提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框,在线表单,在线列表等等)
4.5 AJAX JSP Tag Library
The AJAX JSP Tag Library是一组JSP标签库,用来AJAX程序开发。可以在J2EE下无需Javascript就能轻松开发AJAX模式的Web Form。标签库为比较通用的AJAX功能提供了5个标签:
* autocomplete: 用户在文本框中输入字符,自动从指定的数据中匹配用户输入的字符,类似于Google Suggest
* callout:可以为A标签加入气泡式的消息提示框,不过是实时的服务端取出数据
* Select/dropdown:类似于联动菜单,比如地州市的联动下拉框
* toggle:开关闸按钮,比如在一个hidden表单域中存储true和falsh,同时显示相应的img图像
* update field:更新数据,也就是无刷新提交了。
4.6 AJAX Java Server Faces Framework
The AJAX-JSF用来把任意的JSF应用程序转变为AJAX应用程序
* 例子:AJAX组件的 MyFaces JSF Tree(树型目录), table scroller(可滚动的表格), tabbed pane(分页栏)
* 开源协议(Apache Software License)
Server-Side: Lisp
5.1 CL-Ajax
CL-Ajax实现Javascript直接调用服务端Lisp
* 生成可带参数的函数
* 可以回调Javascript函数或者DOM对象
* 可以集成到SAJAX中
* 开源许可
6 Server-Side: .NET
6.1 WebORB for .NET (2005年8月)
WebORB for .NET是一个用.NET和XML Web Services方式开发AJAX和基于Flash的富客户端应用程序(在线例子)
* WebORB包括一个富客户端开发类库。提供简单的在线式API用来绑定或者调用任何.NET对象、XML Web Services
* 支持异步或同步的事件驱动
* 不需要在服务端修改任何代码,不需要自定义方法或属性、变量等。不要求设计时指定代理等。
* 同步调用不需要回调,异步调用需要一个回调方法。
* 客户端可以向服务端请求指定的活动方式,不需要任何编程就可以把处理结果轻易的转变为状态。
* 提供一个特定API来处理数据库查询结果-服务器代码能返回DataSet或者DataTable,而客户端以一个类似于RecordSet的JavaScript对象来显示这个结果。该对象提供检索列名和行数据的方法。
* 支持数据分页技术。客户应用程序能检索页面中的数据。
* 支持以参数的方式返回所有服务期端数据类型,如primitives, strings, complex types, arrays, native .net collections, remote references
* 目前有两个版本:标准版(免费),专业版(商业许可)
6.2 Ajax.NET (2005年3月)
Ajax.NET是首家支持各种方式通过Javascript访问服务端.net的免费库
* 类似于SAJAX,能把Javascript请求发送到.NET方法,服务端回传给Javascript,甚至包括串行化自定义类。
* 可以在Javascript中访问Session和Application数据
* 缓存查询结果
* 免费使用源代码
* 无需更改源代码,允许给Ajax.NET添加和修改方法和属性
* 所有类支持Javascript客户端返回数据,可以在JavaScript中使用DataSet:res.Tables[0].Rows
* 使用HtmlControls组件访问和返回数据
* 页面无需重载,用事件代理(数据访问层)
* 因为只提供一个调用接口方法,所以服务端CPU占用非常少
6.3 ComfortASP.NET (2005年8月)
ComfortASP.NET可以让开发者在纯.NET下开发类似AJAX(DHTML,JavaScript,XMLHttp)特性的应用程序。
* 快速应答
* 减少HTML传输
* 减少页面重载
* 无闪烁的浏览器内容更改
* AJAX用户体验,
6.4 AjaxAspects (2005年8月)
AjaxAspects是个可以用Javascript调用服务端WebService事件的引擎
* 用标准的SOAP和WSDL进行服务端-客户端通信
* 用简单的类型和XML对象支持带参数的返回值
* 缓存支持
* 动作队列
* 免费使用,开源协议
7 Server-Side: PHP
7.1 AjaxAC (2005年4月)
AjaxAC用一个单独类封装了完整的应用程序功能
* 所有的功能集成在自包含的类中(另外附带一些Javascript库)
* 调用PHP文件或者HTML页面非常简易,只需创建App类后把类引用传递给需要调用的Javascript对象或者HTML元素即可。
* 捕获Javascript事件
* 可以自定义配置数据,并且支持运行时参数更改
* 无需再Javascript代码中夹杂凌乱的Html代码,所有事件都是被动态附加上的
* 由于以上两个优点,所以支持良好的模版引擎
* 容易Hook到PHP类和MySQL数据已返回给自己的request
* 能够容易的用Javascript建立窗口模式应用程序。
7.2 JPSpan
JPSPAN通过Javascript直接调用PHP中的函数。
* 进行了严谨的单元测试
* 开源许可(PHP)
7.3 XAJAX
XAjax通过Javascript直接调用PHP中的函数
* 支持用Javascript调用PHP脚本
* 开源许可协议
8 Server-Side: Ruby
8.1 Ruby On Rails
Ruby On Rails是一个支持AJAX的完整Web框架,使用Ruby语言编写,严格按照MVC结构开发。
* 当Ajax出现的时候Rails还处于其发展的早期,因此Ajax可能逐渐成为Rails框架的核心。
* 生成浏览器中大多数/全部的Window应用组件和动画的Javascript脚本。
* 支持服务器端调用。
* 队列支持
* 开源许可
CURL是什么?
curl 是一个利用URL语法在命令行方式下工作的文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。curl同样支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP 上传, kerberos认证, HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传, 上载文件断点续传, http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器, 通过http代理服务器上传文件到FTP服务器等等,功能十分强大。Windows操作系统下的网络蚂蚁,网际快车(FlashGet)的功能它都可以做到。准确的说,curl支
持文件的上传和下载,所以是一个综合传输工具,但是按照传统,用户习惯称curl为下载工具。
curl 是瑞典curl组织开发的,您可以访问http://curl.haxx.se/获取它的源代码和相关说明。鉴于curl在Linux上的广泛使 用,IBM在AIX Linux Toolbox的光盘中包含了这个软件,并且您可以访问IBM网站http://www- 1.ibm.com/servers/aix/products/aixos/linux/altlic.html下载它。curl的最新版本是 7.10.8,IBM网站上提供的版本为7.9.3。在AIX下的安装很简单,IBM网站上下载的rpm格式的包。
在 http://curl.haxx.se/docs/,您可以下载到UNIX格式的man帮助,里面有详细的curl工具的使用说明。curl的用法 为:curl [options] [URL…] 其中 options是下载需要的参数,大约有80多个,curl的各个功能完全是依靠这些参数完成的。具体参数的使用,用户可以参考curl的man帮助。
下面,本文就将结合具体的例子来说明怎样利用curl进行下载。
1、获得一张页面
使用命令:curl http://curl.haxx.se
这 是最简单的使用方法。用这个命令获得了http://curl.haxx.se指向的页面,同样,如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地。如果下载的是HTML文档,那么缺省的将不显示文件头部,即HTML 文档的header。要全部显示,请加参数 -i,要只显示头部,用参数 -I。任何时候,可以使用 -v 命令看curl是怎样工作的,它向服务器发送的所有命令都会显示出来。为了断点续传,可以使用-r参数来指定传输范围。
2、表单(Form)的获取
在WEB页面设计中,form是很重要的元素。Form通常用来收集并向网站提交信息。提交信息的方法有两种,GET方法和POST方法。先讨论GET方法,例如在页面中有这样一段:
那 么浏览器上会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单就用GET方法向服务器提交文本框的数据。例如原始页面是在 www.hotmail.com/when/birth…看到的,然后您在文本框中输入1905,然后按OK按钮,那么浏览器的URL现在应该 是:“www.hotmail.com/when/junk….
对于这种网页,curl可以直接处理,例如想获取上面的网页,只要输入:
curl “www.hotmail.com/when/junk….
就可以了。
表单用来提交信息的第二种方法叫做POST方法,POST方法和GET方法的区别在于GET方法使用的时候,浏览器中会产生目标URL,而POST不会。类似GET,这里有一个网页:
浏览器上也会出现一个文本框和一个标为“OK”的按钮。按下这个按钮,表单用POST方法向服务器提交数据。这时的URL是看不到的,因此需要使用特殊的方法来抓取这个页面:
curl -d “birthyear=1905&press=OK” www.hotmail.com/when/junk….
这个命令就可以做到。
1995年年末,RFC 1867定义了一种新的POST方法,用来上传文件。主要用于把本地文件上传到服务器。此时页面是这样写的:
对于这种页面,curl的用法不同:
curl -F upload=@localfilename -F press=OK [URL]
这个命令的实质是将本地的文件用POST上传到服务器。有关POST还有不少用法,用户可以自己摸索。
3、使用PUT方法。
HTTP协议文件上传的标准方法是使用PUT,此时curl命令使用-T参数:
curl -T uploadfile www.uploadhttp.com/receive…
4、有关认证。
curl可以处理各种情况的认证页面,例如下载用户名/密码认证方式的页面(在IE中通常是出现一个输入用户名和密码的输入框):
curl -u name:password www.secrets.com
如果网络是通过http代理服务器出去的,而代理服务器需要用户名和密码,那么输入:
curl -U proxyuser:proxypassword http://curl.haxx.se
任何需要输入用户名和密码的时候,只在参数中指定用户名而空着密码,curl可以交互式的让用户输入密码。
5、引用。
有些网络资源访问的时候必须经过另外一个网络地址跳转过去,这用术语来说是:referer,引用。对于这种地址的资源,curl也可以下载:
curl -e http://curl.haxx.se daniel.haxx.se
6、指定用户客户端。
有些网络资源首先需要判断用户使用的是什么浏览器,符合标准了才能够下载或者浏览。此时curl可以把自己“伪装”成任何其他浏览器:
curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个指令表示curl伪装成了IE5.0,用户平台是Windows 2000。(对方服务器是根据这个字串来判断客户端的类型的,所以即使使用AIX也无所谓)。使用:
curl -A “Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)” [URL]
此时curl变成了Netscape,运行在PIII平台的Linux上了。
7、COOKIES
Cookie是服务器经常使用的一种记忆客户信息的方法。如果cookie被记录在了文件中,那么使用命令:
curl -b stored_cookies_in_file www.cookiesite.com
curl可以根据旧的cookie写出新cookie并发送到网站:
curl -b cookies.txt -c newcookies.txt www.cookiesite.com
8、加密的HTTP——HTTPS。
如果是通过OpenSSL加密的https协议传输的网页,curl可以直接访问:
curl https://that.secure.server…
9、http认证。
如果是采用证书认证的http地址,证书在本地,那么curl这样使用:
curl -E mycert.pem https://that.secure.server…
参考读物和注意事项:curl非常博大,用户要想使用好这个工具,除了详细学习参数之外,还需要深刻理解http的各种协议与URL的各个语法。这里推荐几个读物:
RFC 2616 HTTP协议语法的定义。
RFC 2396 URL语法的定义。
RFC 2109 Cookie是怎样工作的。
RFC 1867 HTTP如何POST,以及POST的格式
防灌水的几种机制
总结了一下处理防灌水的几种机制,
1. 写入客户端Cookie,客户端每次发帖后,写入Cookie中一个postTime值=now()
,然后,每次提交发布信息时进行验证,如果Cookie中的postTime小于15秒,则拒绝发布信息。
优点:可以进行客户端的校验,省去验证码的服务器端校验造成的服务器端的负载压力,
缺点:如果客户端每次都清空Cookie值,则很难处理,
建议:可以结合验证码方法进行双重验证,避免客户端频繁发布信息
2.中心思想:使用数据库的Inserted触发器来屏蔽博客上的垃圾广告留言
自己架设博客,经常会有垃圾留言,俗称Spam,许多是广告留言,如何删除和屏蔽这些留言是令人头痛的问题。我的这个博客的源程序中没有屏蔽广告留言的功能,只有图形数字签名认证。
在 网上找了半天,有添加算式,让留言用户填写结果的等等,需要修改Blog源程序,比较麻烦。突然我想用SQL SERVER中的触发器来屏蔽是瞒不错的, 比较简单易行,只要几行代码就可以搞定。说干就干,在SQL Server2005中,打开Sql Server 2005的 management studio,连接到数据库,选择自己的Blog数据库,单击表,单击需要屏蔽留言的数据表,右键单击触发器,选择新建触发器。在 修改代码后,单击执行按钮即可生成该触发器。
下面是我新建的触发器的源代码
set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author: <Author,,Name> -- Create date: <Create Date,,> -- Description: <Description,,> -- ============================================= Alter TRIGGER [deleteguanggao] on [dbo].[blog_Comment] AFTER Insert AS IF Exists (select * from Inserted where comm_AutoKEY=1 or comm_Author like '世纪之声翻译 %' or comm_Author like '四海一心%' or comm_Author like '机票% ' or comm_postip like '220.175.64.%' or comm_postip like '218.242.67.%' or comm_postip like '218.242.67.%' or comm_postip like '60.1.119.%') BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with Select statements. SET NOCOUNT ON; rollback transaction -- Insert statements for trigger here END
如果你是第一次建立,不是Alter TRIGGER ,是Create TRIGGER.
该触发器在Insert事件发生后触发,也就是说,在有人向你的博客上留言是触发。
如 果已插入的记录符合上述条件,数据库将进行回滚。也就是无法插入符合该条件的记录。你可以根据垃圾留言的作者或IP进行设置。上面 Comm_autokey,Comm_author,Comm_postip是留言数据表的字段,该条件禁用了自动发贴,禁用了作者为世纪之声翻译,IP 是218.242.67等的留言。
当然,这种反SPAM的方式是亡羊补牢式的。
如果你的后台数据库式Ms sql 2000,也可采用这种方式。
3.
ASP+SQL实现日历
本文介绍如何建立基于Web的日历,同时为不熟悉Active Server Pages(ASP)、SQL和ADO的开发者提供建立Web站点的过程介绍,也为有经验的开发者提供了Web站点可伸缩性方面的技巧。
随着网络应用的发展,基于Web的日历越来越受到人们的重视,对于显示诸如最后期限或日程安排之类的重要事件,或显示谁在什么时候休假,基于Web的日历都是有用的。本文描述了如何使用IIS和SQL Server内的ASP建立一个非常简单的基于Web的日历,并允许你与其他人共享你的日程表或管理一组人员的日历。
建立SQL服务器端
对Web日历而言,我们在服务器端仅需保存表明事件性质的一个文本字符串即可,字符串最长为100个字符。设计源代码如下:
Calendar.sql -- 创建表 create table Schedule ( idSchedule smallint identity primary key, dtDate smalldatetime not null, vcEvent varchar(100) not null ) go -- 存储过程 create procedure GetSchedule (@nMonth tinyint, @nYear smallint) as select idSchedule, convert(varchar, datepart(dd, dtDate)) 'nDay', vcEvent from Schedule where datepart(yy, dtDate) = @nYear and datepart(mm, dtDate) = @nMonth order by datepart(dd, dtDate) go create procedure AddEvent (@vcDate varchar(20), @vcEvent varchar(100)) as insert Schedule select @vcDate, @vcEvent go create procedure DeleteEvent (@idSchedule smallint) as delete Schedule where idSchedule = @idSchedule go
设计ASP客户端
下图是Web日历的主要用户界面,用户可以看到哪些事件是已安排的。另外,使用底部的链接可以在日历中按月前后翻动。
ASP的实现代码如下:
header.asp
<@ LANGUAGE="VBSCRIPT" ENABLESESSIONSTATE = False %> <% ' 目的:表头包括用来启动所有页的文件 ' 还包括全局函数 Option Explicit Response.Buffer = True Response.Expires = 0 sub Doheader(strTitle) %> <html> <head> <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"> <title>Event Calendar - <%= strTitle %></title> </head> <body bgcolor="white" link="blue" alink="blue" vlink="blue"> <basefont face="Verdana, Arial"> <center><h1>Event Calendar</h1> <h3><%= strTitle %></h3> <% end sub function GetDataConnection() dim oConn, strConn Set oConn = Server.CreateObject("ADODB.Connection") strConn = "Provider=SQLOLEDB; Data Source=adspm; Initial Catalog=TeamWeb; " strConn = strConn && "User Id=TeamWeb; Password=x" oConn.Open strConn set GetDataConnection = oConn end function %> [/code] 利用ADO,我们可以很容易地将 ASP 页面与 SQL 数据库相连接。首先我们要创建一个到数据库的连接。为了获得记录集,我们要调用 Connection 对象的 Execute 方法,将希望执行的命令的文本字符串传入,一旦有了记录集,就可以在其中循环。header.asp 包含获得数据连接的函数,这意味着如果数据源有变化,我们只有一个位置需要编辑连接信息(服务器、用户和口令)。请注意,作为结果,我们必须在函数的末尾使用 set 命令传出新连接。 优化性能 ASP使建立Web页面变得十分容易,但如果想建立一个可以适应大量用户的站点,你就需要仔细考虑编码。下面笔者将为读者介绍增强基于Web日历可伸缩性的几种方法,这些方法也可用于提高任何基于ASP的Web站点的性能。 1.SQL优化 提高站点性能的一个简单方法是给 Schedule表的date字段添加一个索引,这样,它会在给定日期之间进行查找,因而将加快 GetEvents的存储过程。 对于小型站点,我们可以将 SQL 与 IIS 安装在同一服务器上,一旦站点访问量开始增长,我们可将 SQL 移动到其自身的服务器上,当访问量进一步增长时,我们可以添加均指向同一 SQL 服务器的多个 IIS 服务器。如果 SQL 服务器的通信量过度增长时,还可以将数据分割到不同的服务器上,我们可以将奇数月份分配到一台服务器,将偶数月份分配到另一台服务器上,当然,这需要修改 header.asp 中的 GetDataConnection,以便它为你提供基于此月份的正确连接。 2.ASP 优化 ASP 解释的主要优化方法将是利用高速缓存页面,以便无需每次读取都对它们进行解释。做到这一点的最简单的方法是借助 ASP Application 对象。要做到这一点,你只需将HTML保存到含有月份和年份名称的应用程序变量(例如 Calendar07-2000)中。然后,当显示 Event Calendar 页时,你首先检查一下看看日历是否已经保存在应用程序变量中,如果是,则只需检索它,这种方式会大大加快网站的查询过程。下面的代码显示了这个工作过程: [code] <<do header>> ShowCalendar(nMonth, nYear) <<do Footer>> sub ShowCalendar(nMonth, nYear) if Application("Calendar" && nMonth && "-" && nYear) = "" then <<Build Calendar>> Application("Calendar" && nMonth && "-" && nYear) = <<Calendar>> End if Response.Write Application("Calendar" && nMonth && "-" && nYear) End sub [/code] 当然,在 Events.asp 页更改某个月份的事件时,你需要清空该月份的应用程序变量,以便反映这些事件的更改状况。 安全性 有几种方法可实现此站点上的安全性。对于 Intranet 站点,基于Windows NT的验证是最容易设置的,其原因是你的用户将很可能已经登录到网络。你可让所有用户查看 Event Calendar 页,但是只有管理员能访问Add/Remove Events 页。 如果关心审计,你可以容易地修改 AddEvent 和 DeleteEvent 过程将其信息保存到审计表中。你还可以确保 IIS 为每个页命中的查询字符串和用户进行日志记录,然后逐个分析日志以确定何人于何时做了什么,这是非常简单的。
Float:Right的margin设置
想得到的正确布局图:
结果在FireFox和IE中得到的结果却是:
造成这种情况的CSS代码是:
<style type="text/css">
<!--left-->
.left{
width:500px;
height:600px;
float:left;
border:0;
}
.sample{
width:500px;
height:200px;
float:left;
background-color:#666666;
}
.news{
width:500px;
height:200px;
float:left;
background-color:#006600;
}
<!--right-->
.right{
width:200px;
height:600px;
float:right;
}
.seachIt{
width:200px;
height:100px;
float:right;
background-color:#0066CC;
}
</style>
<body>
<div id="body" class="main">
<!--content-->
<div id="content" class="content">
<!--left content-->
<div id="left" class="left">
<div id="sample" class="sample">sample</div>
<div id="news" class="news">news</div>
</div>
<!--right menu-->
<div id="right" class="right">
<div id="seachIt" class="seachIt">seach</div>
</div>
</div>
</div>
</body>
</html>
分析错误原因,SeachIt的margin没有进行设置top属性,结果浏览器默认margin-top为sample的height
200px,结果造成一直错位,因此需要设置seachIt的margin-top:-200px,这样减少了margin的高度,修改后的代码如下:
<style type="text/css">
<!--left-->
.left{
width:500px;
height:600px;
float:left;
border:0;
}
.sample{
width:500px;
height:200px;
float:left;
background-color:#666666;
}
.news{
width:500px;
height:200px;
float:left;
background-color:#006600;
}
<!--right-->
.right{
width:200px;
height:600px;
float:right;
}
.seachIt{
width:200px;
height:100px;
float:right;
margin-top:-200px;
background-color:#0066CC;
}
</style>
Mikel