<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>He is Handy</title>
    <description>刚进入社会的fresher, 一切从头开始.</description>
    <link>http://handy.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>zt AJAX支持的 GOOGLE 地图 MASHUP 教程</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/112022" style="color:red;">http://handy.javaeye.com/blog/112022</a>&nbsp;
          发表时间: 2007年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="h1b">AJAX支持的 GOOGLE 地图 MASHUP 教程</span><br />
<br />
<table cellspacing="0" border="0" height="86" cellpadding="0" width="654">
    <tbody>
        <tr>
            <td height="64">时间：2007-06-12<br />
            作者：<a href="http://dev2dev.bea.com.cn/author/292341.html">Peter Laird</a><br />
            浏览次数：             <script language="JavaScript" src="http://dev2dev.bea.com.cn/beadevcount.jsp?d_id=813556" type="text/JavaScript"></script>             <br />
            本文关键字：<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=google">google</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=mashups">mashups</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=ajax">ajax</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=json">json</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=javascript">javascript</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=web%202.0">web 2.0</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Dev%20Toolbox">Dev Toolbox</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Web%20Services">Web Services</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=WebLogic%20Server">WebLogic Server</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Peter%20Laird">Peter Laird</a>,&nbsp;<a href="http://dev2dev.bea.com.cn/products/search.jsp?searchtype=keywords&amp;keywords=Web%E6%9C%8D%E5%8A%A1">Web服务</a></td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<!-- 提取技术文章 -->
<div class="beas"><img src="http://dev2dev.bea.com.cn/images/dot6B6B6B.gif" height="1" alt="" width="100%" /></div>
<p>　　编辑注：本教程是 <a href="http://dev2dev.bea.com.cn/minisite/techdays/">Dev2Dev TechDays 2007</a>的附赠品，<a href="http://dev2dev.bea.com.cn/minisite/techdays/">Dev2Dev TechDays 2007</a>今年的主题是&ldquo;构建企业Mashup&rdquo;。这次研讨会的议题是如何在企业内部有效地使用mashup，会上详细讨论了本教程阐述的技术。在世界各地都举办了此次研讨会，查看 <a href="http://dev2dev.bea.com.cn/minisite/techdays/">TechDays Web站点</a>，了解在您附近的城市何时会举办此次研讨会。</p>
<h3>摘要</h3>
<p>　　Web 开发的新纪元达到了顶峰，这一阶段称为 <a href="http://www.oreillynet.com/pub/a/oreilly/tim/news/2005/09/30/what-is-web-20.html" target="_blank">Web 2.0</a>。 这一时期迎来了新一批原型化Web 应用程序，包括blog、wiki和mashup。 Mashup是本教程论述的重点，您将了解到如何使用一组通用技术构建一个示例 mashup 。这组技术包括 JavaScript、Ajax、REST、JSON 和Google地图API。 作为 Web 开发人员，了解如何结合使用这些工具很重要。在本教程中，我将使用这些工具轻松构建终极的 Hello World mashup：一个Google地图mashup。</p>
<h3>简介</h3>
<p>　　所谓Mashup，就是在将一些数据源和服务组合到一起创建一种新功能或以某种方式添加新值的时候创建的。本教程将介绍如何创建一个Google地图mashup &mdash;&mdash; 将 <a href="http://maps.google.com/" target="_blank">Google 地图</a>提供的地图数据与您自己创建的方位数据服务相结合。</p>
<p>　　本教程分为三部分：</p>
<ul>
    <li>Web 2.0工具箱</li>
    <li>从一个REST  数据服务检索方位</li>
    <li>用  Google 地图标绘地址</li>
</ul>
<p>　　第一部分介绍了我在第二部分和第三部分构建 mashup 时所用的技术。如果想提前浏览我制作的 demo，请浏览Web上托管的 <a href="http://ajaxmashup.googlepages.com/ajaxGoogleMapsMashup.html" target="_blank">演示</a>。</p>
<p dragover="true">　　让我们开始吧！</p>
<h3>Web 2.0 工具箱</h3>
<p>　　Web 开发人员很清楚技术总是在不断地进步，技能在几年之内就会变得过时。我对此并无异议：创新使得 Web 开发变得有趣。新主张、新工具和新技术让我们能够在更短的时间内构建更出色的系统。本节将介绍一些您可能用过也可能没有用过的技术。如果这些对于您来说是 新技术，可以将本小节的内容看作快速入门，在此之后，我鼓励您继续深入学习。下文所述内容并不完整，在某些方面过于简略，这样做是为了传达重要的概念。</p>
<p>　　虽然我要讨论多种技术，但是本教程也需要从头说起。我假定您熟悉以下概念和Web 技术：</p>
<ul>
    <li>HTML</li>
    <li>XML</li>
    <li>浏览器和 Web 服务器的角色</li>
    <li>HTTP 请求/响应模型</li>
    <li>现代编程语言，例如Java、JavaScript、PHP 和 C#</li>
