思考,行动,习惯...

快乐每一天
posts - 23, comments - 8, trackbacks - 0, articles - 13

2005年12月23日

  本来也想学Tangos那样起个耸人听闻的标题来吸引眼球,但无奈这方面能力缺失,只能用这个一点都不刺激的标题了,真没意思。

  写这个是因为今天看到这篇Web 2.0 Checklist,里面列举了整整20条作者认为属于web2.0的特征要素,我不知道作者是谁,但看起来,这个列表基本上是按照37signals的产品总结的,所有这些要素,全面吻合。我对这个列表只是部分赞同,有一些过于主观的观点并不同意,但这些观点也一样很可爱。

  列举一下:

  1. Give us your email address, we'll let you know when it's ready!"留下你的邮件地址,我们会在服务推出的时候通知你!"
      这种方式我很喜欢,37signals的WriteBoard推出时,采用的就是这样的方式,还有一些其它的公司,也采用了这种方式,但需要有足够的诚意让我相信这不是专门收集邮件地址的网站。一个认真制作的网站比如豆瓣这样的,可以让我有这个确信。
      Web2.0化的服务可以多多采用这样的方式,好处在于可以提早作出预告,尽可能聚集有兴趣的试用者,并在服务可用时高效率的通知到他们。并不是所有人都能象Google那么强势,时刻有人根据种种蛛丝马迹分析将会推出什么新的服务。
  2. Public beta alpha
    原文中,beta上就被划上了删除线,不清楚是最初发表时写成beta,后来想改成alpha了呢,还是本来就是要表达“不要发布beta版,而是alpha版”。  
      之前很多说法是关于这个beta版的,keso也提过“永远的测试版”和网站上的BETA标志,就是说要一直将自己的产品看成Beta版,提醒自己需要不断改进、创新。但这里更狠,将版本提前到了“Alpha“版,应该是建议尽可能早的推出服务吧。
      这一点不是很赞同,过于草率的推出产品,很可能影响用户的使用感受,至少要达到一定的可用性测试之后,才能推出来,因此,Beta版还是比较合适的。
  3. Tags
    使用标签
  4. Feeds for everything
    任何信息都可被订阅
      非常好,作为小型的web2.0服务,不能被订阅,太危险了,用户可能会飞速流失。
  5. Built with Rails
    用Rails开发
      这个说法就是见仁见智了。不可能大家都去用Rails做开发。
      我非常喜欢Rails,虽然我根本不是开发人员,但这不妨碍我对Rails的喜爱,就像我没来由的对asp做的东西很反感一样,我觉得Rails做出来的网站都很酷,而Asp的则很土,这是主观印象,但已经根深蒂固,而且似乎是事实。
  6. Sprinkled with Ajax
    用Ajax
      对Ajax的应用,我的建议是”恰到好处,适可而止“,5月份的时候,我曾经疯狂的为Ajax这种古老技术的组合感到激动,但渐渐觉得,Ajax很好,应该用,但很容易被滥用,将其控制在适当的”度“中,有难度。
  7. Yellow fade
    黄色淡出
      这个特性,我目前只在Basecamp里看到过,很酷,我喜欢。
  8. Blue gradients
      这一点不清楚指的是什么,有知道的朋友请回复告知,多谢。(Doubleaf说,“所谓Blue gradients是不是这里的背景色啊,或者你在google images里搜一下Blue gradients呢?一般我不了解一个东西时,就会搜他们的图像,这时会有更直观的感受。”--恩,好办法。)

  9. Big icons
    大图标
  10. Big fonts
    大字体
      的确,国内网站通用的9号字,看起来真的不舒服。
  11. Big input boxes
    大输入框
  12. REST API
    REST(状态调用)API(应用程序接口)
      这个堪称是Web2.0的精髓了,不开放,就不配叫Web2.0,我的个人观点。
  13. Google Maps Mashup
    基于Google Maps,提供一些应用
      那个著名的芝加哥犯罪地图,应该就具备了这个特征。
  14. Share with a friend
    和朋友分享
      这一点也很重要,Web2.0的服务,更多的是依靠真心喜爱他的用户之间的口碑营销,我经常会情不自禁的向身边的朋友推荐BloglinesFlickr豆瓣
      而有些网站依靠种种“编程技巧”让用户被迫充当传播病毒的“肉鸡”,这种行为,已经和拦路抢劫没有什么本质上的区别了。
  15. TypePad blog for a peek inside the team
    在团队内部准备一个TypePad的Blog
      当然不一定是TyepPad的,但一个好的、真正的Blog确实是重要的,这点似乎也说明了TypePad有多么的被热爱,可惜在国内,也是不能访问的禁区之一。
  16. Feature screencasts
    功能特色的屏幕演示
      支持,有助于用户快速了解一下产品的功能、界面,而且如果这个演示足够的好,对潜在的用户,会带来极大的吸引力。
  17. Hackathons for new features
    采用Hackathon的方式开发新的功能
      Hackathon是一种听起来非常浪漫的开发方式,而且运用得当的话,也会具备极高的投入产出比。
      关于Hackathon的细节,可以参考以前的一篇Blog:Hackathon-有趣的快速开发方式
  18. Development wiki
    开发用的wiki
      似乎Technorati有这样一个wiki
  19. Business model optimized for the long tail
    商业模式最好是面对长尾市场的
      我认为这一点非常有道理,Web2.0的公司,提供的产品本质上,应该都是小众的,以传统的服务方式,很难将这些小众的需求变成一个有足够利润的市场,因此,商业模式应该是面向长尾的。
  20. It's Free!/AdSense revenue stream
    免费,依靠AdSense带来现金流
      能这样做当然很完美,但许多很好的Web2.0的服务要拼流量根本拼不过一个美女图片或是音乐的小站,如何能依靠AdSense带来足够的收入?
      免费不是Web2.0的必备特征,相反,很多优质的Web2.0服务,应该是收费的。比如Flickr、比如Typepad。

  说这些有什么意义呢?Web2.0这个说法,已经因为太多不冷静的关注,导致在不该出现的场合出现的过多过滥,但并不代表这个概念本身也是如此,Web的进化也是社会进化的一种,各种形态之间的过渡不可能界限分明,人们通常只会对一些符号化的东西印象深刻,比如当年的喇叭裤、军装、霹雳舞等等,在若干年后,也牢牢铭刻在我们的脑海中,并且成为那个时代的标记。

  同样,也正是这些个性鲜明的Web2.0特征,在一点一滴的塑造着属于全新一代互联网的文化。今后,Web2.0周刊在对国内的新一代互联网公司进行品评时,可能会借鉴参照这些特征元素,评出相应的Web2.0指数。

posted @ 2005-12-23 13:45 wyi23 阅读(255) 评论(0) 编辑

2005年12月10日

今天,您可以发现成千上万的 RSS 提要。Weblog 用户、新闻出版商、政府代理以及许多个人和商业 Web 站点都支持这种格式。Java 技术、PERL、PHP、Python 和其他主要编程语言,都为开发人员提供了处理 RSS 的工具。许多阅读器和聚集器都工作在 Web、桌面甚至 e-mail 客户程序中。RSS 已成为 Internet 上连锁内容和元数据事实上的标准。
本文将观察现行的 RSS 2.0 规范。我不准备讨论格式上丰富多彩的特征以及围绕它的争论,否则就无法讨论其他内容了。
相反,本文将为您提供少量背景知识,考察这种格式的用法,并列出一些比较流行的处理这种格式的工具。文中将讨论这种格式的具体细节,给您一些例子,并说明在开始之前您需要了解哪些东西。最后,本文将涉及到 RSS 2.0 的一些新特性。在文章的最后,您将找到丰富的矿藏 —— 一份长长的、带有注释的 RSS 参考资料列表。


什么是 RSS?
“RSS”究竟代表什么?
和许多标准一样,即使最基本的方面也很难让人们达成一致。有人说它表示 “RDF Site Summary(RDF 站点摘要)”,其他人则说是“Really Simple Syndication(真正简单的连锁)”,还有人相信它代表 “Rich Site Summary(丰富站点摘要)”。
根据 Dave Winer(他是现行规范的作者)的观点,“关于 RSS 代表什么没有一致的看法,它不是一个首字母缩写词,而是一个名称。规范的最新版本可能称它是缩写词,但愿不会影响到太多应用程序。”
无论如何,RSS 都代表一件事 —— 在 Internet 上连锁内容的一种格式。

RSS 是 Internet 上连锁内容和元数据的一种格式。通常用于共享标题和到新闻文章的链接。对于新闻文章,真正的文章不一定是共享的,但是关于文章的元数据通常是共享的;这种元数据可以包含标题、URL或者摘要。对于出版商而言,RSS 是一种重要的工具,因为提要可用于连锁内容,并把第三方的内容集成到您的站点中。
RSS 是一种 XML 方言。所有的 RSS 文件必须符合万维网联盟(World Wide Web Consortium,W3C)Web 站点上发布的 XML 1.0 规范。
下面是一个典型的例子,说明了如何使用 RSS:
•一个出版商有一些希望发布的内容。
•他们为这些内容创建了一个 RSS 频道。
•在这个频道中包含了关于希望宣传的网页的一些项。
•这个频道可以被远程应用程序读取并转换成标题和链接。这些链接可以加入到新的 Web 页中或者供专门的读者阅读。
•人们从不同的站点看到这个链接,单击连接进入最初出版商的网站。
尽管标题连锁是最常见的 RSS 用法,但也可用于其他目的。RSS 在 weblog 社区中是一种非常流行的格式。它也被用于照片簿、分类广告列表、食谱、评论以及跟踪软件包的状态。
RSS 提要在电子商务中用作一种传递信息的方式。比如,Amazon 根据其 Web 服务平台向客户提供新闻提要。从而使您能够在新闻阅读器中了解最畅销的图书,或者在您的 Web 站点中包括关于 Amazon 销售的相关图书的信息。
过去几年中,RSS 在普及性方面有了惊人的增长。Syndic8.com 维护了一个 RSS 频道索引,它的提要列表在两年中加长了大约 1400%。Yahoo 新闻、BBC、Slashdot、LockerGnome、Amazon、CNN、Wired、Rolling Stone 和 Apple Computer 都位于许多最普及的 RSS 提要来源之列。
新闻阅读器
随着新闻提要数量的增加,出现了一种新的软件类型:新闻阅读器。新闻阅读器是个人聚集器 —— 帮助您发现和组织感兴趣的频道列表。一旦选择了频道,您就可以使用阅读器一致的界面查看这些频道。新闻阅读器检查您所感兴趣的频道的更新,并转化成可以浏览的 HTML。比较常见的新闻阅读器包括 BlogStreet、FeedReader、AmphetaDesk 和 NewsGator
发现 RSS 提要
可以使用搜索引擎查找 RSS 格式的内容。比方说使用 Google 时,您可以在查找中增加“filetype:rss”以搜索 .rss 文件中的查找项。
专门的搜索引擎使内容搜索更加容易。Feedster 监视 weblog 并允许您通过一个日志项索引查找,按照相关性、日期、等级(logrank)查看。当您在搜索时,Feedster 按照您的要求创建一个 RSS 提要。这个提要可以增加到您的新闻阅读器中,以便您能够看到所有与搜索请求有关的最新活动,您甚至不需要离开新闻阅读器。
DayPop 搜索新闻、blog 和 RSS 提要。它让您在 weblog 世界跟踪流行的新闻。它提供了目前最流行的 40 个 weblog 链接。这是全世界最流行文章的链接。它创建了一个 weblog 中所用最热门词汇的列表。它还根据引用对 weblog 评级,提供最受其他 weblogger 欢迎的 weblog 列表。您也可以自定义搜索。评级列表和自定义搜索都有 RSS 提要形式,可以导入您的新闻阅读器。
RSS 2.0 的新特性
RSS 2.0 建立在 RSS 0.91 规范的基础上。它是向后兼容的,因此任何处理 RSS 2.0 的工具应该也能够处理 0.91 提要。升级后的规范增加了少量元素,比如 <cloud> 和 <guid>。
它也去掉了一些限制。在过去,<link> 和 <url> 元素只能是 http 或 ftp,现在可以使用任何有效的 URI。在 RSS 0.91 中,每个频道只能包含 15 个项,而且元素的长度也有限制,现在这些限制都取消了。不过仍然应该小心使用较大的值,因为它们可能对老的应用程序造成问题。
不过更大的变化是能够使用名称空间扩展这种格式。RSS 2.0 支持名称空间,一种增加规范中没有的元素的标准方法。只要定义在一个名称空间中,提要可以包含新的元素。
RSS 2.0 概述
RSS 是一种 XML 方言,用于连锁 Web 内容和元数据。RSS 0.91 是几种可用版本中最常用的一种。对于新的 RSS 提要,更好的办法是使用 2.0 版,因为这是现行的规范,而且如前所述,它与 0.91 向后兼容。
Dave Winer 编写了规范的 2.0 版。规范的修改可能变得难以使用,或者损害已有的应用程序,他有意识地避免了这种情况。Winer 总结了他的思想:“保持简单。这就是 RSS 的价值所在。任何稍微了解 HTML 的人都能够理解 RSS。这一点极其重要!”
该规范在 Creative Commons 许可下发布(请参阅参考资料)。这意味着您可以免费复制和分发该规范,并进行衍生工作,而且可以自由地用于商业工作。一个咨询委员会负责更新规范、推广规范和编写文档。
RSS 文件形式
RSS 文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。项通常是频道的主要部分,包含经常变化的内容。
频道
频道一般有三个元素,提供关于频道本身的信息:
•<title>:频道或提要的名称。
•<link>:与该频道关联的 Web 站点或者站点区域的 URL。
•<description>:简要介绍该频道是做什么的。
许多频道子元素都是可选的。常用的 <image> 元素包含三个必需的子元素:
•<url>:表示该频道的 GIF、JPEG 或 PNG 图像的 URL。
•<title>:图象的描述。当频道以 HTML 呈现时,用作 HTML <image> 标签的 ALT 属性。
•<link>:站点的 URL。如果频道以 HTML 呈现,该图像作为到这个站点的链接。
<image> 还有三个可选的子元素:
•<width>:数字,表示图象的像素宽度,最大值是 188,默认值为 88。
•<height>:数字,表示图象的像素高度。最大值是 400,默认值为 31。
•<description>:包含文本,在呈现时可以作为围绕着该图像形成的链接元素的 title 属性。
此外还可以使用许多其他可选的频道元素。多数都是不言自明的:
•<language>:en-us
•<copyright>:Copyright 2003, James Lewin
•<managingEditor>:dan@spam_me.com (Dan Deletekey)
•<webMaster>:dan@spam_me.com (Dan Deletekey)
•<pubDate>:Sat, 15 Nov 2003 0:00:01 GMT
•<lastBuildDate>:Sat, 15 Nov 2003 0:00:01 GMT
•<category>:ebusiness
•<generator>:Your CMS 2.0
•<docs>:http://blogs.law.harvard.edu/tech/rss
•<cloud>:允许进程注册为“cloud”,频道更新时通知它,为 RSS 提要实现了一种轻量级的发布-订阅协议。
•<ttl>:存活时间 是一个数字,表示提要在刷新之前缓冲的分钟数。
•<rating>:关于该频道的 PICS 评价。
•<textInput>:定义可与频道一起显示的输入框。
•<skipHours>:告诉聚集器哪些小时的更新可以忽略。
•<skipDays>:告诉聚集器那一天的更新可以忽略。