</ul>
<h3>客户端编程</h3>
<p>　　Web 2.0 应用程序的特征是高度的交互性&mdash;&mdash;它像传统桌面应用程序那样进行响应。传统 Web 应用程序一成不变的外观和刷新整个页面的长时间中断都无法满足这一期望。 因此，Web 2.0 应用程序利用了客户端编程技术来帮助应用程序获得更快的响应速度。两种最流行的客户端技术是 JavaScript 和 Adobe Flex。 这两种技术都具备令人叹服的特性，在应用上都取得了巨大的成功。然而，为了缩小本教程的讨论范围，在构建 mashup 的时候，我仅考虑JavaScript 方法。</p>
<p>　　<strong>JavaScript</strong> 技术成熟。它是一种强大的客户端编程语言，已经流行数年。随着标准的不断改进，跨浏览器支持显著进步，使得它成为一种可行的方法。对于那些没有接触过这门语言的人来说，会发现它的基本代码构造和其他主流语言（例如 Java）类似。</p>
<p>　　JavaScript包含一种功能强大的事件机制，使得 JavaScript 能够响应浏览器中的用户交互。我将使用事件响应功能来构建下文的mashup。学习HTML的人已经见过以事件的形式表现的JavaScript 事件响应机制，例如下面代码中的 onclick 属性：</p>
<pre class="code">&nbsp;</pre>
<p>　　JavaScript 在浏览器中执行时的另一个重要功能就是能够操纵 HTML 文档对象模型（HTML  Document Object Model，DOM）。该功能允许 JavaScript 代码在 HTML 页面加载后以编程方式改变页面内容。<strong>DOM 操纵</strong>是提高Web  2.0 应用程序交互性时使用的重要功能。在 Web  应用程序中，重置 HTML 中一个元素所包含的文本很常见，例如：</p>
<pre class="code">// find the <div> tag with id 'greet_div'<br />var div = document.getElementById('greet_div');<br />div.innerHTML = 'Hello ' + name;<br /></div></pre>
<p>　　最后，还需提到的JavaScript 功能就是向后端服务器发出带外 HTTP 请求。通过此功能， JavaScript 可以发出不会导致页面重载或改变浏览器地址栏的请求。该功能通常被称为Ajax，但是实现该功能的实际上是XMLHttpRequest，它是调用 HTTP 请求的JavaScript 类。HTTP 请求通常是异步的，这要求编程人员定义一个回调函数，在接收响应时调用。</p>
<pre class="code">var request = new XMLHttpRequest();<br />function invokeAjax() { <br />        request.open(&quot;GET&quot;, 'ajaxTarget.html', true);<br />        request.onreadystatechange = ajaxCallback;<br />        request.send(null);     <br />} <br /><br />function ajaxCallback() {<br />  // check if response is complete, then do stuff       <br />}<br /></pre>
<p>　　我先讨论在mashup  应用程序中使用到的 XMLHttpRequest 功能的一个主要限制，然后才能讨论该功能。</p>
<p>　　为了保护用户免受恶意代码编写者的攻击，所有浏览器都实现了一个安全功能。<a href="http://en.wikipedia.org/wiki/Same_origin_policy">Same Origin Policy</a> 防止XMLHttpRequest以返回页面的服务器所在的网络域之外的服务器为目标发送请求。例如，如果用户浏览 <a href="http://www.bea.com/ajaxPage.html">http://www.bea.com/ajaxPage.html</a>，该页面上的 JavaScript 代码则不能将XMLHttpRequest  到 <a href="http://www.evil.com/stealCookies.html">http://www.evil.com/stealCookies.html</a>。 虽然该安全功能能够保护用户，但是它限制了 JavaScript ?客户端程序在mashup 应用程序中的作用，mashup 应用程序需要使用来自多个域的服务。然而，两种资源类型不受这一策略的限制：页面可以跨域下载图片和脚本。通过JavaScript 将参数追加到这些资源请求中，一些实现解决了这一限制。</p>
<p>　　有关 Ajax 和 XMLHttpRequest 的更多信息，请参阅 <a href="http://dev2dev.bea.com.cn/techdoc/2005110103.html">Ajax简介</a>（Dev2Dev中文版，2005）。</p>
<h3>轻量级服务</h3>
<p>　　调用远程服务的功能是企业分布式架构的基础，例如面向服务的架构（Service Oriented Architecture ，SOA）。Web 服务技术（例如 SOAP）被广泛应用于创建企业内的可重用服务。这些实现效果很好，但是在一些情况下SOAP 未免有些大材小用。特别在客户端是浏览器时，需要一个轻量级的解决方案。</p>
<p>　　一种构建称为 REST 的轻量级服务的方法开始流行，在Web 2.0 应用程序中这种方法应用得尤为普遍。 REST 提供了一种构建 HTTP 可寻址服务的干净模型，从浏览器可以很容易地调用该服务。对于REST 的完整学术定义不适合本教程，我总结了几个要点：</p>
<ul>
    <li>REST 服务表示为一个URL，通过基本的 HTTP 请求访问，例如<a href="http://bea.com/content/getArticles?author=joe" target="_blank">http://bea.com/content/getArticles?author=joe</a>。</li>
    <li>HTTP 动词很重要： GET 是读操作， POST 是创建，PUT 更新服务。</li>
    <li>返回的有效负载通常是XML 或 JSON。</li>
</ul>
<p>　　将 REST 的含义解释得更清楚可将会引起争议，因此以上概括已经足够。</p>
<p>　　还需要进一步解释最后一个要点。以上列出了两种流行格式作为返回的有效负载：XML 和 JSON 。似乎可以选择 XML，它在全世界应用广泛。而 REST 服务可以返回XML，客户端 JavaScript 代码需要遍历返回的 XML 的DOM ，来提取所需信息。这当然可以，但是对于浏览器中的客户端程序是JavaScript 的情况来说，还可以选择另一种格式。<strong>JavaScript 对象标志</strong>（<strong>JavaScript  Object Notation</strong> ，JSON）是一种 JavaScript 对象序列化格式，它减少了客户端的工作。客户端可以通过调用将返回的JSON 文本反序列化成一个本机 JavaScript 对象，然后可以使用JavaScript 语法操纵JavaScript 对象。这通常是个简单的方法，因此对于 Web 2.0 应用程序使用的 REST 服务来说，JSON 很流行。</p>
<p>　　下面是一个序列化格式的 JSON 对象示例：</p>
<pre class="code">{&quot;location&quot;:    <br />        {&quot;id&quot;:  &quot;WashingtonDC&quot;,                 <br />         &quot;city&quot;: &quot;Washington DC&quot;,                       <br />         &quot;venue&quot;: &quot;Hilton Hotel, Tysons Corner&quot;,<br />         &quot;address&quot;: &quot;7920 Jones Branch Drive&quot;<br />        }<br />}<br /></pre>
<p>　　有关JSON的详细描述，请参见 <a href="http://dev2dev.bea.com.cn/techdoc/2007/03/java-soa-introduction-json.html">JSON简介</a>（Dev2Dev中文版， 2007）。</p>
<h3>Google 地图 API</h3>
<p>　　Google地图和 Yahoo!地图（我们不会进一步讨论Yahoo!）均创建了可公开访问的JavaScript API，用于免费将地图嵌入随机的Web 站点。这形成了小规模的mashup Web 应用程序集，它们使用这些API来标绘地理位置，从芝加哥的 <a href="http://www.chicagocrime.org/" target="_blank">犯罪地点</a>到全世界的<a href="http://www.81nassau.com/apnews/" target="_blank">AP 新闻发生地</a>。 这种流行的模式是查询针对一组地址的服务，然后使用Google Map API映射这些地址，这也是我构建mashup所使用的方法。您会看到，这种实现方法简单直白，但是有两件事需要注意。</p>
<p>　　首先，浏览器的跨域安全功能似乎不利于用JavaScript 在浏览器中实现Google 地图 mashup。这是由于用户必须导航到托管REST 服务的网络域，该服务会生成一个地址列表。在该网络域中，将不允许浏览器请求http://maps.google.com 。Google 在其JavaScript 库中实现了一种解决方案，重载对于google.com 脚本的资源请求，以便将数据注入到浏览器中。</p>
<p>　　第二件事不是技术问题，而是商业问题。Google 拥有映射数据和API ，保留定义 <a href="http://www.google.com/apis/maps/terms.html" target="_blank">服务条款的权利</a>，Google 限制每个Web 站点的免费服务为每天50,000 请求。如果这是个问题，那么 <a href="http://www.google.com/enterprise/maps/" target="_blank">付费服务</a> 是没有限制的。为了实施这种使用策略，每个Web 站点都有一个惟一的API密钥，必须将其配置为可追踪站点的使用情况。获得该密钥是<a href="http://www.google.com/apis/maps/signup.html" target="_blank">免费的，而且简单容易</a>， 然后在HTML 页面的脚本源块中可以对它进行配置，如下所示（为简洁起见，截断了密钥）：</p>
<pre class="code"><script <br />  src="http://maps.google.com/maps?key=ABQIAAAAT"<br />  type="text/javascript"><br /><br /></pre>
<h3>从 REST 数据服务检索地理位置</h3>
<p>　　既然已经具备了开发所用的工具箱，那么就该开始实现Ajax 支持的Google 地图mashup 了。本节将逐步介绍如何构造一个REST 服务，该服务通过地址指示位置。在下一小节中，我们将把REST 服务连接到Google 地图来创建mashup。</p>
<p>　　关于 REST 服务，要说的第一点是它很简单。本教程的内容和演示可以作为构建更复杂的mashup 的起点。因此，其中的 Hello World mashup 尽可能简单而去掉复杂性。为此， REST 服务是一个静态服务：位置是硬编码到HTML 页面中的。尽管这看似不灵活，但用一个动态服务很容易就可以代替整个方法。精通JSP、PHP或 Ruby on Rails 的开发人员可以用从数据库、Web 服务或其他技术中寻找方法来代替静态的HTML 服务。</p>
<p>　　REST 服务是在示例的getD2DSites.html 中实现的。请看一下这个文件，您会发现它只是JSON 格式的地址对象的序列化JavaScript 数组：</p>
<pre class="code">{&quot;locations&quot;:   <br />{&quot;location&quot;:[           <br />        {&quot;id&quot;:  &quot;WashingtonDC&quot;,                 <br />         &quot;city&quot;: &quot;Washington DC&quot;,                       <br />         &quot;location&quot;: &quot;Hilton Hotel, Tysons Corner&quot;,<br />         &quot;address&quot;: &quot;7920 Jones Branch Drive&quot;,<br />         &quot;date&quot;: &quot;May 2nd, 2007&quot;                <br />        },<br />        {&quot;id&quot;:  &quot;NYC&quot;,                  <br />         &quot;city&quot;: &quot;New York City&quot;,                       <br />         &quot;location&quot;: &quot;Grand Hyatt New York&quot;,<br />         &quot;address&quot;: &quot;109 East 42nd Street, NY 10017&quot;,<br />         &quot;date&quot;: &quot;May 3rd, 2007&quot;                <br />        },<br />        etc...<br /></pre>
<p>　　客户端将使用XMLHttpRequest 从REST服务检索JSON 对象。一旦检索到该对象，JavaScript 代码将需要反序列化对象，然后遍历整个数组。看一下mapper.js，就可以看到 getLocationsAndMap 和 getLocationsAndMapCallback 函数完成了这一功能：</p>
<pre class="code">// Gets the current locations from the REST service<br />// on the server and writes out the HTML that <br />// contains links for the map<br /><br />function getLocationsAndMap() { <br /> if (receiveReq.readyState == 4 || <br />     receiveReq.readyState == 0) <br /> {      <br />   // getD2DSites.html is a REST service<br />   // that returns the list of locations <br />   // as JSON<br />  <br />   receiveReq.open(&quot;GET&quot;, 'getD2DSites.html',<br />                   true);               <br />   receiveReq.onreadystatechange = <br />               getLocationsAndMapCallback;      <br />   receiveReq.send(null);       <br /> } // end  if   <br />} // end  function<br /><br />function getLocationsAndMapCallback() {<br /> // state == 4 is when the response is complete<br /> if (receiveReq.readyState == 4) {              <br />  // Deserialize the JSON response (eval() command)<br />  // This creates an array of location objects. <br />  var response = eval(&quot;(&quot;+request.responseText+&quot;)&quot;);<br />  // generate HTML listing the locations and update  <br />  //   the page DOM so the user will see the HTML<br />  var div = document.getElementById('loc_div');         <br />  div.innerHTML = '<p>Received ' + <br />   response.locations.location.length+' results.';<br /> <br />  for(i=0;i &lt; response.locations.location.length; i++) {<br />        var city = response.locations.location[i].city;<br />        var anchor = ''; // TODO: we will fix this later<br />        div.innerHTML += '</p><p><strong>'+ city + '</strong> ' + <br />          anchor + loc + '<br />' + addr + '</p>';<br />  } // end  for loop<br /> } // end   if (state == 4)<br />} // end   function<br /></pre>
<p>　　请注意， eval 调用将接收JSON 并对它进行计算，有效地构建一个可以导航的JavaScript数组。For 循环显示了如何在数组内遍历地理位置：</p>
<p>　　至此，您已经完成了这些工作：</p>
<ul>
    <li>创建一个静态的  REST 服务 HTML 文件</li>
    <li>向HTML文件添加一个JSON 有效负载</li>
    <li>编写代码通过eval()将JSON  重构为一个JavaScript 对象</li>
    <li>编写代码来循环遍历地址数组，使用新的HTML操纵DOM</li>
</ul>
<p>　　现在，让我们来看如何在Google  地图中显示这些位置。</p>
<p>　　<strong>使用 REST 和Google 地图 API 来组装Mashup</strong></p>
<p>　　实现REST  服务后，就可以开始构建mashup了。图１显示了mashup 的完整格式。用户可以单击按钮来获取位置，然后单击纽约的链接。请注意Google  地图是如何以街道地址位置为中心进行显示的。</p>
<p align="center"><a href="http://dev2dev.bea.com/images/2007/05/ajaxMashup_large.png"><img src="http://dev2dev.bea.com.cn/images/image070612001.jpg" border="0" height="262" alt="Ajax支持的 Google 地图 Mashup 教程 图-1" width="450" /></a></p>
<p>　　图 1. mashup应用程序实例</p>
<p>　　图 2 显示的是运行ajaxmashup.googlepages.com 时本教程的演示的架构。</p>
<p align="center"><img src="http://dev2dev.bea.com.cn/images/image070612002.jpg" border="0" height="305" alt="Ajax支持的 Google 地图 Mashup 教程 图-2" width="450" /></p>
<p>　　图 2.演示程序的架构</p>
<p>　　第一步是定义ajaxGoogleMashup.html  mashup 页面的结构。您需要三个主要结构元素：</p>
<ul>
    <li>允许用户调用您以上构建的REST  服务的按钮</li>
    <li>保存REST  服务的占位符div 标记</li>
    <li>地图的占位符div 标记</li>
</ul>
<p>　　查看下面的  HTML 片断来了解这一结构：</p>
<pre class="code"><br /><br /><br /><br /><br /><table><tbody><tr><td valign="top"><br />    <div id="google_map_div"><br />           style=&quot;width: 500px; height: 300px&quot;&gt;<br />    </div><br /></td><td valign="top"><br /><p id="getLocations_div" align="center"><br />        &lt;&gt;<br />        </p><form id="getLocationsForm"><br />        <input value="Get the Locations" /><br />           type=&quot;submit&quot; <br />          onclick=&quot;javascript:getLocationsAndMap();return false&quot;<br />        /&gt;<br />        </form><br /><p>&nbsp;</p><br /><p><br />  </p><div id="locations_div"><br />  &lt;&gt;<br />  </div><br /><p>&nbsp;</p><br /></td></tr></tbody></table><br /></pre>
<p>　　请注意，当用户按下按钮时，将触发一个onclick 事件。该事件连接到了前述getLocationsAndMap() 函数，该函数将调用针对REST 服务的XMLHttpRequest。您已经看到，getLocationsAndMapCallback() 函数之后会将服务响应从JSON 文本转换为注入到DOM 的HTML。</p>
<p>　　现在，您需要将地址组合到Google 地图中。首先，getLocationsAndMapCallback() 中的JavaScript 代码会编写HTML ，因此每个地址都会有一个调用JavaScript 函数的锚定标记。函数showAddress()和代码会传递所点击的位置地址。以上代码中getLocationsAndMapCallback()函 数的 TODO注释替换为这行代码：</p>
<pre class="code">var anchor = '<a href="irrelevant"><br />   onclick=&quot;javascript:showAddress(\''+<br />      response.locations.location[i].address+'\');'+<br />      ' return false&quot;&gt;';<br /></a></pre>
<p><a href="irrelevant">　　这会为每个地址创建一个锚定标记，单击地址时就会触发showAddress() 函数。</a></p>
<p><a href="irrelevant">　　下一步，showAddress() 函数会连接到Google 地图 API，由它真正在地图中显示传递过来的地址。这是通过Google 提供的样板代码来完成的。请注意以下代码中的GMap2 和 geocoder 对象，它们都是作为Google地图API的一部分提供的。该代码将检索地图，然后更新HTML 文档的google_map_div div 标记。</a></p>
<pre class="code"><a href="irrelevant">function showAddress(address) {  <br />        var map = new GMap2(<br />           document.getElementById(&quot;google_map_div&quot;));<br />        var geocoder = new GClientGeocoder();<br />        geocoder.getLatLng(address,    <br />                function(point) {      <br />                  if (!point) {        <br />                    alert(address + &quot; not found&quot;);      <br />                  } else {        <br />                    map.setCenter(point, 13);        <br />                    var marker = new GMarker(point);        <br />                    map.addOverlay(marker);        <br />                    marker.openInfoWindowHtml(address);<br />                  }    <br />            }  <br />    );<br />}<br /></a></pre>
<p><a href="irrelevant">　　无论您相信与否，这样就完成了Ajax支持的Google 地图 mashup！在本教程中我还没有展示完整的文件，我展示的是重要部分。查看下载一节，获取完整代码。</a></p>
<h3><a href="irrelevant">Google 地图 Mashup预览</a></h3>
<p><a href="irrelevant">　　在此，直接运行示例代码将帮助您将所有的代码片断连接到一起。为了指导您如何使用代码，下面的列表突出了上文提到的重要代码片断，以及它们之间如何协作。</a></p>
<ul> <a href="irrelevant">    </a>
    <li><a href="irrelevant">用户向浏览器请求ajaxGoogleMapsMashup.html，其结构如下 ：</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">单击时调用getLocationsAndMap() 函数的 HTML 按钮</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">id 为locations_div的空div 标记，地址将在此插入</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">id 为google_map_div 的空 div 标记，Google 地图将被插入</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">用户单击按钮， getLocationsAndMap() 向REST 服务（getD2DSites.html）发出一个XMLHttpRequest 。</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">REST 服务以JSON文本返回一个地址列表，该列表会在getLocationsAndMapCallback()中进行反序列化。</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">getLocationsAndMapCallback()为在返回列表中查找到的每个地址插入 HTML，其中包含一个锚定标记。</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">用户单击一个地址的锚定标记，将触发对showAddress() 的调用，并传递位置的街道地址。</a></li>
    <a href="irrelevant">    </a>
    <li><a href="irrelevant">showAddress() 从Google API调用 JavaScript 代码，它将正确的地图注入到google_map_div 元素中。</a></li>
</ul>
<h3><a href="irrelevant">下载</a></h3>
<p><a href="irrelevant">　　可以下载本文介绍的代码：</a></p>
<p><a href="irrelevant">　　</a><a href="http://dev2dev.bea.com.cn/techdoc/2007/06/dev2devMashupDeveleporDemo-070612.zip" target="_blank">dev2devMashupDeveleporDemo.zip</a> &mdash;&mdash; 代码，包含安装说明</p>
<h3>结束语</h3>
<p>　　如您所见，我将HTML、JavaScript、XMLHttpRequest、Google API和 JSON 组合在一起，创建了一个Hello World mashup 的实例。第一次这样使用这些技术，您可能会感到难以理解，但是会很快对于这些技术的组合感到满意。Web 2.0 是Web 应用程序开发的主流趋势，这种创建mashup的模式可以成功在Web 2.0项目中应用。</p>
<h3>参考资料</h3>
<ul>
    <li><a href="http://dev2dev.bea.com.cn/minisite/techdays/">Dev2Dev TechDays 2007</a>，以&ldquo;构建企业Mashup&rdquo;为主题的一系列研讨会</li>
    <li><a href="http://dev2dev.bea.com.cn/techdoc/2005110103.html">Ajax简介</a>，David  Teare（Dev2Dev中文版，2005）</li>
    <li><a href="http://dev2dev.bea.com.cn/techdoc/2007/03/java-soa-introduction-json.html">JSON简介，</a>Daniel  Rubio 提供了有关JSON 的出色介绍（Dev2Dev中文版， 2007）</li>
    <li><a href="http://ajaxmashup.googlepages.com/ajaxGoogleMapsMashup.html" target="_blank">在线保存 demo</a> &mdash;&mdash; 展示了本教程涉及的示例</li>
    <li><a href="http://www.google.com/apis/maps/" target="_blank">Google  地图 API 文档</a> &mdash;&mdash; Google 地图功能的主要介绍</li>
</ul>
<p><strong>原文出处:</strong><a href="http://dev2dev.bea.com/pub/a/2007/05/google-mashups.html" target="_blank">http://dev2dev.bea.com/pub/a/2007/05/google-mashups.html</a></p>
<!--文章其他信息-->
<div class="dot001"><img src="http://dev2dev.bea.com.cn/images/_.gif" height="1" alt="" width="100%" /></div>
<table cellspacing="0" border="0" cellpadding="3" width="100%">
    <tbody>
        <tr valign="bottom">
            <td height="20" colspan="2">&nbsp;<span class="h2b">作者简介</span></td>
        </tr>
        <tr>
            <td align="center" valign="top" width="0">&nbsp;</td>
            <td><a href="http://dev2dev.bea.com/pub/au/3439" target="_blank">Peter Laird</a> 是WebLogic Portal产品的架构管理师。</td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/112022#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 14 Aug 2007 09:06:00 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/112022</link>
        <guid>http://handy.javaeye.com/blog/112022</guid>
      </item>
      <item>
        <title>郑州 第二故乡</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/110494" style="color:red;">http://handy.javaeye.com/blog/110494</a>&nbsp;
          发表时间: 2007年08月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          老婆，我来了.
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/110494#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 09 Aug 2007 11:06:43 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/110494</link>
        <guid>http://handy.javaeye.com/blog/110494</guid>
      </item>
      <item>
        <title>利用firefox查看校内网的信件</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109110" style="color:red;">http://handy.javaeye.com/blog/109110</a>&nbsp;
          发表时间: 2007年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 用FIrefox用了块半年,越来越喜欢这个浏览器了,太多自己可以定制的东东,其中的开发工具插件 firebug更是让我爱不释手,对web2.0开发来说,真是利器. <br />
&nbsp;&nbsp; 作为一个刚毕业的学生,我还是比较喜欢校内网这个平台的,它的实名制,它的速度,以及自己的好多同学都在上边,甚至包括初中,小学同学,都有可能找到.,校内网的站内信件服务好是好,就是不能自动提示,当有新信件的时候,很多人都没有注意到.有时候想看有没有信件,必须手动刷新页面.当忙别的工作的时候,也会很长时间不去查看,很不方便. <br />
<br />
今天我写了个脚本 . 利用GreaseMonkey(firefox下一脚本管理插件), 新建一段脚本,<br />
<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="comment">//&nbsp;==UserScript==</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;@name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetInfo</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;@namespace&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Xiaonei</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span><span class="comment">//&nbsp;@include&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.xiaonei.com/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span><span class="comment">//&nbsp;==/UserScript==</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;I&nbsp;=&nbsp;document.getElementById(</span><span class="string">&quot;gossipReplyFeedDiv&quot;</span><span>);</span><span class="comment">//获取页面中gossipReplyFeedDiv容器</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">var</span><span>&nbsp;M&nbsp;=&nbsp;document.getElementById(</span><span class="string">&quot;mymessage&quot;</span><span>);</span><span class="comment">//获取页面中mymessage容器</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(M.firstChild.innerHTML.length&gt;4)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;You&nbsp;have&nbsp;a&nbsp;new&nbsp;Message&quot;</span><span>);&nbsp;</span><span class="comment">//收到新信件</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(I.style.display&nbsp;!=&nbsp;</span><span class="string">&quot;&quot;</span><span>)&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(<span class="string">&quot;You&nbsp;have&nbsp;a&nbsp;new&nbsp;Reply&quot;</span><span>);</span><span class="comment">//收到新回复</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}<span class="keyword">else</span><span>{&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setTimeout(Refresh,30000);&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;Refresh(){&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;self.location.reload()&nbsp;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<br />
将脚本应用到 http://xiaonei.com/,打开这个页面就OK了, 不用去管它,它会每隔半分钟自动刷新一次,当有新信件到达的时候,会自动弹出警示框,告知你 有新邮件到达,原理很简单.<br />
<br />
这个思路同样可以针对其它站点. 这篇只算抛砖引玉.
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109110#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Aug 2007 10:54:43 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109110</link>
        <guid>http://handy.javaeye.com/blog/109110</guid>
      </item>
      <item>
        <title>一个男生的求爱简历（转载）</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109108" style="color:red;">http://handy.javaeye.com/blog/109108</a>&nbsp;
          发表时间: 2007年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在javaeye上发表小生处女帖, 呵呵,大家一起学java, 本人对java一直没有很深的了解,<br />
<br />
刚转java.以后要努力了.<br />
<font color="#153702"><br />
一个男生的求爱简历<br />
<br />
我是某大学学生，条件优越是我认识女孩子的先决，所以特地呈上简历希望有意MM可以做本人女友！！！<br />
<br />
以下是本人优点：<br />
<br />
十分坚强：被女孩子海甩了45次，还活着。<br />
<br />
人也很好：45个女孩子中的36个女孩子和我说的最后一句话就是&ldquo;你人真的很好&rdquo;。<br />
<br />
喜欢干净：天涯何处无芳草，不能天天不洗澡！脱衣服喽&hellip;&hellip;<br />
<br />
爱护动物：所以家里的&ldquo;小强&rdquo;（蟑螂）成群。<br />
<br />
待人热情：男女不问，老少皆宜！<br />
<br />
做事果断：买东西后立刻付账！饿了马上就吃饭。<br />
<br />
见义勇为：曾帮过几位MM拉上过后拉链。<br />
<br />
节约用水：便后不洗手。<br />
<br />
视金钱为父母：我爱我的父母。<br />
<br />
不会落井下石：用了很多方法也没有将我的朋友从井里面救出来，他说想见他女朋友最后一面，我二话没说就把他女朋友扔下去了。<br />
<br />
有同情心：我策划了一个让朋友失恋的计划，好让他跟我有同样的心情，这就是同情心！！<br />
<br />
我很阳光：所以黑得跟炭似的。<br />
<br />
对人包容：我有点近视。<br />
<br />
很浪漫：玫瑰，红酒，小提琴手，蜡烛，还有一包康师傅。<br />
<br />
领悟力强：在被甩的经历中，有个女孩子把我拉到郊外，将我送她的玫瑰花，慢慢地插在了一坨牛粪上，我立刻就明白了，没等我说我不会嫌弃你的这句话的时候，她就走了！<br />
<br />
坚韧不拔：在茶座里和朋友海侃了6个小时之后，朋友终于去付账了！ </font>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109108#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 05 Aug 2007 10:33:00 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109108</link>
        <guid>http://handy.javaeye.com/blog/109108</guid>
      </item>
      <item>
        <title>...</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109098" style="color:red;">http://handy.javaeye.com/blog/109098</a>&nbsp;
          发表时间: 2007年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转弯.<br />  有点恍惚.哪是我的去处?<br />  没有方向,没有终点.<br />  <br />  向左走,向右走.<br />  光良的歌.<br />  只是该向哪走?<br />  没有人告诉我.<br />  因为,一个人走.
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109098#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 01 Aug 2007 01:22:41 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109098</link>
        <guid>http://handy.javaeye.com/blog/109098</guid>
      </item>
      <item>
        <title>两三年过去了</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109099" style="color:red;">http://handy.javaeye.com/blog/109099</a>&nbsp;
          发表时间: 2007年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转眼已07年了,我也由一个大学生变成了社会人,翻着自己以前写的东西,真是惭愧.把几年前在blogcn上的帖子也导了来,百度的空间我登录不上,没办法,公司封443了
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109099#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 31 Jul 2007 11:39:42 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109099</link>
        <guid>http://handy.javaeye.com/blog/109099</guid>
      </item>
      <item>
        <title>毕业了 毕业了</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109083" style="color:red;">http://handy.javaeye.com/blog/109083</a>&nbsp;
          发表时间: 2007年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>轮到我们了。。。</p>
<p><img small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/3ccf9525be49e66634a80fd4.jpg" border="0" /></p>
<p> </p>
<div forimg="1"><img small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/78f3711ee944b4f21bd576f3.jpg" border="0" />
<div forimg="1">
</div> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%D0%A1%BC%C7">小记</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/57e5bf1c9a00b98987d6b651.html#comment">查看评论</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109083#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 23 Jun 2007 01:53:23 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109083</link>
        <guid>http://handy.javaeye.com/blog/109083</guid>
      </item>
      <item>
        <title>好用的UML工具</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109084" style="color:red;">http://handy.javaeye.com/blog/109084</a>&nbsp;
          发表时间: 2007年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天在网上发现一个好东东,不错的uml工具,Trufun Plato/Kant 2007</p>
<p>中文的.支持Java,c++,.net,基于eclipse平台,设计UML十分方便,支持模型-代码互相转换.</p>
<p>下载下来,里面自带了一个example,图书馆管理系统, 不过我的uml基本算是菜鸟一级,以后要多练练,</p>
<p>明天准备买火车票 去南方找工作去,无锡的有家公司让去签约,先去看看,不过说实话 我并不想签,我想去上海,听说房租挺贵的,不过咱毕竟是刚毕业的毛头小子,先熬呗,总有媳妇熬成婆的一天,我相信!</p>
<p>下载网址:: <a href="http://www.trufun.net">www.truf</a></p> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%D0%A1%BC%C7">小记</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/73f2753180e32118ebc4af8e.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109084#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 May 2007 14:30:55 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109084</link>
        <guid>http://handy.javaeye.com/blog/109084</guid>
      </item>
      <item>
        <title>转 关于23种设计模式的有趣见解</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109085" style="color:red;">http://handy.javaeye.com/blog/109085</a>&nbsp;
          发表时间: 2007年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="cnt">
<p><strong>创建型模式</strong></p>
<p>　　1、FACTORY&mdash;追MM少不了请吃饭了，麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西，虽然口味有所不同，但不管你带MM去麦当劳或肯德基，只管向服务员说&ldquo;来四个鸡翅&rdquo;就行了。麦当劳和肯德基就是生产鸡翅的Factory</p>
<p>　　<strong>工厂模式：</strong>客户类和工厂类分开。消费者任何时候需要某种产品，只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时，工厂类也要做相应的修改。如：如何创建及如何向客户端提供。</p>
<p>　　2、BUILDER&mdash;MM最爱听的就是&ldquo;我爱你&rdquo;这句话了，见到不同地方的MM,要能够用她们的方言跟她说这句话哦，我有一个多种语言翻译机， 上面每种语言都有一个按键，见到MM我只要按对应的键，它就能够用相应的语言说出&ldquo;我爱你&rdquo;这句话了，国外的MM也可以轻松搞掂，这就是我的&ldquo;我爱你&rdquo; builder。(这一定比美军在伊拉克用的翻译机好卖)</p>
<p>　　<strong>建造模式：</strong>将产品的内部表象和产品的生成过程分割开来，从而使一个建造过程生成具有不同的内部表象的产品对象。建造模式使得产品内部表象可以独立的变化，客户不必知道产品内部组成的细节。建造模式可以强制实行一种分步骤进行的建造过程。</p>
<p>　　3、FACTORY METHOD&mdash;请MM去麦当劳吃汉堡，不同的MM有不同的口味，要每个都记住是一件烦人的事情，我一般采用Factory Method模式，带着MM到服务员那儿，说&ldquo;要一个汉堡&rdquo;，具体要什么样的汉堡呢，让MM直接跟服务员说就行了。</p>
<p>　　<strong>工厂方法模式：</strong>核心工厂类不再负责所有产品的创建，而是将具体创建的工作交给子类去做，成为一个抽象工厂角色，仅负责给出具体工厂类必须实现的接口，而不接触哪一个产品类应当被实例化这种细节。</p>
<p>　　4、PROTOTYPE&mdash;跟MM用QQ聊天，一定要说些深情的话语了，我搜集了好多肉麻的情话，需要时只要copy出来放到QQ里面就行了，这就是我的情话prototype了。(100块钱一份，你要不要)</p>
<p>　　<strong>原始模型模式：</strong>通过给出一个原型对象来指明所要创建的对象的类型，然后用复制这个原型对象的方法创建出更多同类型的对象。原始模型模式允许动态的增加或减少产品类，产品类不需要非得有任何事先确定的等级结构，原始模型模式适用于任何的等级结构。缺点是每一个类都必须配备一个克隆方法。</p>
<p>　　5、SINGLETON&mdash;俺有6个漂亮的老婆，她们的老公都是我，我就是我们家里的老公Sigleton，她们只要说道&ldquo;老公&rdquo;，都是指的同一个人，那就是我(刚才做了个梦啦，哪有这么好的事)</p>
<p>　　<strong>单例模式：</strong>单例模式确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的&ldquo;单一实例&rdquo;的需求时才可使用。</p>
<p>　　<strong>结构型模式</strong></p>
<p>　　6、ADAPTER&mdash;在朋友聚会上碰到了一个美女Sarah，从香港来的，可我不会说粤语，她不会说普通话，只好求助于我的朋友kent了，他作为我和Sarah之间的Adapter，让我和Sarah可以相互交谈了(也不知道他会不会耍我)</p>
<p>　　<strong>适配器(变压器)模式：</strong>把一个类的接口变换成客户端所期待的另一种接口，从而使原本因接口原因不匹配而无法一起工作的两个类能够一起工作。适配类可以根据参数返还一个合适的实例给客户端。</p>
<p>　　7、BRIDGE&mdash;早上碰到MM，要说早上好，晚上碰到MM，要说晚上好;碰到MM穿了件新衣服，要说你的衣服好漂亮哦，碰到MM新做的发型，要说你的头发好漂亮哦。不要问我&ldquo;早上碰到MM新做了个发型怎么说&rdquo;这种问题，自己用BRIDGE组合一下不就行了</p>
<p>　　<strong>桥梁模式：</strong>将抽象化与实现化脱耦，使得二者可以独立的变化，也就是说将他们之间的强关联变成弱关联，也就是指在一个软件系统的抽象化和实现化之间使用组合/聚合关系而不是继承关系，从而使两者可以独立的变化。</p>
<p>8、COMPOSITE&mdash;Mary今天过生日。&ldquo;我过生日，你要送我一件礼物。&rdquo;&ldquo;嗯，好吧，去商店，你自己挑。&rdquo;&ldquo;这件T恤挺漂亮，买，这条裙子 好看，买，这个包也不错，买。&rdquo;&ldquo;喂，买了三件了呀，我只答应送一件礼物的哦。&rdquo;&ldquo;什么呀，T恤加裙子加包包，正好配成一套呀，小姐，麻烦你包起来。&rdquo; &ldquo;&hellip;&hellip;&rdquo;，MM都会用Composite模式了，你会了没有?</p>
<p>　　<strong>合成模式：</strong>合成模式将对象组织到树结构中，可以用来描述整体与部分的关系。合成模式就是一个处理对象的树结构的模式。合成模式把部分与整体的关系用树结构表示出来。合成模式使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待。</p>
<p>　　9、DECORATOR&mdash;Mary过完轮到Sarly过生日，还是不要叫她自己挑了，不然这个月伙食费肯定玩完，拿出我去年在华山顶上照的照 片，在背面写上&ldquo;最好的的礼物，就是爱你的Fita&rdquo;，再到街上礼品店买了个像框(卖礼品的MM也很漂亮哦)，再找隔壁搞美术设计的Mike设计了一个漂 亮的盒子装起来&hellip;&hellip;，我们都是Decorator，最终都在修饰我这个人呀，怎么样，看懂了吗?</p>
<p>　　<strong>装饰模式：</strong>装饰模式以对客户端透明的方式扩展对象的功能，是继承关系的一个替代方案，提供比继承更多的灵活性。动态给一个对象增加功能，这些功能可以再动态的撤消。增加由一些基本功能的排列组合而产生的非常大量的功能。</p>
<p>　　10、FACADE&mdash;我有一个专业的Nikon相机，我就喜欢自己手动调光圈、快门，这样照出来的照片才专业，但MM可不懂这些，教了半天也不 会。幸好相机有Facade设计模式，把相机调整到自动档，只要对准目标按快门就行了，一切由相机自动调整，这样MM也可以用这个相机给我拍张照片了。</p>
<p>　　<strong>门面模式：</strong>外部与一个子系统的通信必须通过一个统一的门面对象进行。门面模式提供一个高层次的接口，使得子系统更易于使用。每一个子系统只有一个门面类，而且此门面类只有一个实例，也就是说它是一个单例模式。但整个系统可以有多个门面类。</p>
<p>　　11、FLYWEIGHT&mdash;每天跟MM发短信，手指都累死了，最近买了个新手机，可以把一些常用的句子存在手机里，要用的时候，直接拿出来，在 前面加上MM的名字就可以发送了，再不用一个字一个字敲了。共享的句子就是Flyweight，MM的名字就是提取出来的外部特征，根据上下文情况使用。</p>
<p>　　<strong>享元模式：</strong>FLYWEIGHT在拳击比赛中指最轻量级。享元模式以共享的方式高效的支持大量的细粒度对象。 享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部，不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。外蕴状态不 能影响内蕴状态，它们是相互独立的。将可以共享的状态和不可以共享的状态从常规类中区分开来，将不可以共享的状态从类里剔除出去。客户端不可以直接创建被 共享的对象，而应当使用一个工厂对象负责创建被共享的对象。享元模式大幅度的降低内存中对象的数量。</p>
<p>　　12、PROXY&mdash;跟MM在网上聊天，一开头总是&ldquo;hi,你好&rdquo;,&ldquo;你从哪儿来呀?&rdquo;&ldquo;你多大了?&rdquo;&ldquo;身高多少呀?&rdquo;这些话，真烦人，写个程序做为我的Proxy吧，凡是接收到这些话都设置好了自动的回答，接收到其他的话时再通知我回答，怎么样，酷吧。</p>
<p>　　<strong>代理模式：</strong>代理模式给某一个对象提供一个代理对象，并由代理对象控制对源对象的引用。代理就是一个人或一个 机构代表另一个人或者一个机构采取行动。某些情况下，客户不想或者不能够直接引用一个对象，代理对象可以在客户和目标对象直接起到中介的作用。客户端分辨 不出代理主题对象与真实主题对象。代理模式可以并不知道真正的被代理对象，而仅仅持有一个被代理对象的接口，这时候代理对象不能够创建被代理对象，被代理 对象必须有系统的其他角色代为创建并传入。</p>
<p>　　<strong>行为模式</strong></p>
<p>　　13、CHAIN OF RESPONSIBLEITY&mdash;晚上去上英语课，为了好开溜坐到了最后一排，哇，前面坐了好几个漂亮的MM哎，找张纸条，写上&ldquo;Hi,可以做我的女朋友 吗?如果不愿意请向前传&rdquo;，纸条就一个接一个的传上去了，糟糕，传到第一排的MM把纸条传给老师了，听说是个老处女呀，快跑!</p>
<p>　　<strong>责任链模式：</strong>在责任链模式中，很多对象由每一个对象对其下家的引用而接</p>
<p>　　起来形成一条链。请求在这个链上传递，直到链上的某一个对象决定处理此请求。客户并不知道链上的哪一个对象最终处理这个请求，系统可以在不影响 客户端的情况下动态的重新组织链和分配责任。处理者有两个选择：承担责任或者把责任推给下家。一个请求可以最终不被任何接收端对象所接受。</p>
<p>　　14、COMMAND&mdash;俺有一个MM家里管得特别严，没法见面，只好借助于她弟弟在我们俩之间传送信息，她对我有什么指示，就写一张纸条让她弟 弟带给我。这不，她弟弟又传送过来一个COMMAND，为了感谢他，我请他吃了碗杂酱面，哪知道他说：&ldquo;我同时给我姐姐三个男朋友送COMMAND，就数 你最小气，才请我吃面。&rdquo;，:-(</p>
<p>　　<strong>命令模式：</strong>命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割 开，委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来，使得请求的一方不必知道接收请求的一方的接口，更不必知道请求是怎么被接收，以及操 作是否执行，何时被执行以及是怎么被执行的。系统支持命令的撤消。</p>
<p>　15、INTERPRETER&mdash;俺有一个《泡MM真经》，上面有各种泡MM的攻略，比如说去吃西餐的步骤、去看电影的方法等等，跟MM约会时，只要做一个Interpreter，照着上面的脚本执行就可以了。</p>
<p>　　<strong>解释器模式：</strong>给定一个语言后，解释器模式可以定义出其文法的一种表示，并同时提供一个解释器。客户端可以使 用这个解释器来解释这个语言中的句子。解释器模式将描述怎样在有了一个简单的文法后，使用模式设计解释这些语句。在解释器模式里面提到的语言是指任何解释 器对象能够解释的任何组合。在解释器模式中需要定义一个代表文法的命令类的等级结构，也就是一系列的组合规则。每一个命令对象都有一个解释方法，代表对命 令对象的解释。命令对象的等级结构中的对象的任何排列组合都是一个语言。</p>
<p>　　16、ITERATOR&mdash;我爱上了Mary，不顾一切的向她求婚。</p>
<p>　　Mary：&ldquo;想要我跟你结婚，得答应我的条件&rdquo;</p>
<p>　　我：&ldquo;什么条件我都答应，你说吧&rdquo;</p>
<p>　　Mary：&ldquo;我看上了那个一克拉的钻石&rdquo;</p>
<p>　　我：&ldquo;我买，我买，还有吗?&rdquo;</p>
<p>　　Mary：&ldquo;我看上了湖边的那栋别墅&rdquo;</p>
<p>　　我：&ldquo;我买，我买，还有吗?&rdquo;</p>
<p>　　Mary：&ldquo;你的小弟弟必须要有50cm长&rdquo;</p>
<p>　　我脑袋嗡的一声，坐在椅子上，一咬牙：&ldquo;我剪，我剪，还有吗?&rdquo;</p>
<p>　　&hellip;&hellip;</p>
<p>　　<strong>迭代子模式：</strong>迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。多个对象聚在一起形成的总 体称之为聚集，聚集对象是能够包容一组对象的容器对象。迭代子模式将迭代逻辑封装到一个独立的子对象中，从而与聚集本身隔开。迭代子模式简化了聚集的界 面。每一个聚集对象都可以有一个或一个以上的迭代子对象，每一个迭代子的迭代状态可以是彼此独立的。迭代算法可以独立于聚集角色变化。</p>
<p>　　17、MEDIATOR&mdash;四个MM打麻将，相互之间谁应该给谁多少钱算不清楚了，幸亏当时我在旁边，按照各自的筹码数算钱，赚了钱的从我这里拿，赔了钱的也付给我，一切就OK啦，俺得到了四个MM的电话。</p>
<p>　　<strong>调停者模式：</strong>调停者模式包装了一系列对象相互作用的方式，使得这些对象不必相互明显作用。从而使他们可以松 散偶合。当某些对象之间的作用发生改变时，不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。调停者模式将多对多的相互作用转化为 一对多的相互作用。调停者模式将对象的行为和协作抽象化，把对象在小尺度的行为上与其他对象的相互作用分开处理。</p>
<p>　　18、MEMENTO&mdash;同时跟几个MM聊天时，一定要记清楚刚才跟MM说了些什么话，不然MM发现了会不高兴的哦，幸亏我有个备忘录，刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存，这样可以随时察看以前的记录啦。</p>
<p>　　<strong>备忘录模式：</strong>备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用意是在不破坏封装的条件下，将一个对象的状态捉住，并外部化，存储起来，从而可以在将来合适的时候把这个对象还原到存储起来的状态。</p>
<p>　　19、OBSERVER&mdash;想知道咱们公司最新MM情报吗?加入公司的MM情报邮件组就行了，tom负责搜集情报，他发现的新情报不用一个一个通知我们，直接发布给邮件组，我们作为订阅者(观察者)就可以及时收到情报啦</p>
<p>　　<strong>观察者模式：</strong>观察者模式定义了一种一队多的依赖关系，让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时，会通知所有观察者对象，使他们能够自动更新自己。</p>
<p>　　20、STATE&mdash;跟MM交往时，一定要注意她的状态哦，在不同的状态时她的行为会有不同，比如你约她今天晚上去看电影，对你没兴趣的MM就会 说&ldquo;有事情啦&rdquo;，对你不讨厌但还没喜欢上的MM就会说&ldquo;好啊，不过可以带上我同事么?&rdquo;，已经喜欢上你的MM就会说&ldquo;几点钟?看完电影再去泡吧怎么 样?&rdquo;，当然你看电影过程中表现良好的话，也可以把MM的状态从不讨厌不喜欢变成喜欢哦。</p>
<p>　　<strong>状态模式：</strong>状态模式允许一个对象在其内部状态改变的时候改变行为。这个对象看上去象是改变了它的类一样。状 态模式把所研究的对象的行为包装在不同的状态对象里，每一个状态对象都属于一个抽象状态类的一个子类。状态模式的意图是让一个对象在其内部状态改变的时 候，其行为也随之改变。状态模式需要对每一个系统可能取得的状态创立一个状态类的子类。当系统的状态变化时，系统便改变所选的子类。</p>
<p>　　21、STRATEGY&mdash;跟不同类型的MM约会，要用不同的策略，有的请电影比较好，有的则去吃小吃效果不错，有的去海边浪漫最合适，单目的都是为了得到MM的芳心，我的追MM锦囊中有好多Strategy哦。</p>
<p>　　<strong>策略模式：</strong>策略模式针对一组算法，将每一个算法封装到具有共同接口的独立的类中，从而使得它们可以相互替 换。策略模式使得算法可以在不影响到客户端的情况下发生变化。策略模式把行为和环境分开。环境类负责维持和查询行为类，各种算法在具体的策略类中提供。由 于算法和环境独立开来，算法的增减，修改都不会影响到环境和客户端。</p>
<p>　　22、TEMPLATE METHOD&mdash;&mdash;看过《如何说服女生上床》这部经典文章吗?女生从认识到上床的不变的步骤分为巧遇、打破僵局、展开追求、接吻、前戏、动手、爱抚、进去八 大步骤(Template method)，但每个步骤针对不同的情况，都有不一样的做法，这就要看你随机应变啦(具体实现);</p>
<p>　　<strong>模板方法模式：</strong>模板方法模式准备一个抽象类，将部分逻辑以具体方法以及具体构造子的形式实现，然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法，从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架，而将逻辑的细节留给具体的子类去实现。</p>
<p>　　23、VISITOR&mdash;情人节到了，要给每个MM送一束鲜花和一张卡片，可是每个MM送的花都要针对她个人的特点，每张卡片也要根据个人的特点 来挑，我一个人哪搞得清楚，还是找花店老板和礼品店老板做一下Visitor，让花店老板根据MM的特点选一束花，让礼品店老板也根据每个人特点选一张 卡，这样就轻松多了;</p>
<p>　　<strong>访问者模式：</strong>访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话，接 受这个操作的数据结构可以保持不变。访问者模式适用于数据结构相对未定的系统，它把数据结构和作用于结构上的操作之间的耦合解脱开，使得操作集合可以相对 自由的演化。访问者模式使得增加新的操作变的很容易，就是增加一个新的访问者类。访问者模式将有关的行为集中到一个访问者对象中，而不是分散到一个个的节 点类中。当使用访问者模式时，要将尽可能多的对象浏览逻辑放在访问者类中，而不是放到它的子类中。访问者模式可以跨过几个类的等级结构访问属于不同的等级 结构的成员类。</p>
</div>
<a href="http://hi.baidu.com/handylee/blog/item/17de7a09457825ae2eddd4e5.html#comment"></a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109085#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 May 2007 03:39:41 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109085</link>
        <guid>http://handy.javaeye.com/blog/109085</guid>
      </item>
      <item>
        <title>今天我有了第二生命</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109086" style="color:red;">http://handy.javaeye.com/blog/109086</a>&nbsp;
          发表时间: 2007年04月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>在second life上注册了帐号.我的第二人生开始了</p>
<p>先截个图.呵呵 还没来的及穿衣服,害羞有点,不要笑话我啊.</p>
<p>要注册的话 <a href="http://www.secondlife.com/join/?u=23da001889984c18bd73de4426884440" target="_blank">点这里.</a>&nbsp;&nbsp; 我的帐号是 handy Yifu,欢迎大家和我做朋友</p>
<div forimg="1"><img small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/c1a4067bc309f8f00ad1875c.jpg" border="0" /></div> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/4127f1faeb639ddfb48f3101.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109086#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 26 Apr 2007 01:57:30 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109086</link>
        <guid>http://handy.javaeye.com/blog/109086</guid>
      </item>
      <item>
        <title>超快关机技巧</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109087" style="color:red;">http://handy.javaeye.com/blog/109087</a>&nbsp;
          发表时间: 2007年04月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>　　1、Ctrl+Alt+Del<br />
　　2、按住Ctrl不放<br />
　　3、鼠标点击 关机--〉关闭<br />
　　<br />
　　保准你10秒钟内关机,我的机器是5秒内就关了,太快了~</p> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/bb38c53d0b465dc69f3d62d8.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109087#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Apr 2007 00:57:44 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109087</link>
        <guid>http://handy.javaeye.com/blog/109087</guid>
      </item>
      <item>
        <title>轻量级JS库JQuery!</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109088" style="color:red;">http://handy.javaeye.com/blog/109088</a>&nbsp;
          发表时间: 2007年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>说它轻量 其实一点也不轻量,这个库的语法太酷了</p>
<p>极大减少代码编写量,提高代码与页面的分离度.看个例子先</p>
<p>先加入类库</p>
<p>&lt;script src="lib/jquery.js" type="text/javascript"&gt;&lt;/script&gt;</p>
<p>&lt;script&gt;</p>
<p>&nbsp;&nbsp; $(document).ready(function(){</p>
<p>$("#faq").find("dd").hide().end().find("dt").css("cursor","hand").click(function(){<br />
&nbsp;&nbsp;&nbsp;&nbsp; var a = $(this).next();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (a.is(":visible")) {<br />
&nbsp;&nbsp;</p> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/js%26%2338%3Bajax%D1%A7%CF%B0">js&amp;ajax学习</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/afc18e025c1ea80e4bfb5187.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109088#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 17 Mar 2007 13:57:53 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109088</link>
        <guid>http://handy.javaeye.com/blog/109088</guid>
      </item>
      <item>
        <title>zt 解决 FireFox 下[event] 的问题.</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109091" style="color:red;">http://handy.javaeye.com/blog/109091</a>&nbsp;
          发表时间: 2007年03月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postTitle">在FireFox下编写事件处理函数是很麻烦的事.<br />
因为FireFox并没有&nbsp;window.event&nbsp;.&nbsp;如果要得到&nbsp;event&nbsp;对象,就必须要声明时间处理函数的第一个参数为event.<br />
<br />
所以为了兼容IE与FireFox,一般的事件处理方法为:<br />
btn.onclick=handle_btn_click;<br />
function&nbsp;handle_btn_click(evt)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;if(evt==null)evt=window.event;//IE<br />
&nbsp;&nbsp;&nbsp;&nbsp;//处理事件.<br />
}<br />
对于简单的程序,这不算麻烦.<br />
<br />
但对于一些复杂</div> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/js%26%2338%3Bajax%D1%A7%CF%B0">js&amp;ajax学习</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/9d059b0ad031dd1f95ca6bd6.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109091#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 Mar 2007 05:25:27 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109091</link>
        <guid>http://handy.javaeye.com/blog/109091</guid>
      </item>
      <item>
        <title>转 跨越边界: JavaScript 语言特性</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109092" style="color:red;">http://handy.javaeye.com/blog/109092</a>&nbsp;
          发表时间: 2007年02月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <blockquote>
<p>JavaScript&nbsp;常被人们认为是编程语言中无足轻重的一员。这种观点的形成可以&ldquo;归功&rdquo;于其开发工具、复杂且不一致的面向&nbsp;HTML&nbsp;页面的 文档对象模型以及不一致的浏览器实现。但&nbsp;JavaScript&nbsp;绝对不仅仅是一个玩具这么简单。在本文中，Bruce&nbsp;Tate&nbsp;向您介绍了 &nbsp;JavaScript&nbsp;的语言特性。&nbsp;几乎每个&nbsp;Web&nbsp;开发人员都曾有过诅咒&nbsp;JavaScript&nbsp;的经历。这个备受争议的语言受累于其复杂的称为 文档对象模型&nbsp;(DOM)的编程模型、糟糕的实现和调试工具以及不一致的浏览器实现。直到最近，很多开发人员还认为&nbsp;Javascript&nbsp;从最好的方面 说是无可避免之灾祸，从最坏的方面说不过是一种玩具罢了。&nbsp;</p>
</blockquote>
<p>然而&nbsp;JavaScript&nbsp;现在开始日益重要起来，而且成为了广泛应用于&nbsp;Web&nbsp;开发的脚本语言。JavaScript&nbsp;的复苏使一些业界领袖 人物也不得不开始重新审视这种编程语言。诸如&nbsp;Ajax&nbsp;(Asynchronous&nbsp;JavaScript&nbsp;+&nbsp;XML)&nbsp;这样的编程技术让&nbsp;Web&nbsp; 网页更加迷人。而完整的&nbsp;Web&nbsp;开发框架，比如&nbsp;Apache&nbsp;Cocoon，则让&nbsp;JavaScript&nbsp;的应用越来越多，使其不只限于是一种用于制 作&nbsp;Web&nbsp;页面的简单脚本。JavaScript&nbsp;的一种称为&nbsp;ActionScript&nbsp;的派生物也推动了&nbsp;Macromedia&nbsp;的&nbsp;Flash&nbsp; 客户端框架的发展。运行在&nbsp;JVM&nbsp;上的实现&nbsp;Rhino&nbsp;让&nbsp;JavaScript&nbsp;成为了&nbsp;Java&trade;&nbsp;开发人员所首选的一类脚本语言（参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#resources"><font color="#996699">参考资料</font></a>）。&nbsp;</p>
<p>我的好友兼同事&nbsp;Stuart&nbsp;Halloway&nbsp;是&nbsp;Ajax&nbsp;方面的专家，曾在其教授的&nbsp;JavaScript&nbsp;课程中做过这样的开场白：&ldquo;到 &nbsp;2011&nbsp;年，JavaScript&nbsp;将被公认为是一种拥有开发现代应用程序所需的一整套新特性的语言&rdquo;&nbsp;。他继而介绍说&nbsp;JavaScript&nbsp;程序 要比类似的&nbsp;Java&nbsp;程序紧密十倍，并继续展示了使其之所以如此的一些语言特性。&nbsp;</p>
<table cellspacing="0" border="0" align="right" cellpadding="0" width="40%">
    <tbody>
        <tr>
            <td width="10"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="10" /></td>
            <td>
            <table cellspacing="0" border="1" cellpadding="5" width="100%">
                <tbody>
                    <tr>
                        <td bgcolor="#eeeeee"><a name="N1007A"><strong><font color="#000000">关于这个系列</font></strong></a><br />
                        <p>在&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb/"><font color="#5c81a7">跨越边界系列中</font></a>， 作者&nbsp;Bruce&nbsp;Tate&nbsp;提出了这样一个主张：今天的&nbsp;Java&nbsp;程序员通过学习其他技术和语言，会得到很好的帮助。编程领域已经发生了变化， Java&nbsp;技术不再是所有开发项目理所当然的最佳选择。其他框架正在影响&nbsp;Java&nbsp;框架构建的方式，而从其他语言学到的概念也有助于&nbsp;Java&nbsp;编程。 对&nbsp;Python（或&nbsp;Ruby、Smalltalk&nbsp;等等）代码的编写可能改变&nbsp;Java&nbsp;编码的方式。</p>
                        <p>这 个系列介绍的编程概念和技术，与&nbsp;Java&nbsp;开发有根本的不同，但可以直接应用于&nbsp;Java&nbsp;编程。在某些情况下，需要集成这些技术来利用它们。在其他情 况下，可以直接应用这些概念。单独的工具并不重要，重要的是其他语言和框架可以影响&nbsp;Java&nbsp;社区中的开发人员、框架，甚至是基本方式。&nbsp;</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p>在这篇文章中，我将带您探究&nbsp;JavaScript&nbsp;的一些特性，看看这些特性如何让它如此具有吸引力：&nbsp;</p>
<ul>
    <li><strong>高阶函数：</strong>&nbsp;一个高阶函数可以将函数作为参数，也可以返回一个函数。此特性让&nbsp;JavaScript&nbsp;程序员可以用&nbsp;Java&nbsp;语言所不能提供的方法来操纵函数。<br />
    <br />
    </li>
    <li><strong>动态类型：</strong>通过延迟绑定，JavaScript&nbsp;可以更准确和更灵活。<br />
    <br />
    </li>
    <li><strong>灵活的对象模型：</strong>JavaScript&nbsp;的对象模型使用一种相对不常见的方式进行继承&nbsp;&mdash;&mdash;&nbsp;称为<em>原型</em>&nbsp;&mdash;&mdash;&nbsp;而不是&nbsp;Java&nbsp;语言中更常见的基于类的对象模型。&nbsp;&nbsp;</li>
</ul>
<p>您可能已经熟悉动态类型模型、高阶函数形式的函数式编程以及开放对象模型这些概念，因为我在其他的<em>跨越边界</em>&nbsp; 系列文章中已经作过相关的介绍。如果您从未进行过任何正式的&nbsp;JavaScript&nbsp;开发，您很可能会认为这些特性属于非常复杂的语言，例如 &nbsp;Python、Lisp、Smalltalk&nbsp;和&nbsp;Haskell，而绝非像&nbsp;JavaScript&nbsp;这样的语言所能提供的。因此，我将用实际的代码示 例来说明这些概念。&nbsp;</p>
<p><a name="N100B4"><span class="atitle"><font color="#000000">立即开始</font></span></a></p>
<p>您无需设置&nbsp;JavaScript。如果您可以在浏览器中阅读此篇文章，就证明您已经准备就绪了。本文包含的所有编程示例都可以在大多数浏览器内运行。我使用的是&nbsp;Firefox。&nbsp;</p>
<p>用在&nbsp;<code><font face="新宋体">&lt;script&nbsp;type='text/javascript'&gt;</font></code>&nbsp;和&nbsp;<code><font face="新宋体">&lt;/script&gt;</font></code>&nbsp;标记之间所包含的&nbsp;JavaScript&nbsp;加载简单的&nbsp;Web&nbsp;页面。清单&nbsp;1&nbsp;可以显示&nbsp;Hello,&nbsp;World&nbsp;文本：&nbsp;</p>
<br />
<br />
<a name="N100CC"><strong><font color="#000000">清单&nbsp;1.&nbsp;Hello,&nbsp;world</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;script&nbsp;type='text/javascript'&gt;<br />alert('Hello,&nbsp;World.')<br />&lt;/script&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>要运行此代码，只需创建一个名为&nbsp;example1.html&nbsp;的文件。将清单&nbsp;1&nbsp;的代码复制到该文件内，并在浏览器中加载此文件（参看&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#download"><font color="#996699">下载</font></a>&nbsp;部分以获得本文使用的所有示例&nbsp;HTML&nbsp;文件）。注意到每次重载此页面时，该代码都会立即执行。</p>
<p><code><font face="新宋体">alert</font></code>&nbsp;是个函数调用，只有一个字符串作为参数。图&nbsp;1&nbsp;显示了 由清单&nbsp;1&nbsp;中的代码弹出的警告框，显示文本&nbsp;&ldquo;Hello,&nbsp;World&rdquo;。如果代码在&nbsp;HTML&nbsp;body&nbsp;之内（目前并未指定任何&nbsp;body，但浏 览器能接受不规则的&nbsp;HTML，并且整个页面都默然作为一个&nbsp;body&nbsp;被处理）。页面一旦加载，JavaScript&nbsp;就会立即执行。&nbsp;</p>
<br />
<br />
<a name="figure1"><strong><font color="#000000">图&nbsp;1.&nbsp;Hello,&nbsp;world</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-1.jpg" height="136" alt="Hello, World." width="320" />&nbsp;<br />
<p>如果要延迟执行，可以在&nbsp;HTML&nbsp;<code><font face="新宋体">&lt;head&gt;</font></code>&nbsp;元素声明&nbsp;JavaScript&nbsp;函数，如清单&nbsp;2&nbsp;所示：&nbsp;</p>
<br />
<br />
<a name="listing2"><strong><font color="#000000">清单&nbsp;2.&nbsp;延迟执行</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode"><div class="code_title">js 代码</div><div class="dp-highlighter"><ol class="dp-c" start="1"><li class="alt"><span><span>&nbsp;&nbsp;</span></span></li></ol></div>&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;hello()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Hello,&nbsp;World.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;hello();&quot;&gt;Say&nbsp;Hello&lt;/button&gt;<br />&lt;/body&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>将清单&nbsp;2&nbsp;中的代码输入到一个&nbsp;HTML&nbsp;文件，在浏览器内加载该文件，单击&nbsp;<strong>Say&nbsp;Hello</strong>&nbsp;按钮，结果如图&nbsp;2&nbsp;所示：</p>
<br />
<br />
<a name="figure2"><strong><font color="#000000">图&nbsp;2.&nbsp;延迟执行</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-2.jpg" height="262" alt="延迟执行" width="397" />&nbsp;<br />
<br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N10117"><span class="atitle"><font color="#000000">高阶函数</font></span></a></p>
<p>从&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing2"><font color="#996699">清单&nbsp;2</font></a>，可以大致体会到一些&nbsp;JavaScript&nbsp;在操纵函数方面的能力。将函数名称传递给&nbsp;HTML&nbsp;<code><font face="新宋体">button</font></code>&nbsp;标记并利用&nbsp;HTML&nbsp;的内置事件模型。使用&nbsp;JavaScript&nbsp;时，我会经常在变量或数组中存储函数（在本文后面的&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#objectmodels"><font color="#996699">对象模型</font></a>&nbsp;一节，您会看到&nbsp;JavaScript&nbsp;对象模型策略大量使用了此技巧）。例如，查看一下清单&nbsp;3：&nbsp;</p>
<br />
<br />
<a name="listing3"><strong><font color="#000000">清单&nbsp;3.&nbsp;用变量操纵函数</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;head&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;function&nbsp;hot()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Sweat.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;&nbsp;=&nbsp;function&nbsp;cold()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Shiver.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;swap()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp&nbsp;=&nbsp;hot<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;cold<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;=&nbsp;temp&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Swapped.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;hot();&quot;&gt;Hot&lt;/button&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;cold();&quot;&gt;Cold&lt;/button&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;swap();&quot;&gt;Swap&lt;/button&gt;<br />&lt;/body&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>函数是&nbsp;JavaScript&nbsp;中的一类对象，可以自由地操纵它们。首先我声明两个函数：<code><font face="新宋体">hot</font></code>&nbsp;和&nbsp;<code><font face="新宋体">cold</font></code>。并分别在不同的变量存储它们。单击&nbsp;Hot&nbsp;或&nbsp;Cold&nbsp;按钮会调用对应的函数，生成一个告警。接下来，声明另一个函数用来交换&nbsp;Hot&nbsp;和&nbsp;Cold&nbsp;按钮的值，将此函数与第三个按钮关联，该按钮显示如图&nbsp;3&nbsp;所示的告警：&nbsp;</p>
<br />
<br />
<a name="figure3"><strong><font color="#000000">图&nbsp;3.&nbsp;操纵函数</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-3.jpg" height="172" alt="" width="465" />&nbsp;<br />
<p>这个例子说明可以像处理其他变量一样处理函数。C&nbsp;开发人员很容易将此概念看作是<em>函数指针</em>&nbsp;功能，但&nbsp;JavaScript&nbsp;的高阶函数的功能更为强大。该特性让&nbsp;JavaScript&nbsp;程序员能够像处理其他变量类型一样轻松处理动作或函数。</p>
<p>将函数用作函数的参数，或将函数作为值返回，这些概念属于高阶函数的领域。清单&nbsp;4&nbsp;对&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing3"><font color="#996699">清单&nbsp;3</font></a>&nbsp;做了一点点修改，显示了能返回函数的高阶函数：</p>
<br />
<br />
<a name="N10162"><strong><font color="#000000">清单&nbsp;4.&nbsp;高阶函数</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;head&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;type='text/javascript'&gt;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;temperature()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;current<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hot&nbsp;=&nbsp;function&nbsp;hot()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Hot.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cold&nbsp;&nbsp;=&nbsp;function&nbsp;cold()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert('Cold.')<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;hot<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;swap()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(current&nbsp;==&nbsp;hot)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;cold<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current&nbsp;=&nbsp;hot<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;funct&nbsp;=&nbsp;temperature()();&quot;&gt;Temperature&lt;/button&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;button&nbsp;onclick=&quot;swap();&quot;&gt;Swap&lt;/button&gt;<br />&lt;/body&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>这个例子解决了一个常见问题：如何将更改中的行为附加到用户接口事件？通过高阶函数，这很容易做到。<code><font face="新宋体">temperature</font></code>&nbsp;高阶函数返回&nbsp;<code><font face="新宋体">current</font></code>&nbsp;的值，而&nbsp;current&nbsp;又可以有&nbsp;<code><font face="新宋体">hot</font></code>&nbsp;或&nbsp;<code><font face="新宋体">cold</font></code>&nbsp;函数。看一下这个有些陈旧的函数调用：<code><font face="新宋体">temperature()()</font></code>。第一组括号用于调用&nbsp;<code><font face="新宋体">temperature</font></code>&nbsp;函数。第二组括号调用由&nbsp;<code><font face="新宋体">temperature</font></code>&nbsp;<em>返回</em>&nbsp;的函数。图&nbsp;4&nbsp;显示了输出：</p>
<br />
<br />
<a name="figure4"><strong><font color="#000000">图&nbsp;4.&nbsp;高阶函数</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-4.jpg" height="193" alt="高阶函数" width="500" />&nbsp;<br />
<p>高阶函数是函数式编程的基础，对比面向对象编程，函数式编程代表了更高级别的抽象。但&nbsp;JavaScript&nbsp;的实力并不仅限于高阶函数。JavaScript&nbsp;的动态类型就极为适合&nbsp;UI&nbsp;开发。</p>
<br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N1019D"><span class="atitle"><font color="#000000">动态类型</font></span></a></p>
<p>通过静态类型，编译器可以检查参数和变量的值或针对一个给定操作所允许的返回值。其优势是编译器可以做额外的错误检查。而且静态类型还可以为诸如&nbsp;IDE&nbsp;这样的工具提供更多信息，带来其他一些特性，比如更好的代码完成功能。但静态类型也存在着如下一些劣势：</p>
<ul>
    <li>必须提前声明意图，这常常会导致灵活性降低。例如，更改一个&nbsp;Java&nbsp;类就会更改类的类型，因而必须重新编译。对比之下，Ruby&nbsp;允许开放的类，但更改一个&nbsp;Java&nbsp;类还是会更改类的类型。<br />
    <br />
    </li>
    <li>要实现相同的功能，必须输入更多的代码。例如，必须用参数形式包括进类型信息，必须用函数形式返回值和所有变量的类型。另外，还必须声明所有变量并显式地转化类型。<br />
    <br />
    </li>
    <li>静态语言的编译-部署周期要比动态语言的部署周期长，尽管一些工具可被用来在某种程度上缓解这一问题。&nbsp;&nbsp;</li>
</ul>
<p>静态类型更适合用于构建中间件或操作系统的语言中。UI&nbsp;开发常常需要更高的效率和灵活性，所以更适合采用动态类型。我深知 这种做法存在危险。相信使用过&nbsp;JavaScript&nbsp;的&nbsp;Web&nbsp;开发人员都曾经为编译器本应检测到的错误类型的变量而绞尽脑汁。但它所带来的优势同样 不可否认。下面将举例加以说明。</p>
<p>首先，考虑一个对象的情况。在清单&nbsp;5&nbsp;中，创建一个新对象，并访问一个不存在的属性，名为&nbsp;<code><font face="新宋体">color</font></code>：</p>
<br />
<br />
<a name="listing5"><strong><font color="#000000">清单&nbsp;5.&nbsp;引入一个属性</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;script&nbsp;type='text/javascript'&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;blank_object&nbsp;=&nbsp;new&nbsp;Object();<br />&nbsp;&nbsp;&nbsp;&nbsp;blank_object.color&nbsp;=&nbsp;'blue'<br />&nbsp;&nbsp;&nbsp;&nbsp;alert('The&nbsp;color&nbsp;is&nbsp;'&nbsp;+&nbsp;blank_object.color)<br />&lt;/script&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>当加载并执行此应用程序时，会得到如图&nbsp;5&nbsp;所示的结果：</p>
<br />
<br />
<a name="figure5"><strong><font color="#000000">图&nbsp;5.&nbsp;引入属性</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-5.jpg" height="136" alt="引入属性" width="320" />&nbsp;<br />
<p>JavaScript&nbsp;并不会报告&nbsp;<code><font face="新宋体">blue</font></code>&nbsp;属性不存在的错误。静 态类型的拥护者大都会被本例所吓倒，因为本例中的错误被很好地隐匿了。虽然这种做法多少会让您感觉有些不正当，但您也不能否认它巨大的诱惑力。您可以很快 引入属性。如果将本例和本文之前的例子结合起来，还可以引入行为。记住，变量可以保存函数！所以，基于动态类型和高阶函数，您可以在任何时候向类中引入任 意的行为。&nbsp;</p>
<p>可以轻松地重写&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing5"><font color="#996699">清单&nbsp;5</font></a>，使其如清单&nbsp;6&nbsp;所示：</p>
<br />
<br />
<a name="N101F3"><strong><font color="#000000">清单&nbsp;6.&nbsp;引入行为</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;script&nbsp;type='text/javascript'&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;blank_object&nbsp;=&nbsp;new&nbsp;Object();<br />&nbsp;&nbsp;&nbsp;&nbsp;blank_object.color&nbsp;=&nbsp;function()&nbsp;{&nbsp;return&nbsp;'blue'}<br />&nbsp;&nbsp;&nbsp;&nbsp;alert('The&nbsp;color&nbsp;is&nbsp;'&nbsp;+&nbsp;blank_object.color())<br />&lt;/script&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>从上例可以看出，在&nbsp;JavaScript&nbsp;的不同概念之间可以如此轻松地来回变换，其含义上的变化很大&nbsp;&mdash;&mdash;&nbsp;比如，是引入行为还是引入数据&nbsp; &mdash;&mdash;&nbsp;但语法上的变化却很小。该语言很好的延展性是它的一种优势，但同样也是其缺点所在。实际上，该语言本身的对象模型就是&nbsp;JavaScript&nbsp;延展 程度的一种体现。</p>
<br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="objectmodels"><span class="atitle"><font color="#000000">对象模型</font></span></a></p>
<p>到目前为止，您应该对&nbsp;JavaScript&nbsp;有一个正确的评价了，它绝非只如一个玩具那么简单。事实上，很多人都使用过其对象模型创建过极为复杂、设计良好的面向对象软件。但对象模型尤其是用于继承的对象模型又非您一贯认为的那样。&nbsp;</p>
<p>Java&nbsp;语言是基于类的。当构建应用程序时，也同时构建了可以作为所有对象的模板的新类。然后调用&nbsp;<code><font face="新宋体">new</font></code>&nbsp;来实例化该模板，创建一个新对象。而在&nbsp;JavaScript&nbsp;中，所创建的是一个原型，此原型是一个实例，可以创建所有未来的对象。&nbsp;</p>
<p>现在先暂且放下这些抽象的概念，去查看一些实际代码。比如，清单&nbsp;7&nbsp;创建了一个简单的&nbsp;<code><font face="新宋体">Animal</font></code>，它具有&nbsp;<code><font face="新宋体">name</font></code>&nbsp;属性和&nbsp;<code><font face="新宋体">speak</font></code>&nbsp;动作。其他动物会从这个基础继承。&nbsp;</p>
<br />
<br />
<a name="listing7"><strong><font color="#000000">清单&nbsp;7.&nbsp;创建一个构造函数</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;script&nbsp;type='text/javascript'&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Animal&nbsp;=&nbsp;function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;&quot;nobody&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;Who&nbsp;am&nbsp;I?&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />myAnimal&nbsp;=&nbsp;new&nbsp;Animal();<br />alert('The&nbsp;animal&nbsp;named&nbsp;'&nbsp;+&nbsp;myAnimal.name&nbsp;+&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;says&nbsp;'&nbsp;+&nbsp;myAnimal.speak());<br /><br />&lt;/script&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>清单&nbsp;7&nbsp;的结果如图&nbsp;6&nbsp;所示：</p>
<br />
<br />
<a name="figure6"><strong><font color="#000000">图&nbsp;6.&nbsp;创建一个构造函数</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-6.jpg" height="135" alt="构造函数" width="383" />&nbsp;<br />
<p>对于&nbsp;Java&nbsp;开发人员而言，清单&nbsp;7&nbsp;中的代码看起来多少有点生疏和奇怪。实际上对于没有亲自构建过对象的许多&nbsp;JavaScript&nbsp;开发人员来说，这些代码同样看起来有点生疏和奇怪。也许，下面的解释可以让大家能够更好地理解这段代码。&nbsp;</p>
<p>实际上，您只需重点关注其中三段信息。首先，JavaScript&nbsp;用嵌套函数表示对象。这意味着清单&nbsp;7&nbsp;中的&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;的定义是一种有效的语法。第二，JavaScript&nbsp;基于原型或现有的对象的实例来构造对象，而非基于类模板。<code><font face="新宋体">funct()</font></code>&nbsp;是一种调用，但&nbsp;<code><font face="新宋体">new&nbsp;Animal()</font></code>&nbsp;却基于&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;内的原型构造一个对象。最后，在&nbsp;JavaScript&nbsp;中，对象只是函数和变量的集合。每个对象并不与类型相关，所以可以自由地修改这种结构。&nbsp;</p>
<p>回到&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#listing7"><font color="#996699">清单&nbsp;7</font></a>。如您所见，JavaScript&nbsp;基于在&nbsp;<code><font face="新宋体">Animal</font></code>&nbsp;中指定的原型定义一个新对象：<code><font face="新宋体">myAnimal</font></code>。继而可以使用原型中的属性和函数，甚或重定义函数和属性。这种灵活性可能会让&nbsp;Java&nbsp;开发人员受不了，因为他们不习惯这种行为，但它的确是一种十分强大的模型。</p>
<p>现在我还要更深入一步。您还可以使用名为&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;实例变量来指定对象的基础。方法是设置&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;实例变量使其指向继承链的父。如此设置&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;之后，您所创建的对象会为未指定的那些对象继承属性和函数。这样一来，您就可以模仿面向对象的继承概念。以清单&nbsp;8&nbsp;为例：&nbsp;</p>
<br />
<br />
<a name="N10271"><strong><font color="#000000">清单&nbsp;8.&nbsp;通过原型继承</font></strong></a><br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td class="code-outline">
            <pre class="displaycode">&nbsp;&nbsp;&nbsp;&nbsp;<br />&lt;script&nbsp;type='text/javascript'&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />Animal&nbsp;=&nbsp;function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;this.name&nbsp;=&nbsp;&quot;nobody&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function&nbsp;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;Who&nbsp;am&nbsp;I?&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />Dog&nbsp;=&nbsp;function()&nbsp;{<br />&nbsp;&nbsp;this.speak&nbsp;=&nbsp;function()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;Woof!&quot;<br />&nbsp;&nbsp;}<br />}<br />Dog.prototype&nbsp;=&nbsp;new&nbsp;Animal();<br /><br />myAnimal&nbsp;=&nbsp;new&nbsp;Dog();<br />alert('The&nbsp;animal&nbsp;named&nbsp;'&nbsp;+&nbsp;myAnimal.name&nbsp;+&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'&nbsp;says&nbsp;'&nbsp;+&nbsp;myAnimal.speak());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/script&gt;<br /></pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在清单&nbsp;8&nbsp;中，创建了一个&nbsp;<code><font face="新宋体">Dog</font></code>&nbsp;原型。此原型基于&nbsp;<code><font face="新宋体">Animal</font></code>。<code><font face="新宋体">Dog</font></code>&nbsp;重定义&nbsp;<code><font face="新宋体">speak()</font></code>&nbsp;方法但却不会对&nbsp;<code><font face="新宋体">name()</font></code>&nbsp;方法做任何改动。随后，将原型&nbsp;<code><font face="新宋体">Dog</font></code>&nbsp;设置成&nbsp;<code><font face="新宋体">Animal</font></code>。图&nbsp;7&nbsp;显示了其结果：</p>
<br />
<br />
<a name="figure7"><strong><font color="#000000">图&nbsp;7.&nbsp;通过原型继承</font></strong></a><br />
<img src="http://www.ibm.com/developerworks/cn/java/j-cb12196/figure-7.jpg" height="135" alt="继承" width="355" />&nbsp;<br />
<p>这也展示了&nbsp;JavaScript&nbsp;是如何解决到属性或方法的引用问题的：</p>
<ul>
    <li>JavaScript&nbsp;基于原始的原型创建实例，该原型在构造函数中定义。任何对方法或属性的引用都会使用所生成的原始副本。<br />
    <br />
    </li>
    <li>您可以在对象内像定义其他任何变量一样重新定义这些变量。这样做必然会更改此对象。所以您显式定义的任何属性或函数都将比在原始的原型中定义的那些属性或函数优先级要高。<br />
    <br />
    </li>
    <li>如果您显式设置了名为&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;的实例变量，JavaScript&nbsp;就会在此实例中寻找任何未定义的实例变量或属性。这种查找是递归的：如果&nbsp;在&nbsp;<code><font face="新宋体">prototype</font></code>&nbsp;内定义的实例不能找到属性或函数，它就会在<em>其</em>&nbsp;原型中查找，依此类推。&nbsp;&nbsp;</li>
</ul>
<p>那么，JavaScript&nbsp;的继承模型到底是什么样的？这取决于您如何对它进行定义。您需要定义继承行为以便可以覆盖它。 然而，从本质上讲，JavaScript&nbsp;更像是一种函数式语言，而非面向对象的语言，它使用一些智能的语法和语义来仿真高度复杂的行为。其对象模型极为 灵活、开放和强大，具有全部的反射性。有些人可能会说它太过灵活。而我的忠告则是，按具体作业的需要选择合适的工具。</p>
<br />
<table cellspacing="0" border="0" cellpadding="0" width="100%">
    <tbody>
        <tr>
            <td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br />
            <img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" align="right" cellpadding="0">
    <tbody>
        <tr align="right">
            <td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
            <table cellspacing="0" border="0" cellpadding="0">
                <tbody>
                    <tr>
                        <td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br />
                        </td>
                        <td align="right" valign="top"><a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#main" class="fbox"><strong><font color="#996699">回页首</font></strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="N102CB"><span class="atitle"><font color="#000000">结束语</font></span></a></p>
<p>JavaScript&nbsp;对象模型构建在该语言的其他功能之上来支持大量的库，比如&nbsp;Dojo（参见&nbsp;<a href="http://www.ibm.com/developerworks/cn/java/j-cb12196/index.html#resources"><font color="#996699">参考资料</font></a>）。这种灵活性让每个框架能够以一种精细的方式更改对象模型。在某种程度上，这种灵活性是一种极大的缺点。它可以导致可怕的互操作性问题（尽管该语言的灵活性可以部分缓解这些问题）。&nbsp;</p>
<p>而另一方面，灵活性又是一种巨大的优势。Java&nbsp;语言一直苦于无法充分增强其灵活性，原因是它的基本对象模型还未灵活到可以被扩展的程度。一个典 型的企业级开发人员为能够成功使用&nbsp;Java&nbsp;语言必须要学习很多东西，而新出现的一些优秀的开放源码项目和新技术，比如面向方面编程、Spring&nbsp;编 程框架和字节码增强库，则带来了大量要学的代码。&nbsp;</p>
<p>最后，JavaScript&nbsp;优秀的灵活性的确让您体会到了一些高阶语言的强大功能。当然您无需选择为每个项目或大多数项目都做这样的权衡和折衷。 但了解一种语言的优势和劣势&nbsp;&mdash;&mdash;&nbsp;通过参考大量信息，而不仅仅基于广告宣传或公众意见&nbsp;&mdash;&mdash;&nbsp;会让您可以更好地控制何时需要使用以及何时不能使用这种语 言。当您在修改&nbsp;JavaScript&nbsp;Web&nbsp;小部件时，您至少知道该如何让此语言发挥它最大的优势。请继续跨越边界吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109092#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 10 Feb 2007 01:30:38 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109092</link>
        <guid>http://handy.javaeye.com/blog/109092</guid>
      </item>
      <item>
        <title>prototype 1.5 API出来了</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109094" style="color:red;">http://handy.javaeye.com/blog/109094</a>&nbsp;
          发表时间: 2007年02月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>到<a href="http://www.prototypejs.org/" target="_blank">prototype</a>站点上一逛，发现竟然推出了1.5版本的api，开心啊，又可以深入了解与学习了，还有pdf版本的，我把它下载了下来，提供了firefox的&nbsp;sidebar扩展，不过我安装后，没法用&nbsp;不知是不是因为我的火狐是2。0版本。&nbsp;没办法只好自己一个一个的加书签</p>
<div forimg="1"><img small="0" class="blogimg" src="http://hiphotos.baidu.com/handylee/pic/item/a7dd58e744da1e2cb938205b.jpg" border="0" /></div>
<div forimg="1">火狐的书签搜索功能不</div> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/js%26%2338%3Bajax%D1%A7%CF%B0">js&amp;ajax学习</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/bee1fb031cdb63ec08fa93e3.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109094#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 09 Feb 2007 09:04:09 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109094</link>
        <guid>http://handy.javaeye.com/blog/109094</guid>
      </item>
      <item>
        <title>明天就可以回家了 呵呵。</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109095" style="color:red;">http://handy.javaeye.com/blog/109095</a>&nbsp;
          发表时间: 2007年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="text">
<p>行李什么的都还没有收拾，晚上再收拾吧，&nbsp;今天给百度和盛大都发了自己的简历，</p>
<p>看瞎猫能撞住死老鼠不。过完年可要好好找工作。<img src="http://static.xiaonei.com/img/editor/emot/emot-10.gif" alt="微笑" style="WIDTH: auto" /></p>
</div> 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%D0%A1%BC%C7">小记</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/7360ffde4c6f305495ee3777.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109095#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Feb 2007 10:19:28 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109095</link>
        <guid>http://handy.javaeye.com/blog/109095</guid>
      </item>
      <item>
        <title>zt 好文章 由浅到深了解JavaScript中的类</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109096" style="color:red;">http://handy.javaeye.com/blog/109096</a>&nbsp;
          发表时间: 2007年02月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>原文&nbsp;<a href="http://bbs.51js.com/viewthread.php?tid=21139&amp;fpage=1" target="_blank">http://bbs.51js.com/viewthread.php?tid=21139&amp;fpage=1</a></p>
<p>&nbsp;</p>
作者：泣红亭&nbsp;整理日期：2004年6月15日<br />
<br />
最近在无忧脚本混了一阵子，回复了一些贴子，自己却没有做出什么东东让大家看看，心里有些不安，于是写了下边的一点东西，本来应该发在类封装区的，考虑到那里比较冷，而这篇文章我希望能够帮助到更多的朋友，因此放到这里来了。<br />
<br />
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/js%26%2338%3Bajax%D1%A7%CF%B0">js&amp;ajax学习</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/0502c495808e114bd1135e9b.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109096#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 06 Feb 2007 09:38:10 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109096</link>
        <guid>http://handy.javaeye.com/blog/109096</guid>
      </item>
      <item>
        <title>选定了毕业设计，开始学习</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109097" style="color:red;">http://handy.javaeye.com/blog/109097</a>&nbsp;
          发表时间: 2007年01月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          下学期就要开始毕业设计了，也意味着我们在大学的最后一学期就要来了，刚选好我的毕业设计题目。王峰老师的P2P项目，要求在.Net环境下C#编写，汗，我得从头学这玩意，没办法，从图书馆借来基本大部头，以后要努力看完。 
    
    <br /><b>类别：</b><a href="http://hi.baidu.com/handylee/blog/category/%2Enet">.net</a>&nbsp;<a href="http://hi.baidu.com/handylee/blog/item/16b16938ed333b2396ddd873.html#comment">查看评论</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109097#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 28 Jan 2007 05:25:30 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109097</link>
        <guid>http://handy.javaeye.com/blog/109097</guid>
      </item>
      <item>
        <title>换网站了~~</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109100" style="color:red;">http://handy.javaeye.com/blog/109100</a>&nbsp;
          发表时间: 2004年12月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          用XML+XSL+CSS作了新的网站，全部移到外网上，都可以访问了
<a href="http://lihandi.126.com" target="_blank">http://lihandi.126.com</a>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109100#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 30 Dec 2004 00:46:42 +0800</pubDate>
        <link>http://handy.javaeye.com/blog/109100</link>
        <guid>http://handy.javaeye.com/blog/109100</guid>
      </item>
      <item>
        <title>我20了</title>
        <author>handy</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://handy.javaeye.com">handy</a>&nbsp;
          链接：<a href="http://handy.javaeye.com/blog/109101" style="color:red;">http://handy.javaeye.com/blog/109101</a>&nbsp;
          发表时间: 2004年11月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span id="diary_group_textDIV" style="line-height: 150%;">在20周岁的夜里，我竟然又做梦了，而且，梦到的是我们在一起，在一起～.<br />
但在梦里的我好像并不快乐，因为我骨子里已经认定了这种不可能性，因此即使是在梦里我也知道这只是一个梦。<br />
果然，早上睁开眼睛，看到那白色单调的天花板，出了口气，又一个梦，一个梦而已&nbsp;<br />
&nbsp;<br />
<br />
--------------------------------------------------------------------------------<br />
&nbsp;<br />
&nbsp;2004-11-22&nbsp;晴&nbsp;&nbsp;<br />
<a href="http://www.blogcn.com/User11/handylee/Upload/2004112572812.jpg" target="_blank"><img src="http://www.blogcn.com/User11/handylee/Upload/2004112572812.jpg" border="0" onload="if(this.width&gt;screen.width/2)this.width" alt="" /></a><br />
昨天重装了系统，感觉不错，昨晚又喝多了，真是的，小汪老婆来了还没和人家喝过，所以就喝了，现在我想去吃碗面，要点菜，喝点酒，对自己说句&ldquo;生日快乐&rdquo;.&nbsp;<br />
&nbsp;&nbsp;&nbsp;我终于二十了～,告别那个TEEN-AGES.<br />
&quot;时间亮出了剪刀，于是我开始把回忆拼贴起来，我走过的岁月，虽然将变成蒙太奇式的短暂孤寂，但我深信我曾经经历的，将耀映成一路上无尽蔓延的光芒&quot;。</span>
          <br/>
          <span style="color:red;">
            <a href="http://handy.javaeye.com/blog/109101#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a 