项通常是提要中最重要的部分。每个项都可以关于某个 weblog、完整文档、电影评论、分类广告或者任何希望与频道连锁的内容的记录。频道中的其他元素可能不变,但项经常发生变化。
您可以有任意多个项。以前的规范限值为 15 个项,如果要保持向后兼容这仍然是一个很好的上限。
新闻项的元素
每个项通常包含三个元素:
•<title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。
•<link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL。
•<description>:通常作为 link 中所指向的 URL 的摘要或者补充。
所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
项还有其他一些可选的元素:
•<author>:作者的 e-mail 地址。
•<category>:支持有组织的记录。
•<comments>:关于项的注释页的 URL。
•<enclosure>:支持和该项有关的媒体对象。
•<guid>:唯一与该项联系在一起的永久性链接。
•<pubDate>:该项是什么时候发布的。
•<source>:该项来自哪个 RSS 频道,当把项聚合在一起时非常有用。
清单 1 是一个 RSS 2.0 文件的例子。注意,频道包含在 <rss version="2.0"> 中。这是一个非常基本的例子,说明了项和图像如何包含在频道中。所示的元素都是最常用的频道子元素。
清单 1. 示例 RSS 2.0 文件

<?xml version="1.0"?>
<rss version="2.0">
   <channel>
   <title>The channel's name goes here</title>
   <link>http://www.urlofthechannel.com/</link>
   <description>This channel is an example channel for an article.
   </description>
   <language>en-us</language>
   <image>
     <title>The image title goes here</title>
     <url>http://www.urlofthechannel.com/images/logo.gif</url>
     <link>http://www.urlofthechannel.com/</link>
   </image>
   <item>
     <title>The Future of content</title>
     <link>http://www.itworld.com/nl/ecom_in_act/11122003/</link>
     <description> The issue of people distributing and reusing
     digital media is a problem for many businesses. It may also be
     a hidden opportunity. Just as open source licensing has opened
     up new possibilities in the world of technology, it promises to do
     the same in the area of creative content.</description>
   </item>
   <item>
     <title>Online Music Services - Better than free?</title>
     <link>http://www.itworld.com/nl/ecom_in_act/08202003/</link>
     <description>More people than ever are downloading music from
     the Internet. Many use person-to-person file sharing programs like
     Kazaa to share and download music in MP3 format, paying nothing.
     This has made it difficult for companies to setup online music
     businesses. How can companies compete against free?</description>
   </item>
 </channel>
</rss>
相关工具
由于 RSS 的普及,出现了许多工具,使您能够基本上在任何环境中使用这些文件:
•Java 技术:可在 Sun 站点上找到的一个 RSS Utilities Package,支持在 JavaServer Pages 中使用 Tag Library。它还包括一个 RSS 解析器。
•Perl:已经有几种 Perl 工具处理 RSS。XML::RSS 提供了创建和维护 RSS 文件的一个框架。它支持在常用版本之间的转换。
•Python:RSS.py 是一组通过 Python 使用 RSS 频道的类。
此外,许多内容管理和 weblog 工具也直接支持 RSS。多数 weblog 工具,包括 Movable Type、Blogger 和 Radio Userland 都支持 RSS。一些内容管理系统,包括 Zope 和 CityDesk 现在也支持它了。
扩展 RSS
RSS 2.0 有许多可选元素,包括多数频道都需要的那些元素。但是它还支持扩展性,因此您可以使用规范中没有的元素。不过,RSS 2.0 规范并没有花费多少时间定义如何实现扩展。关于扩展性,规范中总结为:“RSS 提要可以包含本页中没有描述的元素,只要这些元素定义在一个名称空间中。”
这就留下了很大的想像空间!所幸的是,规范中包含一个例子,您可以参考目前使用的几个例子。
基本的思想是您可以增加需要的标签 —— 但是,增加带有多种含义的元素太容易了。使用您的频道的人们可能并不知道某个标签是什么含义。比如,如果我要在一个频道中使用 <analog> 标签,它的含义就不很清楚。Web 专家可能认为这个标签指的是 Analog,它是最流行的 Web log 文件分析器。科幻迷可能认为这个标签是关于 Analog 的,一本经典的科幻杂志。音乐家可能认为它指的是流行的合成器类型,生物学家认为这是一种器官,电子工程师认为是一种电路。含糊性使人们很难理解标签的含义。
因此,RSS 允许您增加所喜欢的任何标签,但是要求必须和名称空间一起使用。这样有助于澄清标签的含义。
再回到 <analog> 的例子,我可能希望创建一组关于电子商务的标签,并让 <analog> 标签作为一个“e-business”元素。为此,我增加如下的名称空间:
xmlns:ebusiness="http://www.lewingroup.com/ebusinessChannel"
这就创建了一个名为“ebusiness”的名称空间,并表明这个名称空间的文档在我的站点上。为了使用 <analog> 标签,我可以使用这种格式:<ebusiness:analog>。这样就能与其他类似的含义中区分开来,比如 <sciencefiction:analog> 或 <synthesizers:analog>。
关于扩展性,一个更实际的例子可以在 RSS 2.0 规范的示例文件中找到:
清单 2. RSS 2.0 规范示例文件中的名称空间

<?xml version="1.0"?>
<!-- RSS generated by Radio UserLand v8.0.5 on 9/30/2002; 4:00:00 AM Pacific -->
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">
 <channel>
   <title>Scripting News</title>
   <link>http://www.scripting.com/</link>
   <description>A weblog about scripting and stuff like that.</description>
   <language>en-us</language>
   <blogChannel:blogRoll>
     http://radio.weblogs.com/0001015/userland/scriptingNewsLeftLinks.opml
   </blogChannel:blogRoll>
     <item>
     <description>Joshua Allen:
     <a href="http://www.netcrucible.com/blog/2002/09/29.html#a243">
     Who loves namespaces?</a></description>
     <pubDate>Sun, 29 Sep 2002 19:59:01 GMT</pubDate>
     <guid>
     http://scriptingnews.userland.com/backissues/2002/09/29#When:12:59:01PM
     </guid>
     </item>
 </channel>
</rss>
在这个例子中,定义了一个称为 blogChannel 的名称空间。它指向一个文档,该文档解释了几种常见于 weblog 的新元素的用法。其中之一是 <blogroll>。文档说明,blogroll 是 weblog 中的一个链接集合,指向与您的 weblog 内容相关的站点。
<blogChannel:blogRoll> 标签提供了用户或软件所需要的信息,知道 blogRoll 是一个定义在 blogChannel 名称空间中的元素,而且可以找到这个文档的位置。
同样,RSS 2.0 只对不 属于规范的元素要求名称空间。所有的基本标签都假定在 RSS 2.0 名称空间中。这使得这种格式更容易使用,因为除非需要扩展 RSS,否则您完全不需要知道名称空间。
结束语
本文考察了 RSS 在内容连锁和聚合领域的重要性。文章主要讨论 RSS 2.0,因为这是最新的规范版本,而且正在迅速普及。本文也考察了处理 RSS 可以使用的工具,包括集聚器、验证程序和解析器。更多信息请参阅参考资料。

posted @ 2005-12-10 16:03 wyi23 阅读(258) 评论(0) 编辑

<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"> 在一个RSS文档中,根元素是<rss>,带有一个必备属性version,用以指明该文档遵循的rss规范,如果rss文档遵循本规范,则version值必须是2.0。<rss>元素只有一个子元素,包含关于频道的一些信息。
<channel> 频道(channel)是整个blog
<title>篮球-NBA新闻</title> 频道名称 必备
<image>
<title>体育-篮球</title>
<link>http://sports.sina.com.cn/basketball</link> 频道的URL 必备
<url>http://image2.sina.com.cn/ty/up/1_6-64-1322-3419_2003080523227.gif</url>
</image>
<description>篮球-NBA新闻</description> 频道的描述 必备
<link>http://sports.sina.com.cn/basketball/index.shtml</link>
<language>zh-cn</language> 频道文章所用语言, 可用netscape或w3c推荐的列表 可选 en-us
<generator>WWW.SINA.COM.CN</generator> 生成该频道的程序名 可选 MightyInHouse Content System v2.3
<ttl>5</ttl> ttl 有效期,用以指明该频道可被缓存的最长时间 分钟为单位 可选 <ttl>60</ttl>
<copyright>Copyright 1996 - 2005 SINA Inc. All Rights Reserved</copyright> 频道内容的版权说明 可选 Copyright 2002, Spartanburg
<pubDate>Thu, 8 Sep 2005 09:01:57 GMT</pubDate> 频道内容发布日期,格式遵循RFC822格式(年份可为2们或4位) 可选 Sat, 07 Sep 2002 00:00:01 GMT
<category />
<item> 项(item)指一篇文章或日志(也有称这为post)
<title>美媒体曝光掘金惊天交易 昔日助攻王换波士顿头牌</title>
<link>http://sports.sina.com.cn/k/p/2005-09-08/13151760354.shtml</link>
<author>WWW.SINA.COM.CN</author>
<guid />
<category>篮球-NBA新闻</category>
<pubDate>Thu, 8 Sep 2005 05:15:35 GMT</pubDate>
<comments />
<description>  北京时间9月8日消息,掘金队在获得了沃森之后,接下来又开始在转会市场上酝酿巨大的风暴了。根据美国篮球网站insidehoop.com透露,现在掘金队正在和凯尔特人谈判,希望用安德鲁-米勒加上内内的代价得到凯尔特人的当家球星皮尔斯。   皮尔斯在场上是一名锋卫摇摆人,他可....</description>
</item>
</channel>
</rss>

RSS2.0元素channel的子元素列表

元素(Element)
描述(Description)
值域重要性
举例(Example)
title 频道名称 必备 GoUpstate.com News Headlines
link 频道的URL 必备 http://www.goupstate.com/
Description 频道的描述 必备 The latest news from GoUpstate.com, a Spartanburg Herald-Journal Web site.
language 频道文章所用语言, 可用netscape或w3c推荐的列表 可选 en-us
copyright 频道内容的版权说明 可选 Copyright 2002, Spartanburg Herald-Journal
managingEditor 责任编辑的email 可选 geo@herald.com (George Matesky)
webMaster 负责频道技术事务的网站管理员email 可选 betty@herald.com (Betty Guernsey)
pubDate 频道内容发布日期,格式遵循RFC822格式(年份可为2们或4位) 可选 Sat, 07 Sep 2002 00:00:01 GMT
lastBuildDate 频道内容最后的修改日期 可选 Sat, 07 Sep 2002 09:42:31 GMT
category 指定频道所属的一个或几个类别 可选 <category>Newspapers</category>
generator 生成该频道的程序名 可选 MightyInHouse Content System v2.3
docs 指向该RSS文件所用格式说明的URL 可选 http://blogs.law.harvard.edu/tech/rss
ttl 有效期,用以指明该频道可被缓存的最长时间 分钟为单位 可选 <ttl>60</ttl>
image 指定一个 GIF或JPEG或PNG图片,用以与频道一起显示 可选  
rating 这个频道的分级(主要指成人、限制、儿童等) 可选  
textInput 指定一个text输入框供用户输入,具体信息及功能未定。 可选  
skipHours 提示新闻聚合器,那些小时时段它可以跳过。 可选  
skipDays 提示新闻聚合器,那些天它可以跳过。 可选  

RSS2.0元素channel的子元素image的子元素列表

元素(Element)
描述(Description)
值域重要性
举例(Example)
url 图片的url 必备  
title 图片的标题,用于http的alt属性 必备  
link 网站的url(实际中常以频道的url代替) 必备  
width 图片的宽度(象素为单位) 最大144,默认88 可选  
height 图片的高度(象素为单位) 最大400,默认31 可选  
description 用于link的title属性 可选  

RSS2.0元素channel的子元素cloud的子元素列表

元素(Element)
描述(Description)
值域重要性
举例(Example)
domain Cloud程序所在机器的域名或IP地址   radio.xmlstoragesystem.com
port 访问clound程序所通过的端口   80
path 程序所在路径(不一定是真实路径)   /RPC2
registerProcedure 注册的可提供的服务或过程   xmlStorageSystem.rssPleaseNotify
protocol 协议 xml-rpc, soap , http-post 之一   xml-rpc

RSS2.0元素channel的子元素textInput的子元素列表

元素(Element)
描述(Description)
值域重要性
举例(Example)
title Submit按钮的标签 必备  
description 解释text输入区 必备  
name Text area对象的名字 必备  
link 处理提交的请求的cgi程序 必备  

(注:收藏自http://blog.csdn.net/bvcvb/archive/2005/11/23/535482.aspx)

posted @ 2005-12-10 15:36 wyi23 阅读(276) 评论(0) 编辑

2005年11月11日

http://blog.dreambrook.com/zlliu/archive/2005/05/18/623.aspx
大约五年前我曾参与一个web应用的开发,该应用的一个主要需求是要提供类似window胖客户端的外观和操作方式。先不讨论为什么当初这个项目不直接使用window胖客户端,而把这个难题带到了web开发中,事实是在五年前还没有多少这样的东西(基于web的胖客户端)存在。

作为对这一课题研究的结果,我偶然发现了一些用于实现上述需求的非典型技术和方法。使用这些技术实现的web应用,直到现在很多人还不能相信它们是基于web的,然后事实上你确实是通过浏览器来访问它们。

让我没想到的是,几年后的今天我所实现的那种东西又出现另一种实现方式,它就是AJAX。AJAX是Adaptive Path的人们发明的一个名词,全称是Asynchronous Javascript + XML。

这说明了一件事情,提炼你曾经拥有的好主意是致富的一个好方法。如果当初我意识到我所作的是一件很特别的东西......我跑题了

Google正在使用这项技术,许多其它的组织也是。但它究竟是个什么东西呢?概括地说,AJAX不是一项技术,只是一种考虑问题的方法,这个方法整合了多种技术且基于这样一种考虑:为每一个客户请求构造一张全新的web页面是低效的且应该避免的。

举个例子,假设你再一张web页面上放了两个SELECT元素,你想让第二个SELECT元素的内容随着第一个的内容变化而变化,这是实际开发中很常见的一个问题而且有多种解决方案。

AJAX对此问题的解决方法是:只重画页面的一小部分,在这里是第二个SELECT。

AJAX基于一种称为XMLHttpRequest的组件。讨厌Microsoft的人要开始叫嚷了,因为这是Microsoft的东西。不错,Microsoft有些东西做得挺好,而且先于其他人做了。Microsoft最初实现XMLHttpRequest是在Windows下的IE 5中,其实现方式是ActiveX对象(好吧,他们做得不完全对!)。Monilla项目在Mozilla 1.0中实现了一个本地版本,还有Netscape 7。其他的还有Apple的Safari 1.2,Opera 7.60,Firefox等,有提供了类似的功能。

好,让我们切开这块蛋糕看看它的实现。

 XMLHttpRequest是一个客户端组件,需要在Javascript脚本中实例化后才能使用。幸运的事,这样做非常简单。在IE中,实现代码如下:

 var req = new ActiveXObject("Microsoft.XMLHTTP");

对其他的浏览器,使用:

var req = new XMLHttpRequest();

你当然想在代码中实现一些判断逻辑,有很多方法可以做到这点,但是我倾向于简单的方案,比如只是检查一下某个对象是否存在:

var req;

if (window.XMLHttpRequest) { // Non-IE browsers  

req = new XMLHttpRequest();

} else if (window.ActiveXObject) { // IE  

req = new ActiveXObject("Microsoft.XMLHTTP");

}

不管你怎么实现,上面的代码执行之后,你会发现变量req现在指向了一个XMLHttpRequest对象,这个对象有一组属性和方法,列举如下:

Property                                  Description

onreadystatechange                  Event handler for an event that fires at every state change

readyState                                Status:

0 = uninitialized

1 = loading

2 = loaded

3 = interactive

4 = complete

responseText                            Data returned from server in string form

responseXML                          DOM-compatible document object of data returned

status                                        HTTP status code (i.e., 200, 404, 500, etc.)

statusText                                 String message associated with the status code

 

Method                                   Description

abort()                                      Stops the current request

getAllResponseHeaders()         Returns all headers (name and value) as a string

getResponseHeader(                Returns the value of the specified header

"<headerName>")

open("", "URL"[,       Opens a connection and retrieves response from the specified URL.

asyncFlag[, ""[,      Can also specify optional values method (GET/POST), username and

"<password>"]]])                     password for secured sites

 send(content)                           Transmits request (can include postable string or DOM object data)

setRequestHeader                    Assigns values to the specifed header

("<name>", "")

 

继续介绍之前,我强烈建议你运行本文末尾给出的那个web应用。如果你还没有下载示例应用,请参见本文末尾给出的链接,下载并安装到你的servlet引擎中。示例应用是以展开目录的结构形式发布的,所以只要解压后拷贝解压出的目录就可以工作。比如,如果你使用Tomcat,只要把xhrstruts目录拷贝到\webapps下就可以了。完成之后,启动服务器即可。

该应用可以通过http://localhost:8080/xhrstruts (将8080换成你的服务器所监听的端口)来访问。  它展示了几种不同的应用场景:一个可排序的table,一个可以改变另一个下拉框内容的下拉框(如上文所述),一个RSS feed 解析器。正像本文标题中说明的那样,该示例基于struts。尽管AJAX可以完全独立于struts和任何其他的后端技术,但我使用Java,而且使用struts,所以......

web应用中的所有例子都在代码头部的标签中包含有一段代码,尽管每个都有所不同,总体是出自相同的基础代码,如下:

var req;

  var which;

 

  function retrieveURL(url) {

    if (window.XMLHttpRequest) { // Non-IE browsers

      req = new XMLHttpRequest();

      req.onreadystatechange = processStateChange;

      try {

        req.open("GET", url, true);

      } catch (e) {

        alert(e);

      }

      req.send(null);

    } else if (window.ActiveXObject) { // IE

      req = new ActiveXObject("Microsoft.XMLHTTP");

      if (req) {

        req.onreadystatechange = processStateChange;

        req.open("GET", url, true);

        req.send();

      }

    }

  }

 

  function processStateChange() {

    if (req.readyState == 4) { // Complete

      if (req.status == 200) { // OK response

        document.getElementById("urlContent").innerHTML = req.responseText;

      } else {

        alert("Problem: " + req.statusText);

      }

    }

  }
 

这段代码逻辑很简单。你可以调用retieveURL()方法,传入你想访问的URL,该方法根据浏览器类型实例化相应的XMLHttpRequest对象,开启一个对指定URL的请求。请留意这里的try...catch语句块,加入这段代码是因为有些浏览器(比如Firefox)不允许使用XMLHttpRequest从一个域到另一个域发送请求,换句话说,如果你从www.omnytex.com/test.htm页面请求www.cnn.com,该类浏览器是不允许的,但是,访问www.omnytext.com/whatever.htm是可以的。IE允许这种跨域访问但是需要用户验证。

有一行代码很重要:req.onreadystatechange = processStateChange,这行代码设定了一个事件处理器。当request的状态发生变化时,processStateChange()方法将被调用。然后,你可以检查XMLHttpRequest对象的状态进行后续处理。上面的列表中列出了所有可能的值。这里我们关心的是请求完成之后,下面要做的事就是检查收到的HTTP响应代码,除200(HTTP OK)外的任何代码都预示着需要显示错误信息。

在这个例子中,如果响应接收完成且没有异常,我们就把接收到的代码插入urlContent span,然后最终效果就显示在页面上。

语法上讲,这就是所有XMLHttpRequest的使用方法!

另一个更有趣的例子是web应用中的第二个,动态排序table。下面是完整的页面代码:

<code>

<html>

<head>

<title>Example 2</title>

 

<script>

 

  var req;

  var which;

 

  function retrieveURL(url) {

    if (window.XMLHttpRequest) { // Non-IE browsers

      req = new XMLHttpRequest();

      req.onreadystatechange = processStateChange;

      try {

        req.open("GET", url, true);

      } catch (e) {

        alert(e);

      }

      req.send(null);

    } else if (window.ActiveXObject) { // IE

      req = new ActiveXObject("Microsoft.XMLHTTP");

      if (req) {

        req.onreadystatechange = processStateChange;

        req.open("GET", url, true);

        req.send();

      }

    }

  }

 

  function processStateChange() {

    if (req.readyState == 4) { // Complete

      if (req.status == 200) { // OK response

        document.getElementById("theTable").innerHTML = req.responseText;

      } else {

        alert("Problem: " + req.statusText);

      }

    }

  }

 

</script>

 

</head>

<body onLoad="retrieveURL('example2RenderTable.do');">

 

<h1>Example 2</h1>

Dynamic table.<hr>

<p align="right"><a href="home.do">Return home</a></p><br>

This example shows how a table can be built and displayed on-the-fly by showing

sorting of a table based on clicks on the table headers.

<br><br>

 

<span id="theTable"></span>

<br>

 

</body>

</html>

</code>
 

请注意中几乎相同的代码。这里我们实际请求的是一个Struts的Action,该action返回绘制table的HTML脚本。还有其他方法可以达到相同的效果而无需在Action中产生HTML,但这是最快捷而且工作良好的。当页面最初载入的时候我们发送请求到Action得到一个最初的table,点击任何列标题可以将该table排序并重新绘制。

我们再来看另外一个例子,RSS feed 解析器:

<code>

<html>

<head>

<title>Example 6</title>

</head>

 

<script>

 

  var req;

  var which;

 

  function retrieveURL(url) {

    if (url != "") {

      if (window.XMLHttpRequest) { // Non-IE browsers

        req = new XMLHttpRequest();

        req.onreadystatechange = processStateChange;

        try {

          req.open("GET", url, true);

        } catch (e) {

          alert(e);

        }

        req.send(null);

      } else if (window.ActiveXObject) { // IE

        req = new ActiveXObject("Microsoft.XMLHTTP");

        if (req) {

          req.onreadystatechange = processStateChange;

          req.open("GET", url, true);

          req.send();

        }

      }

    }

  }

 

  function processStateChange() {

    if (req.readyState == 4) { // Complete

      if (req.status == 200) { // OK response

        // We're going to get a list of all tags in the returned XML with the

        // names title, link and description.  Everything else is ignored.

        // For each that we find, we'll constuct a simple bit of HTML for

        // it and build up the HTML to display.  When we hit a title,

        // link or description element that isn't there, we're done.

        xml = req.responseXML;

        i = 0;

        html = "";

        while (i >= 0) {

          t = xml.getElementsByTagName("title")[i];

          l = xml.getElementsByTagName("link")[i];

          d = xml.getElementsByTagName("description")[i];

          if (t != null && l != null && d != null) {

            t = t.firstChild.data;

            l = l.firstChild.data;

            d = d.firstChild.data;

            html += "<a href=\"" + l + "\">" + t + "</a><br>" + d + "<br><br>";

            i++;

          } else {

            i = -1;

          }

        }

        document.getElementById("rssData").innerHTML = html;

      } else {

        alert("Problem: " + req.statusText);

      }

    }

  }

 

</script>

 

<body>

 

<h1>Example 6</h1>

RSS example.<hr>

<p align="right"><a href="home.do">Return home</a></p><br>

This example is a more real-world example.  It retrieves an RSS feed from one

of three user-selected sources, parses the feed and displays the headlines

in clickable form.  This demonstrates retrieving XML from a server and

dealing with it on the client.

<br><br>

<b>Note that the RSS feed XML is actually stored as files within this

webapp.  That is because some browsers will not allow you to retrieve

content with XMLHttpRequest outside the domain of the document trying to

do the call.  Some browsers will allow it with a warning though.</b>

<br><br>

<form name="rssForm">

  <select name="rssFeed" onChange="retrieveURL(this.value);">

    <option value=""></option>

    <option value="cnn_rss.xml">CNN Top Stories</option>

    <option value="slashdot_rss.xml">Slashdot</option>

    <option value="dans_rss.xml">Dan's Data</option>

  </select>

</form>

<hr><br>

<span id="rssData"></span>

<br>

 

</body>

</html>

</code>
 

首先要注意的是RSS feed XML文件实际上是包含在web应用中的本地文件。一个真正实用使用XMLHttpRequest的RSS阅读器是不可能实现的因为要涉及到跨域处理。然而,一个可行的方法是写一个Action从真正的URL处得到feed然后将之返回给请求页面,参见示例7。除了需要一个Action作为代理来得到RSS feed外,页面上代码还是相同的。

上面的例子跟其它的类似,除了在事件处理器中的XML解析代码。这只是一个简化的例子,我们只是简单地忽略了除标题之外的其他标签。在一个真实的例子中(比如一个请求复杂XML的应用),解析代码会变得复杂,但这个我留给读者作为练习。

让我们以一个在请求中提交数据的例子做结,中的脚本如下:

var req;

  var which;

 

  function submitData() {

    // Construct a CSV string from the entries.  Make sure all fields are

    // filled in first.

    f = document.theForm.firstName.value;

    m = document.theForm.middleName.value;

    l = document.theForm.lastName.value;

    a = document.theForm.age.value;

    if (f == "" || m == "" || l == "" || a == "") {

      alert("Please fill in all fields first");

      return false;

    }

    csv = f + "," + m + "," + l + "," + a;

    // Ok, so now we retrieve the response as in all the other examples,

    // except that now we append the CSV onto the URL as a query string,

    // being sure to escape it first.

    retrieveURL("example5Submit.do?csv=" + escape(csv));

  }

 

  function retrieveURL(url) {

    if (window.XMLHttpRequest) { // Non-IE browsers

      req = new XMLHttpRequest();

      req.onreadystatechange = processStateChange;

      try {

        req.open("GET", url, true);

      } catch (e) {

        alert(e);

      }

      req.send(null);

    } else if (window.ActiveXObject) { // IE

      req = new ActiveXObject("Microsoft.XMLHTTP");

      if (req) {

        req.onreadystatechange = processStateChange;

        req.open("GET", url, true);

        req.send();

      }

    }

  }

 

  function processStateChange() {

    if (req.readyState == 4) { // Complete

      if (req.status == 200) { // OK response

        document.getElementById("theResponse").innerHTML = req.responseText;

      } else {

        alert("Problem: " + req.statusText);

      }

    }

  }
 

在这个例子中,我们只是简单地用用户的输入创建了一个以逗号分割的字符串。你当然可以创建一个XML文档然后提交,事实上那是更常见的情况。但是这正是我不想那样做的一部分原因:我想告诉读者你并不一定非要使用XMLHttpRequest对象来传输XML。就本例而言,除了将一个CSV字符串添加到URL之外并没有做任何事情。在网上有不计其数的例子演示了如何创建XML文档并使用XMLHttpRequest.send()方法提交,我强烈推荐你阅读相关文档,当然,如果你使用这种方法的话。

我希望这篇简短的文章和附加的例子可以给你一个好的研究XMLHttpRequest对象的起点。在结束之前我还想说AJAX概念本身并不强制你使用XMLHttpRequest对象,你可以使用其他方法得到相同的效果,比如代替XMLHttpRequest的隐藏frame,这正是我在本文开头提到的在五年前的那个项目中采用的方法。然而,XMLHttpRequest的确使得AJAX概念更容易实现,而且更标准。请参见Google研究这种技术的强大之处。

但是,我提醒所有认为全部的web应用都应该用这种方法开发的人,我不认为这是web开发的不二法门。在某些情况下它是一个好的方案,但在其他情况下不是。如果获得尽可能多的浏览者是你的目标,你最好放弃这种方案。如果一个用户取消了浏览器的脚本解释功能(而你的网站除了这又没有其他出彩的地方),这就不是一个好的情况。还有其他AJAX不适用之处,但是你完全可以把它当成你工具箱中的一个普通工具:它适合某些工作,不适合其他工作。毕竟,你不能指望用一个胶水枪钉钉子吧?

到此为止,我希望本文已经带给了你进一步思考的食粮,尽情享用吧!

示例应用: http://www.omnytex.com/articles/xhrstruts/xhrstruts.zip

本文的英文版本:http://www.omnytex.com/articles/xhrstruts/

本文的PDF版本: http://www.omnytex.com/articles/xhrstruts/xhrstruts.pdf
 

posted @ 2005-11-11 12:03 wyi23 阅读(626) 评论(0) 编辑

2005年11月8日

现在提起AJAX,大家都立刻会想起Gmail、gogle map这几个经典的AJAX应用。Gmail的优良表现我们都看过了,那么它的实现你研究过了吗?它怎么在几个不同的浏览器上可以一致的实现xml异步调用的呢?一起来看看吧。

首先,登录gmail以后我们会先进入这个页面:

<html>
<head>
    
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
    
<title>Gmailtitle>
    
<link rel="alternate" type="application/atom+xml" title="Gmail Atom Feed" href="feed/atom" />
    
<script src="?view=page&name=browser&ver=c0d3d44c64799453">script>
head>
<noscript>
    
<font face=arial>
        应启用 JavaScript,才能在标准视图中使用 Gmail。然而,JavaScript 似乎已被禁用,要么就是您的浏览器不支持 JavaScript。要使用标准视图,请更改您的浏览器选项以启用 JavaScript,然后
<href="">重试a><p>要使用 Gmail 的基本 HTML 视图(不需要 JavaScript),<href="?ui=html&zy=n">请单击此处a>p>
    
font>
noscript>
<script>

script>
html>

这是主框架网页兼浏览器检测页。如果浏览器通过了检测(支持javascript、cookie和xml控件)则在页面上写一段框架代码

要注意到的是google在这里耍了一个小花招,那个叫做main的框架页面里面看来没有多少东西,好东东都在那个叫js的框架里面呢。

我们接着把这个js框架拉出来看看:

整整1500多行的javascript代码!

这个页面有240多k,几乎全都是javascript代码。有兴趣分析的兄弟姐妹们请点这里下载

其实其中大部分都是老生常谈的js代码了,不过我们可以一窥google的编码风格:尽可能压缩信息量,变量名能用一个字母的绝不用两个,函数名一概都是两个字母的,函数内的会车是没有的,缩进也是没有的。虽然代码没有特地加密,但是如此处理一番之后也就没什么可读性了。还好系统的关键字是不能缩水的,顺着xml控件的名字我们可以揪出来跟AJAX异步加载数据相关的几个关键函数:

 

function vb(){var a=null;if(r){var b=fG?"Microsoft.XMLHTTP":"Msxml2.XMLHTTP";try{a=new ActiveXObject(b)}catch(c){q(c);alert("您需要启用活动脚本功能和activeX 控件。")}}else{a=new XMLHttpRequest();if(!a){;alert("此浏览器不支持 XMLHttpRequest。")}}return a}
//emu注释 构造XML控件并返回给调用者

function ot(a,b){;try{a.send(b)}catch(c){q(c);if(c.number==-2146697208){alert("请确保 Internet Explorer 的”语言”设置部分不是空白。")}}}
//emu注释 执行发送数据操作 a:XML控件 b:要发送的数据

function Wf(a,b,c){Da(3);b=Ld(b);Hf(a,b,c)}
//emu注释 a:XML控件 b:访问的url c:回调函数 Da是验证参数长度的函数 
//
Ld是一个url转换加工的函数,主要处理url自带的CGI参数和翻页的页数等

function Hf(a,b,c){Da(3);a.onreadystatechange=c;a.open("GET",b,true);ot(a,null)}
//emu注释 不发送数据直接请求资源 a:XML控件 b:访问的url c:回调函数

function nt(a,b,c,d){Da(4);a.onreadystatechange=d;a.open("POST",b,true);ot(a,c)}
//emu注释 发送数据并请求资源 a:XML控件 b:访问的url c:要发送的数据 d:回调函数

 

基本上就这么多了,很失望吧,没有什么新鲜的东西。发送http请求之后它又怎么处理返回的xml的呢?事实上他没有处理。他所处理的仅仅是最基本responseText,而cgi则直接生成js脚本到客户端回调(用eval运行),或者生成文本信息。这就是为什么gmail可以轻松跨域几个浏览器了。

作为最受推崇的一个AJAX应用,却几乎没有用到xml。像这样用xml控件来收发文本信息后在页面上展现的技术,基本上就是现在AJAX最流行的应用方式了,不过这样也能叫AJAX吗?我宁可就叫它AJ,最多叫AJAH。

今天先到这,下回再过来分析另一个完全不同的AJAX应用吧。大家周末愉快!

posted @ 2005-11-08 16:12 wyi23 阅读(279) 评论(1) 编辑

2005年11月4日

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),由JotSpotAlex 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支持,正在开发基础架构等特性。
  • 基础结构特性:
    • 能轻易的捕获和操纵DOM事件
    • 支持调试
    • 支持一个时间操作的Timer类
    • Getter/Setter支持
  • UI:
    • 窗口组件库和框架
    • 界面布局管理
    • 图像缓存和透明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支持较强

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数据
  • 使用<servlet>和<filter>灵活的在web.xml中进行配置,并且可以集成(不是必须)到你的Spring框架中
  • 提供了几个可帮助你快速开发web应用程序的组件(如自动完成的文本框,在线表单,在线列表等等)

4.5 AJAX JSP Tag Library

The AJAX JSP Tag Library 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.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脚本。
  • 支持服务器端调用。
  • 队列支持
  • 开源许可

posted @ 2005-11-04 10:47 wyi23 阅读(283) 评论(0) 编辑

 

posted @ 2005-11-04 10:33 wyi23 阅读(309) 评论(0) 编辑

2005年11月3日

摘要: 创建日期:2005年04月04日最后修改:2005年04月05日创建人:Amour GUO(Waymangood)一、使用Ajax的主要原因  1、通过适当的Ajax应用达到更好的用户体验;  2、把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的。二、引用Ajax这个概念的最早提出者Jesse James...阅读全文

posted @ 2005-11-03 16:42 wyi23 阅读(789) 评论(2) 编辑

2005年10月28日

摘要: 转自博哥之家http://www.blogcn.com/user30/libociom/blog/25415967.html笔试题注:请选择自己了解的问题回答,有些问题如果认为手写回答比较困难,但是可以说清楚,可以做一个标记,当面回答问题就可。.NET基础1. 什么是装箱和拆箱?2. 什么是重载?3. 值类型和引用类型的区别?4. 如何理解委托?5. 了解程序集强签名吗?6. C#种接口和类有什么...阅读全文

posted @ 2005-10-28 17:23 wyi23 阅读(1496) 评论(0) 编辑

摘要: Ajax并不是一种技术。它实际上是几种已经在各自领域大行其道技术的强强结合。Ajax混合了:* 基于XHTML/CSS* 由DOM(Document Object Model)实现动态显示与交互* 通过XML和XSLT进行数据交换及处理* 使用JavaScript整合上述技术原文参见Ajax: a New Approach to Web Applications直观一点的说Ajax能够实现不刷新浏...阅读全文

posted @ 2005-10-28 17:21 wyi23 阅读(197) 评论(0) 编辑