<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>jelly</title>
    <description>热衷技术</description>
    <link>http://jelly.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>Dojo 客户端性能优化</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/200458" style="color:red;">http://jelly.javaeye.com/blog/200458</a>&nbsp;
          发表时间: 2008年06月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Dojo 客户端调优的方式：</p>
<h3>1. 编译合适的dojo文件。</h3>
<p>dojo十分&ldquo;巨大&rdquo;， 而且有很多文件是最终用户不需要使用的。</p>
<p>默认情况下的dojo.js 比较大，有200多k，但是如果自定义进行编译之后可能只有10多k。</p>
<p>而且将常用的模块编译到dojo.js 也能提高效率。</p>
<p>dojo的加载顺序如下：</p>
<p>&nbsp; 1). 浏览器加载dojo.js </p>
<p>&nbsp;&nbsp;&nbsp; dojo bootstrp code</p>
<p>&nbsp;&nbsp;&nbsp; dojo loader</p>
<p>&nbsp;&nbsp;&nbsp; (optionally) frequently used modules</p>
<p>&nbsp;</p>
<p>&nbsp; 2). dojo.js&nbsp;激活Dojo对象， 动态的载入其他的module，如果模块已经载入，那么将不会再一次重新载入。</p>
<p>&nbsp;</p>
<p>dojo 提供了一系列典型的编译方案可以选择。</p>
<p>dojo 的编译可以减少文件的下载数目，可以使文件大小显著的减少。</p>
<p>&nbsp;</p>
<h3>2. 减少widget的使用。</h3>
<p>&nbsp; 每加载一个dojo 的widget都需要额外的时间，所以当然使用越少dojo控件，速度就越快。</p>
<p>&nbsp;</p>
<h3>3. 使用新版本的dojo，建议1.0以上。</h3>
<p>&nbsp; 新版本对性能进行了优化，减少了bug，所以尽量选用新的稳定版本。</p>
<p>&nbsp;</p>
<h3>4. 减少html tag，每增加一个tag，性能的负担就越重，比如</h3>
<p>&nbsp; 使用&lt;table&gt;&lt;tr&gt;&lt;td&gt;xxxxxxx&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</p>
<p>就不如用&lt;div&gt;xxxxxxx&lt;/div&gt;</p>
<p>&nbsp;</p>
<h3>5. 优化widget的加载&nbsp; </h3>
<p>&nbsp;dojo在页面加载的时候将分析整个HTML文件，自动加载指定的内容为dojo控件。即使你没有定义任何dojo控件。所以优化widget的控件能够显著的提升一个页面加载的性能。</p>
<p>如果页面载入花费的时间比较多，你觉得不正常，可以用Firebug 看看是不是页面载入的时候花费很多时间在dj_load_init() 或者 modulesLoaded() 这些地方，这些都是明显的信号表明我们需要留意widget的加载问题。</p>
<p>&nbsp;</p>
<p>dojo提供了多种方式来控制widget的加载。其中最重要的就是它提供了跳过所有widget 解析的方法，只需要加入下面的代码到dojo.js 引入之前：</p>
<p>&nbsp;</p>
<pre name="code" class="js">&lt;script&gt; 
  djConfig = { parseWidgets: false, searchIds: [] }; 
&lt;/script&gt;</pre>
<p>&nbsp;</p>
<p>那么如果需要解析一部分widget怎么办呢？ 下面的方法可以指定需要解析那些widget。只需要将需要解析的widget的id放到searchIds：</p>
<p>&nbsp;</p>
<pre name="code" class="js">&lt;script type="text/javascript"&gt; 
  djConfig = { parseWidgets: false, searchIds: ["info", "confirmation"] }; 
&lt;/script&gt; 
&lt;script type="text/javascript" xsrc="dojo.js"&gt;&lt;/script&gt; 
... 
&lt;div dojoType="dialog" id="confirmation"&gt;...&lt;/div&gt; 
... 
&lt;div dojoType="dialog" id="info"&gt;...&lt;/div&gt; 
... 
&lt;input dojoType="dropdowndatepicker" value="2007-01-31" id="from_date"&gt; 
&lt;script&gt;djConfig.searchIds.push("from_date");&lt;/script&gt;  
 
...</pre>
<p>&nbsp;上面的代码一共解析了3个dojo widget，其中前两个直接放到searchIds ，而第三个则动态的加入到searchIds。</p>
<p>&nbsp;</p>
<p>如果你不喜欢searchIds 的方式， 还有一种方式提供选择，给控件加上parseWidgets='false'属性：</p>
<p>&nbsp;</p>
<pre name="code" class="js">&lt;div parseWidgets="false"&gt; 
   Dojo widget parser 将不会运行到这里，因为我们已经告诉他忽略这里。 
   ... 
&lt;/div&gt; 
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>通过上面的方式，相信 你的dojo性能能够得到显著的提升，如果仍然达不到性能要求，那么可能你只能放弃dojo，或者让客户进行机器的升级了。<img src="../../../images/smiles/icon_wink.gif" alt="" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/200458#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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, 05 Jun 2008 12:05:30 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/200458</link>
        <guid>http://jelly.javaeye.com/blog/200458</guid>
      </item>
      <item>
        <title> 使用Dojo的痛苦经历</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/195060" style="color:red;">http://jelly.javaeye.com/blog/195060</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>2007年6月项目准备开始了，刚来到一个新的项目组，什么都是新的，除了我自己。</p>
<p>需要一个新的框架来开发项目，香港的同事决定使用Dojo，DWR， 我开始学习使用dojo，时间很短，但是我还是基本上熟悉了dojo的基本控件和架构。在此基础上搭建起了项目的基本框架。这是一个单页面，基于ajax和dojo widget的系统，一切都那么的新奇，又充满挑战，但是既然dojo有这么多后台，又有香港同事的推荐，我显得自信满满。</p>
<p>框架搭建的同事，也开始后了紧锣密鼓的招兵买马，一起都像是从零开始。陆陆续续，招了5个程序员和一个测试员。开始了整个项目的快速开发，由于需求由香港负责，而且需求做的比较细致，基本上问题很少。Dojo 却是麻烦不断。</p>
<p>首先的一个坏消息是当我们做完了几乎全部300个页面的时候，dojo宣布0.43不在得到支持，取而代之是完全不同的dojo0.9。 而且dojo0.9 还不是稳定的版本，问题多多，让我们骑虎难下，最后还是决定按兵不动。 随之而来，是dojo1.0，dojo1.1 的陆续发布，但是一直都无法让我看到希望的曙光。 与之相对的是ext在国内的广泛使用和热烈追捧。</p>
<p>Dojo 的控件有很多奇怪的地方，日期选择控件的行为非常怪异，与国内的使用习惯很不相同。而且样式极其丑陋，当字体放大缩小的时候更是丑陋。显示的格式和保存的格式需要分别指定。我们修改了大量的代码。</p>
<p>dojo 的下拉框也被用户投诉，过滤之后一定要再选择一次或者按回车才能选定结果，前台值和后台值分开操作也带来很多不变。</p>
<p>dojo 的验证文本框颜色现实有bug，我们不得不修改代码</p>
<p>dojo的对话框也有问题，对话框中无法在弹出对话框。对话框的操作和控制很不灵活。</p>
<p>js代码不利于管理，容易发生命名冲突。</p>
<p>&nbsp;</p>
<p>致命的问题发生在项目的后期，在客户的系统进行测试时发现。dojo的性能非常差，在赛扬2G的电脑上，一个页面显示的时间竟然需要17秒。简直就是噩梦。</p>
<p>另外使用dojo的对话框时出现cpu占用100%而且一直不回落下来。</p>
<p>页面载入完成的时候，它有将整个页面重新刷新一次，又需要花费额外的5到8s时间，不仅花费更多的时间，而且严重影响客户体验。</p>
<p>&nbsp;</p>
<p>还有开发过程中碰到的无数问题，虽然一个一个被解决，但是无疑是一次一次痛苦的煎熬。</p>
<p>&nbsp;</p>
<p>最后，在性能面前，我被dojo彻底打败，如此的速度是任何客户都无法忍受的，客户不可能为了这个系统全部升级电脑cpu。而且还有很多未知的问题可能还没有被发觉，不如内存泄露，可能导致资源耗尽，内存耗尽。cpu 的占用可能在使用时间长了之后越来越高，等等，这些都是我担心的问题。</p>
<p>&nbsp;</p>
<p>使用Ajax或者说Rich client，一定要谨慎啊。使用新的技术和框架，一定要谨慎，这是我的教训，希望给同行们一个参考。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/195060#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 May 2008 00:23:41 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/195060</link>
        <guid>http://jelly.javaeye.com/blog/195060</guid>
      </item>
      <item>
        <title>对于oracle进行简单树查询(递归查询)</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/191016" style="color:red;">http://jelly.javaeye.com/blog/191016</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>对于oracle进行简单树查询(递归查询)</h1>
<p>
<table border="0">
<tbody>
<tr>
<td>DEPTID</td>
<td>PAREDEPTID</td>
<td>NAME</td>
</tr>
<tr>
<td>NUMBER</td>
<td>NUMBER</td>
<td>CHAR (40 Byte)</td>
</tr>
<tr>
<td>部门id</td>
<td>父部门id(所属部门id)</td>
<td>部门名称</td>
</tr>
</tbody>
</table>
</p>
<p>通过子节点向根节点追朔.</p>
<pre name="code" class="sql"> select * from persons.dept start with deptid=76 connect by prior paredeptid=deptid </pre>
<p>&nbsp;</p>
<p>通过根节点遍历子节点. </p>
<pre name="code" class="sql">select * from persons.dept start with paredeptid=0 connect by prior deptid=paredeptid </pre>
<p>&nbsp;</p>
<p>可通过level 关键字查询所在层次. </p>
<pre name="code" class="sql">select a.*,level from persons.dept a start with paredeptid=0 connect by prior deptid=paredeptid </pre>
<p>&nbsp;</p>
<p>再次复习一下:start with ...connect by 的用法， start with 后面所跟的就是就是递归的种子。 </p>
<p>递归的种子也就是递归开始的地方 connect by 后面的"prior" 如果缺省：则只能查询到符合条件的起始行，并不进行递归查询； </p>
<p>connect by prior 后面所放的字段是有关系的，它指明了查询的方向。 </p>
<p>练习： 通过子节点获得顶节点 </p>
<pre name="code" class="sql">select FIRST_VALUE(deptid) OVER (ORDER BY LEVEL DESC ROWS UNBOUNDED PRECEDING) AS firstdeptid from persons.dept start with deptid=76 connect by prior paredeptid=deptid</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/191016#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 12:44:49 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/191016</link>
        <guid>http://jelly.javaeye.com/blog/191016</guid>
      </item>
      <item>
        <title>一用subclipse 就导致eclipse莫名奇妙的退出（crash）</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/172884" style="color:red;">http://jelly.javaeye.com/blog/172884</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天碰到一个非常郁闷的问题，eclipse突然不能使用svn的插件subclipse了，只要跟svn相关的操作，比如更新，上传，同步都执行不了，而且导致eclipse 崩溃。<br /><br />开始我怀疑是eclipse 的版本跟svn客户端的版本不兼容，使用了新版的eclipse，还是同样存在，使用新版的TortoisSVN ，问题依旧。使用新版的subclipse，问题依旧，简直郁闷死了。<br /><br />在网上终于找到的解决的办法，答案简直太出人意料之外了，原来跟我在本机上新安装的subvesion服务器有关系，安装这个服务器只不过是为了试试最新版的subversion的安装，但是项目的subversion服务器还是没有改动的。所以没有想到问题会处在这里。安装subversion服务器的时候会注册环境变量APR-ICONV， 可能subclipse会用到这个环境变量，而这个环境变量配置和subclipse所需要使用的APR-ICONV 在版本上是不兼容的。<br /><br />长话短说，解决办法就是在windows的环境变量的设置里面将所有的APR_ICONV_PATH  改为 APR_ICONV1_PATH 。<br /><br /><br />官方的参考文档：<br />As soon as I do something with Subclipse on Windows, Eclipse just crashes. Why does this happen? <br /><br />http://subclipse.tigris.org/faq.html#win32-crash
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/172884#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 11:46:07 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/172884</link>
        <guid>http://jelly.javaeye.com/blog/172884</guid>
      </item>
      <item>
        <title>资源和权限管理</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/154107" style="color:red;">http://jelly.javaeye.com/blog/154107</a>&nbsp;
          发表时间: 2008年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          web应用程序的安全涉及到认证和授权。 <br />这里讲的是授权相关的部分。 <br />web程序在不同的页面中跳转。 <br />web程序的资源分类： <br />图片，css，网页，js代码，按钮。 <br /><p>&nbsp;</p><p>涉及的问题：</p><p>导航，树，返回，前进，书签，安全，资源，日志。</p><p>&nbsp;</p><p>对于用户来说，web程序就是在不同的页面之间跳转。</p><p>对于程序，常常有必要记录用户的这些操作。--相关应用：返回，前进，书签，日志。</p><p>当用户访问某个页面的时候，需要验证用户是否有权限访问页面，是否能够保存页面数据等操作，这就涉及的安全和资源的关系。我们需要将页面，页面按钮等定义为可用的资源，通过资源跟用户或者用户组，或者角色（role）对应来定义权限的规则。</p><p>&nbsp;</p><p>每个页面应该都有导航条，因为我们的web结构就像一个网，如果简化一下，就是一棵树，当访问每个页面时，我们是逐层进入的，通过导航条，能够给用户友好的提示，通过导航条的链接，用户可以很容易的返回上一级页面。</p><p>&nbsp;</p><p>通过树，用户可以对网站结构有一个宏观的概览，用户方便的进入一个特定的页面。</p><p>&nbsp;</p><p>通过上面的分析，我发现，对资源的组织，首先就是要将零散的资源组织到我们的树型数据结构中。</p><p>对于资源，应该分类，分级的进行控制。</p><p>&nbsp;</p><p>首先最常用的资源单元应该页面。对页面进行编号，是首当其冲的步骤。</p><p>将页面根据业务逻辑组织成树形的结构，看起来就是一个site map。站点导航图。</p><p>通过导航图，我们能做成树菜单，生成导航条。</p><p>&nbsp;</p><p>要跟踪用户，进行日志和控制前进，后退按钮。就必须用一个数据结构，保存用户的访问路径。</p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/154107#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Tue, 08 Jan 2008 18:46:40 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/154107</link>
        <guid>http://jelly.javaeye.com/blog/154107</guid>
      </item>
      <item>
        <title>体验dojo强大的grid控件——简单示例剖析</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/147575" style="color:red;">http://jelly.javaeye.com/blog/147575</a>&nbsp;
          发表时间: 2007年12月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Dojo 从 v1.0 开始引入了一个功能强大，快速，健壮的控件--Grid。</p>
<p>Grid 在dojo的体系结构中属于Dojox 这个包中。</p>
<p>这个Grid 比较灵活，可以排序，过滤，编辑，多表头，支持多种Cell 控件。</p>
<p>官方文档的地址：<font face="Arial"><a href="http://dojotoolkit.org/book/dojo-book-0-9/docx-documentation-under-development/grid">http://dojotoolkit.org/book/dojo-book-0-9/docx-documentation-under-development/grid</a></font></p>
<p>通过官方的示例文档，我进行了一次精彩的体验，在这里和大家分享一下我的体验心得。</p>
<p>&nbsp;要完成一个Grid，需要下面几个步骤，每个步骤都是必不可少的。</p>
<p><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><strong>1. 首先是导入样式表</strong></span></p>
<p><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">没有样式表，就无法显示漂亮的列表出来，你看到的将是丑陋的静态文本。</span></p>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">
<div class="code_title">css 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-css">
    <li class="alt"><span><font face="Courier New" style="BACKGROUND-COLOR: #fafafa">&lt; style type=&quot;text/css&quot;&gt;</font></span></li>
    <li class=""><span>@import&nbsp;</span><span class="string">&quot;http://localhost/dojo/dojox/grid/_grid/tundraGrid.css&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>@import&nbsp;</span><span class="string">&quot;http://localhost/dojo/dijit/themes/tundra/tundra.css&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>@import&nbsp;http://localhost/dojo/dojo/resources/dojo.css &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&lt; / style&gt;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><strong>2. <font face="Arial">模型（Model）</font></strong></span></p>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><span lang="EN" style="COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-size: 10.5pt">Model</span></strong><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">指的是什么意思呢？</span><span lang="EN" style="mso-ansi-language: EN"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 120%"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">大家应该都熟悉</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">MVC</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模式，</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">MVC</font></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">模式是</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial">&quot;Model-View-Controller&quot;</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">的缩写，中文翻译为</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial">&quot;</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">模型</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial">-</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">视图</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial">-</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">控制器</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial">&quot;</span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">。</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">MVC</font></span><span style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial">应用程序总是由这三个部分组成。</span><span lang="EN-US" style="FONT-SIZE: 10pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; LINE-HEIGHT: 120%"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">视图</span><span lang="EN-US" style="FONT-FAMILY: Verdana">(View)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">代表用户交互界面</span><span lang="EN-US" style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 120%; FONT-FAMILY: Arial"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><span lang="EN" style="COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-size: 10.5pt">Model</span></strong><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">就是业务流程</span><span lang="EN-US" style="FONT-FAMILY: Verdana">/</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana">状态的处理以及业务规则的制定</span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">grid </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">里面也就是其所包含的数据。</span><span lang="EN" style="mso-ansi-language: EN"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN" style="mso-ansi-language: EN"><o:p><font face="Times New Roman">&nbsp;</font></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">每个</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">grid </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">都会包含数据，所以每个</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">grid </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">开头就是</span><span style="mso-ansi-language: EN"><font face="Times New Roman"> </font></span><strong><span lang="EN" style="COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-size: 10.5pt">Model </span></strong><span style="COLOR: #232323; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-weight: bold; mso-bidi-font-family: Arial; mso-bidi-font-size: 10.5pt">的定义。</span><span lang="EN" style="COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-weight: bold; mso-bidi-font-size: 10.5pt"><o:p></o:p></span></p>
<p><span lang="EN" style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-weight: bold; mso-font-kerning: 1.0pt; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Model </span><span style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-weight: bold; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">的定义一般包含两个</span><span lang="EN" style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-bidi-font-weight: bold; mso-font-kerning: 1.0pt; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">div </span><span style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-weight: bold; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">标签。</span></p>
<span style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-weight: bold; mso-font-kerning: 1.0pt; mso-bidi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">
<div class="code_title">&nbsp;代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">dojoType</span><span>=</span><span class="attribute-value">&quot;dojo.data.ItemFileReadStore&quot;</span><span>&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">jsId</span><span>=</span><span class="attribute-value">&quot;jsonStore&quot;</span><span>&nbsp;</span><span class="attribute">url</span><span>=</span><span class="attribute-value">&quot;gridData.txt&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag"><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">dojoType</span><span>=</span><span class="attribute-value">&quot;dojox.grid.data.DojoData&quot;</span><span>&nbsp;</span><span class="attribute">jsId</span><span>=</span><span class="attribute-value">&quot;model&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">rowsPerPage</span><span>=</span><span class="attribute-value">&quot;20&quot;</span><span>&nbsp;</span><span class="attribute">store</span><span>=</span><span class="attribute-value">&quot;jsonStore&quot;</span><span>&nbsp;</span><span class="attribute">query</span><span>=</span><span class="attribute-value">&quot;{&nbsp;namespace:&nbsp;'*'&nbsp;}&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="tag"><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font color="#000000"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">第一个</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Div</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义数据。</span><span lang="EN" style="mso-ansi-language: EN"><o:p></o:p></span></font></p>
<p><font color="#000000"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">第二个</span><span new="" times="" lang="EN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ">Div </span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">定义</span><span new="" times="" lang="EN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ">Grid </span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">的数据适配器，将数据装换为</span><span new="" times="" lang="EN" style="FONT-SIZE: 10.5pt; FONT-FAMILY: ">Gird </span><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">的</span></font><strong><span lang="EN" style="FONT-SIZE: 10.5pt; COLOR: #232323; FONT-FAMILY: Arial; mso-ansi-language: EN; mso-font-kerning: 1.0pt; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-fareast-font-family: 宋体">Model</span></strong><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font color="#000000">。</font></span></p>
<p><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font color="#000000"></font></span></p>
<p><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"></span></p>
<p><strong>3<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">. <font face="Arial"><font face="Arial">视图（View</font>）</font></span></strong></p>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font color="#000000"><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">View </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用来定义每个数据列，一个view是多个数据列的组合。通过定义view，使Grid按照要求来显示数据。下面是一个简单的</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">view</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">定义。</span></font></p>
<font color="#000000"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span>//&nbsp;a&nbsp;grid&nbsp;view&nbsp;is&nbsp;a&nbsp;group&nbsp;of&nbsp;columns &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>var&nbsp;</span><span class="attribute">view1</span><span>&nbsp;=&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cells:&nbsp;[[ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{name:&nbsp;'Namespace',&nbsp;field:&nbsp;&quot;namespace&quot;},&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{name:&nbsp;'Class',&nbsp;width:&nbsp;&quot;25em&quot;,&nbsp;field:&nbsp;&quot;className&quot;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{name:&nbsp;'Summary',&nbsp;colSpan:&quot;2&quot;,&nbsp;field:&nbsp;&quot;summary&quot;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;] &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;] &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong>4<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">. <font face="Arial"><font face="Arial"><font face="Arial">Structure</font></font></font></span></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"><font face="Arial">Structure 是view的集合，也就是说可以将多个view组合成一个view。</font></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"><font face="Arial">Structure 会被Grid用到，而view不会被Grid直接用到，而是被包装成一个Structure来使用。</font></font></span></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial">下面使一个Structure的例子：</font></span></span></p>
<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;layout&nbsp;=&nbsp;[&nbsp;view1&nbsp;];&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong>5<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt">. <font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial">Grid 控件（Widget）</font></font></font></font></span></strong></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><strong><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></strong></p>
<strong><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></strong>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 21pt"><font face="Times New Roman"><strong style="mso-bidi-font-weight: normal"><span lang="EN" style="mso-ansi-language: EN">Widget</span></strong><span lang="EN" style="mso-ansi-language: EN"> </span></font><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Grid</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件，通过定义</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Grid</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件，我们就能将</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Grid</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">放置到我们的页面上面了。通过</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Grid </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将上面定义的</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Structure </font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">model</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">组装起来，从而按照我们定义的样子（</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Structure</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），载入我们需要的数据（</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">model</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），显示出一个</span><span lang="EN" style="mso-ansi-language: EN"><font face="Times New Roman">Gird</font></span><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列表。</span><span lang="EN" style="mso-ansi-language: EN"><o:p></o:p></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">div</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;grid&quot;</span><span>&nbsp;</span><span class="attribute">dojoType</span><span>=</span><span class="attribute-value">&quot;dojox.Grid&quot;</span><span>&nbsp;</span><span class="attribute">model</span><span>=</span><span class="attribute-value">&quot;model&quot;</span><span>&nbsp;</span><span class="attribute">structure</span><span>=</span><span class="attribute-value">&quot;layout&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">div</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
</ol>
</div>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p>以上使开发一个Gird必要的五个步骤，已经介绍完了，下面总结一下他们的关系。</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以看到上面几个部分的依赖关系：</span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><img src="http://jelly.javaeye.com/upload/attachment/pic/10783/123642cb-674b-48ea-a77f-39ed69e7375a-thumb.jpg?1197360666" alt="" /></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial">附件中包含了一个完整的例子。</font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial"></font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><font face="Arial">附件中包含了Grid的运行的样子，非常的Cool。</font></span></p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ansi-language: EN; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-size: 12.0pt"><img src="http://jelly.javaeye.com/upload/attachment/pic/10785/d53d11b5-7378-425e-ab76-83c193f29488-thumb.jpg?1197361183" height="178" alt="图片" width="200" /></span></p>
</span></span></span></font></span></span></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/147575#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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>Tue, 11 Dec 2007 15:38:41 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/147575</link>
        <guid>http://jelly.javaeye.com/blog/147575</guid>
      </item>
      <item>
        <title>Dojo和Ajax 程序的浏览器History 控制</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/146738" style="color:red;">http://jelly.javaeye.com/blog/146738</a>&nbsp;
          发表时间: 2007年12月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>web应用程序都面临浏览器上的history功能的困扰，前进，后退，刷新，将是你的程序失控，重复提交，丢失数据等等场景让你焦头烂额，运行的好好的程序，被客户随便摆弄一下就错误百出。这些就是客户心智和程序员心智不同产生的冲突。</p>
<p>最初的web程序只是一些静态的网页，一般都通过地址栏的URL地址来进行定位，所以，浏览器集成了很方便的History功能，让你在浏览的历史记录中来回切换。可是，随着复杂应用程序开始越来越多的通过浏览器来作为客户端，噩梦就开始了。</p>
<p>近年来，Ajax技术的兴起为程序设计者和客户提供了不同的技术实现和用户体验，Ajax火了起来，也开始颠覆了传统的web操作和应用传统。但是浏览器并没有相应的来迎合这些变化，这样的话， Ajax 程序也同样的面临浏览器的干扰，而History功能就是其中让人头疼的一个。</p>
<p>越来越多的程序员面临这个问题，开始考虑解决之道，解决的方案五花八门，不过都这能解决问题的一部分，无法从根本上解决这个问题。要根本解决这个问题，只怕需要浏览器的厂商和标准部门针对Ajax一起来想出一个标准化的处理方式。</p>
<p>当然我们没有时间来等待别人来帮助我们解决问题，我这里介绍一下Dojo 解决这个问题的方法，同时研究一下它的实现原理。</p>
<h4>需要解决的问题</h4>
<p>Ajax程序进行页面内容变化的时候，并没有刷新整个页面也没有改变浏览器地址，所以如果进行以下的操作将会出现无法意料的问题：</p>
<p>行为案例：1<strong>search 页面</strong>--2<font color="#ff0000">search</font>--&gt;3显示列表在本页面--4<font color="#ff0000">点击列表中的某条记录</font>--5页面切换--&gt;6<strong>所选记录的详细内容页面</strong>--&gt;7<font color="#ff0000">编辑并保存</font>--&gt;8停留在原页面，提示保存成功--&gt;9<font color="#ff0000">返回</font>--.10页面切换--&gt;11<strong>search页面</strong></p>
<p><strong>上面的步骤都不会导致浏览器地址变化，因为我们的应用是单页面的frame。</strong></p>
<p>这个案例涉及到两个页面（<strong>黑体 1，6</strong>），4 个动作（<font color="#ff0000">红色 2,4,7,9</font>）</p>
<p>后退/ 前进： 如果在step6的时候，如果浏览器的后退按钮可以点击的话（一般如果你之前没有访问过别的url，那么将不会有后退地址），将不会回到3或者1，而是1之前你访问过的地址。</p>
<p>刷新：如果在step6的时候，你点击刷新，将不会刷新step6所在的页面，因为浏览器的地址没有发生变化，你会发现，页面刷新之后来到了step1.</p>
<p>收藏： 同上，你收藏的step1所在的页面。</p>
<p>客户看到他花钱买的程序却是这样的行为，客户岂不是要疯掉！！！</p>
<h4>解决之道</h4>
<p>1. dojo</p>
<span><span><span><span><span><span><span><span><span><span><span><span><span><span><span><font face="Courier New"></font>
<p>&nbsp;dojo1.0 提供dojo.back 对象来处理这里问题，可以记录页面状态到一个堆栈对象（<font face="Arial">historyStack</font>）中。但是这个<font face="Arial">historyStack开始是空的，当我们进入的首页的时候，可以通过<font face="Arial">setInitialState 方法设置他的第一个状态，如 </font></font><font face="Arial"><font face="Arial"></font></font></p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c">
    <li class="alt"><span><span>dojo.back.setInitialState(currentState)；&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>之后每一次页面状态变化，你都可以将这个状态用书签记录下来，如</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c">
    <li class="alt"><span><span>dojo.back.addToHistor(currentState);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>state 代表你需要记录的页面状态，一般包括下面几个属性：</p>
<p><font face="Arial">back 函数&nbsp;&nbsp;//当用户点击后退按钮，并且跳转到这个状态的时候将被调用。<br />
forward 函数&nbsp;&nbsp;//&nbsp;&nbsp;当用户点击前进按钮，并且跳转到这个状态的时候将被调用。<br />
changeUrl 布尔类型或者字符串 布尔类型指示是否为当前状态创建一个唯一的hash值 如果是一个字符串，那么将使用这个字符串而不是hash值。</font> </p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;state&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;back:&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;alert(</span><span class="string">&quot;Back&nbsp;was&nbsp;clicked!&quot;</span><span>);&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dojo.back.addToHistory（repeatState);&nbsp;}, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;forward:&nbsp;</span><span class="keyword">function</span><span>()&nbsp;{&nbsp;alert(</span><span class="string">&quot;Forward&nbsp;was&nbsp;clicked!&quot;</span><span>);&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;};&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>dojo 的back对象将会在用户点击浏览器后退按钮的时候自动将当前state从<font face="Arial">historyStack中Pop出来。同时进入到前一个state。</font></p>
<p>下面摘选自dojo库的back.js</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="keyword">function</span><span>&nbsp;handleBackButton(){ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//summary:&nbsp;private&nbsp;method.&nbsp;Do&nbsp;not&nbsp;call&nbsp;this&nbsp;directly. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//The&nbsp;&quot;current&quot;&nbsp;page&nbsp;is&nbsp;always&nbsp;at&nbsp;the&nbsp;top&nbsp;of&nbsp;the&nbsp;history&nbsp;stack. </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//console.debug(&quot;handlingBackButton&quot;); </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;current&nbsp;=&nbsp;historyStack.pop(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!current){&nbsp;</span><span class="keyword">return</span><span>;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">var</span><span>&nbsp;last&nbsp;=&nbsp;historyStack[historyStack.length-1]; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!last&nbsp;&amp;&amp;&nbsp;historyStack.length&nbsp;==&nbsp;0){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;=&nbsp;initialState; &nbsp;&nbsp;</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;</span><span class="keyword">if</span><span>(last){ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(last.kwArgs[</span><span class="string">&quot;back&quot;</span><span>]){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last.kwArgs[</span><span class="string">&quot;back&quot;</span><span>](); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(last.kwArgs[</span><span class="string">&quot;backButton&quot;</span><span>]){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last.kwArgs[</span><span class="string">&quot;backButton&quot;</span><span>](); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span class="keyword">else</span><span>&nbsp;</span><span class="keyword">if</span><span>(last.kwArgs[</span><span class="string">&quot;handle&quot;</span><span>]){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last.kwArgs.handle(</span><span class="string">&quot;back&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forwardStack.push(current); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//console.debug(&quot;done&nbsp;handling&nbsp;back&quot;); </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>完整的例子，请看dojo1.0的发行包里面的back.html（<font face="Arial">dojo/tests/back.html</font>），里面有完成的例子。</p>
<p>&nbsp;</p>
<p>dojo怎么控制到后退按钮的呢？怎么记录书签，其中的奥妙何在呢？那就要看iframe在这里起到什么作用了。</p>
<p>&nbsp;</p>
<div></div>
<p>2. &nbsp;利用iframe 了控制每个页面的书签（<font face="Arial">bookmark</font>）</p>
<p>&nbsp;在页面地址没有变化的情况下，怎么记录书签呢？怎么样让用户能够收藏呢？如果要能够收藏，地址一定要变化，但是地址变化的时候又要确保页面的内容不发生变化。How to do? </p>
<p>Yes, Use # , 增加书签到地址后面，如: <a href="http://yourdomain/yourpage#bookmark">http://yourdomain/yourpage#bookmark</a>&nbsp;这样的话，地址栏变化了，那么后退按钮也就有了历史记录了。别高兴的太早，Ie并不是这样。Ie并不会将<a href="http://yourdomain/yourpage#bookmark">http://yourdomain/yourpage#bookmark</a>和<a href="http://yourdomain/yourpage">http://yourdomain/yourpage</a>认为是两个页面，所以也就不会加入到History中，怎么处理这个问题呢？iframe在这里派上作用拉。通过设置iframe的src属性可以让Ie将这些状态记录到history中。</p>
<p>&nbsp;</p>
<p>参考：<font face="Arial"><a href="http://www.contentwithstyle.co.uk/Articles/38/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps">http://www.contentwithstyle.co.uk/Articles/38/fixing-the-back-button-and-enabling-bookmarking-for-ajax-apps</a></font></p>
<p>&nbsp;<font face="Arial">http://codinginparadise.org/weblog/2005/09/ajax-history-libraries.html</font></p>
<div class="code_title">js 代码</div>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/146738#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</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, 07 Dec 2007 16:56:19 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/146738</link>
        <guid>http://jelly.javaeye.com/blog/146738</guid>
      </item>
      <item>
        <title>Dojo, 从0.43 向1.0 迁移（二）widget 变化列表</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/146605" style="color:red;">http://jelly.javaeye.com/blog/146605</a>&nbsp;
          发表时间: 2007年12月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>
<table cellspacing="0" border="1" x:str="" align="left" summary="" width="512" cellpadding="0" style="BORDER-COLLAPSE: collapse">
    <caption>widget change list</caption><colgroup><col style="WIDTH: 107pt" width="143" /><col style="WIDTH: 94pt" width="125" /><col style="WIDTH: 149pt" width="199" /><col style="WIDTH: 54pt" span="3" width="72" /></colgroup>
    <tbody>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:num="" height="19" align="right" width="143" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 107pt; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: silver"><strong>0.43</strong></td>
            <td width="125" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 94pt; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: silver"><strong>　</strong></td>
            <td width="199" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 149pt; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: silver"><strong>　<strong>1.0.1</strong></strong></td>
            <td width="72" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 54pt; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: silver">&nbsp;</td>
            <td width="72" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 54pt; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: silver"><strong>　</strong></td>
            <td width="72" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; WIDTH: 54pt; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: silver"><strong>　</strong></td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">Button</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;</td>
            <td>dijit.form.Button</td>
            <td>&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="textbox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">textbox&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;</td>
            <td>dijit.form.TextBox</td>
            <td>&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="checkbox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">checkbox&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;</td>
            <td>dijit.form.CheckBox</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="combobox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">combobox&nbsp; </td>
            <td x:str="dijit.form.FilteringSelect or dijit.form.ComboBox  " colspan="4" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijit.form.FilteringSelect or dijit.form.ComboBox&nbsp;&nbsp;</td>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="emailtextbox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">emailtextbox&nbsp;</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijit.form.ValidationTextBox</td>
            <td>&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="integertextbox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">integertextbox&nbsp;</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijit.form.ValidationTextBox</td>
            <td>&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="realnumbertextbox " height="19" colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">realnumbertextbox&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.form.NumberTextBox</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="regexptextbox " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">regexptextbox&nbsp;</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dijit.form.ValidationTextBox</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="validationtextbox " height="19" colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">validationtextbox&nbsp;</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.form.ValidationTextBox</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="form " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">form&nbsp;</td>
            <td x:str="dijit.form.Form " style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.form.Form&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="dropdowndatepicker " height="19" colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">dropdowndatepicker&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.form.DateTextBox</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="layoutcontainer " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">layoutcontainer&nbsp;</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.layout.LayoutContainer</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">SplitContainer</td>
            <td colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.layout.SplitContainer</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="contentpane " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">contentpane&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dojox.layout.ContentPane</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="linkpane " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">linkpane&nbsp;</td>
            <td x:str="dijit.layout.linkpane " style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.layout.linkpane&nbsp;</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="dialog " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">dialog&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">dijit.Dialog</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="modalfloatingpane " height="19" colspan="2" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">modalfloatingpane&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">都修改成dijit.Dialog</td>
        </tr>
        <tr height="19" style="HEIGHT: 14.25pt">
            <td x:str="titlepane " height="19" style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; HEIGHT: 14.25pt; BACKGROUND-COLOR: transparent">titlepane&nbsp;</td>
            <td style="BORDER-RIGHT: #ebe9ed; BORDER-TOP: #ebe9ed; BORDER-LEFT: #ebe9ed; BORDER-BOTTOM: #ebe9ed; BACKGROUND-COLOR: transparent">removed，没有相应的控件</td>
        </tr>
    </tbody>
</table>
&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/146605#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Dec 2007 11:49:47 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/146605</link>
        <guid>http://jelly.javaeye.com/blog/146605</guid>
      </item>
      <item>
        <title>Dojo, 从0.43 向1.0 迁移（一）</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/146572" style="color:red;">http://jelly.javaeye.com/blog/146572</a>&nbsp;
          发表时间: 2007年12月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          公司的项目4月份开始，我们选择了dojo，不为别的，因为他有IBM的支持。当然，我个人认为EXT也是不错的。<br /><br /><br />  其实开源的类库和框架我们公司用的还是很谨慎的，这次能够用上dojo我已经心满意足了。可惜，还是被开源给摆了一道，当我们开发了一大半页面的时候，dojo 1.0 发布了，而且改变很大，我们面临一个选择，继续用0.43还是升级到1.0，公司决定先进行一个评估，这个任务就落在我的头上了。<br /><br /><strong>评估</strong><br />  站在个人的立场上，我当然是希望能够升级到1.0，但是设计到进度和时间的安排，这个评估是必不可少的。<br /><br />  通过分析，我发现dojo控件的 Package 和 dojoType 命名全部都变了，但是这个很容易处理，用全局替换（global replace）就可以处理。麻烦一点的就是一些控件的属性也有变化，庆幸的是这些变化很小。另一方面，就是使用到的dojo函数和变量了，dojo的函数很多，不过因为我们对dojo的研究还不是很深入，所以并没有大量的采用，用的多一点的也就是那么几个，dojo.byId, dojo.widget.byId, dojo.addOnload。最麻烦的就是曾经使用过一个dojo的scriptScope变量_container_, 这个变量在dojo1.0里面没有合适的代替者，通过_container_可以获得js当前的scriptScope，比如contentPane，这样的话，类似_container_.addOnLoad(...)的代码必须改成dojo.widget.byId(widgetId).addOnLoad(...),widgetId在每个页面都是不同的，有一部分页面可能是动态的，同样的，这样的地方不多。<br /><br />  综上，这样的升级还是能够接受的，可以找一个稍微初级一点的程序员也能够搞定。
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/146572#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><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><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 07 Dec 2007 10:47:50 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/146572</link>
        <guid>http://jelly.javaeye.com/blog/146572</guid>
      </item>
      <item>
        <title>用 javascript 处理 JSON</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/138707" style="color:red;">http://jelly.javaeye.com/blog/138707</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          &nbsp;&nbsp;&nbsp; 因为JSON 是 javascript 的一个子集，所以，在javascript 中使用JSON是非常简单的。<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;
<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="keyword">var</span><span>&nbsp;myJSONObject&nbsp;=&nbsp;{</span><span class="string">&quot;bindings&quot;</span><span>:&nbsp;[&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<span class="string">&quot;ircEvent&quot;</span><span>:&nbsp;</span><span class="string">&quot;PRIVMSG&quot;</span><span>,&nbsp;</span><span class="string">&quot;method&quot;</span><span>:&nbsp;</span><span class="string">&quot;newURI&quot;</span><span>,&nbsp;</span><span class="string">&quot;regex&quot;</span><span>:&nbsp;</span><span class="string">&quot;^http://.*&quot;</span><span>},&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<span class="string">&quot;ircEvent&quot;</span><span>:&nbsp;</span><span class="string">&quot;PRIVMSG&quot;</span><span>,&nbsp;</span><span class="string">&quot;method&quot;</span><span>:&nbsp;</span><span class="string">&quot;deleteURI&quot;</span><span>,&nbsp;</span><span class="string">&quot;regex&quot;</span><span>:&nbsp;</span><span class="string">&quot;^delete.*&quot;</span><span>},&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<span class="string">&quot;ircEvent&quot;</span><span>:&nbsp;</span><span class="string">&quot;PRIVMSG&quot;</span><span>,&nbsp;</span><span class="string">&quot;method&quot;</span><span>:&nbsp;</span><span class="string">&quot;randomURI&quot;</span><span>,&nbsp;</span><span class="string">&quot;regex&quot;</span><span>:&nbsp;</span><span class="string">&quot;^random.*&quot;</span><span>}&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;]&nbsp;&nbsp;</span></li>
    <li class=""><span>};&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在上面的例子中，我们创建了只包含一个成员 <span><span></span><span class="string">&quot;bindings&quot; </span></span>的一个对象，<span><span class="string">bindings 则包含了一个由3个对象组成的数组。这3个对象都包含3个成员：</span></span><span><span class="string">&quot;ircEvent&quot;，</span><span> </span><span class="string">&quot;method&quot;</span><span>，</span><span class="string">&quot;regex&quot;。<br />
<br />
在javascript 中， 成员可以通过&ldquo;点号&rdquo;来获取。<br />
比如：<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>myJSONObject.bindings[0].method&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
通过eval() 函数可以将JSON字符串转化为对象。<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;myObject&nbsp;=&nbsp;eval('('&nbsp;+&nbsp;myJSONtext&nbsp;+&nbsp;')');&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
eval 函数非常快，但是它可以编译任何 javascirpt 代码，这样的话就可能产生安全的问题。eval 的使用是基于传入的代码参数是可靠的假设的，有一些情况下，可能客户端是不可信任的。<br />
<br />
如果基于安全的考虑的话，最好是使用一个 </span></span>JSON 解析器。 一个<span><span class="string"> </span></span>JSON 解析器将只接受 JSON 文本。所以是更安全的。<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="keyword">var</span><span>&nbsp;myObject&nbsp;=&nbsp;JSON.parse(myJSONtext,&nbsp;filter);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
可选的 filter 参数将遍历每一个value key 值对， 并进行相关的处理。如：<br />
<br />
<span><span class="string">
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>myData&nbsp;=&nbsp;JSON.parse(text,&nbsp;</span><span class="keyword">function</span><span>&nbsp;(key,&nbsp;value)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
    </span></span>
    <ol>
        <li class="alt"><span><span></span><span class="keyword">return</span><span>&nbsp;key.indexOf('date')&nbsp;&gt;=&nbsp;0&nbsp;?&nbsp;</span><span class="keyword">new</span><span>&nbsp;Date(value)&nbsp;:&nbsp;value;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp; </span></span></li>
    </ol>
    </li>
</ol>
</div>
</span></span><span><span class="string"><br />
</span></span><span><span class="string"><span><span>stringifier 函数的作用跟 parse 相反， 用来将一个js对象转换为 JSON 文本。</span></span></span></span><br />
<span><span class="string">
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span>&nbsp;myJSONText&nbsp;=&nbsp;JSON.stringifier(myObject);&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<br />
这里是一个开源的 </span></span><a href="http://www.json.org/json2.js">JSON parser and JSON stringifier</a>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/138707#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</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>Wed, 07 Nov 2007 11:07:23 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/138707</link>
        <guid>http://jelly.javaeye.com/blog/138707</guid>
      </item>
      <item>
        <title>【转】开源license总结</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/48169" style="color:red;">http://jelly.javaeye.com/blog/48169</a>&nbsp;
          发表时间: 2007年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>摘自：http://opens.itpub.net/post/21577/178341<br />
</h2>
<!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:Description
rdf:about="http://opens.itpub.net/post/21577/178341"
dc:identifier="http://opens.itpub.net/post/21577/178341"
dc:title="开源license总结"
trackback:ping="http://blog.itpub.net//trackback.php?id=178341" /></rdf:RDF> -->
<p class="date">opens | 02 八月, 2006 15:36</p>
文中主要介绍了关于开源的各种许可协议。<br />
<p><span>（</span><span>1</span><span>）</span><span>Contributors </span><span>和</span><span> Recipients<br />
Contributors </span><span>指的是对某个开源软件或项目提供了代码（包括最初的或者修改过的）发布的人或者实体（团队、公司、组织等），</span><span>Contributors </span><span>按照参与某个软件开源的时间先后，可以分为</span><span>an initial Contributor </span><span>和</span><span> subsequent Contributors </span><span>。</span><span><br />
Recipients</span><span>指的是开源软件或项目的获取者，显然，</span><span>subsequent Contributors </span><span>也属于</span><span> Recipients</span><span>之列。</span><span><br />
</span><span>（</span><span>2</span><span>）</span><span>Source Code </span><span>和</span><span> Object Code<br />
Source Code </span><span>指的是各种语言写成的源代码，通过</span><span>Source Code</span><span>，结合文档，</span><span> </span><span>可以了解到整个软件的体系结构及具体到某个功能函数的实现方法等。</span><span><br />
Object Code </span><span>指的是</span><span>Source Code </span><span>经过编译之后，生成的类似于</span><span>&ldquo;</span><span>类库</span><span>&rdquo;</span><span>一样的，提供各种接口供他人使用的目标码，按我的理解，它就是像常见的</span><span>DLL</span><span>、</span><span>AtiveX</span><span>、</span><span>OCX</span><span>控件性质的东西。（不知道这样理解对不对）</span><span></span><span>分清楚这两个概念的目的在于，有些开源，只发布</span><span>Object Code </span><span>，当然，大多数发布的是</span><span>Source Code</span><span>。很多协议也对</span><span> &ldquo;</span><span>你发布的是哪种</span><span>Code</span><span>的时候应该怎样</span><span>&rdquo;</span><span>，有着明确的约束。</span><span><br />
</span><span>（</span><span>3</span><span>）</span><span>Derivative Module </span><span>和</span><span> Separate Module<br />
Derivative Module </span><span>指的是，依托或包含</span><span>&ldquo;</span><span>最初的</span><span>&rdquo;</span><span>或者</span><span>&ldquo;</span><span>从别人处获取的</span><span>&rdquo;</span><span>开源代码而产生的代码，是原</span><span>&ldquo;</span><span>源代码</span><span>&rdquo;</span><span>的增强（不等于增加）、改善和延续的模块，意为</span><span>&ldquo;</span><span>衍生模块</span><span>&rdquo;</span><span>。</span><span><br />
Separate Module </span><span>指的是，参考或借助原</span><span>&ldquo;</span><span>源代码</span><span>&rdquo;</span><span>，开发出的独立的，不包含、不依赖于原</span><span>&ldquo;</span><span>源代码模块</span><span>&rdquo;</span><span>，意为</span><span>&ldquo;</span><span>独立的模块</span><span>&rdquo;</span><span>。</span><span></span><span>理解这两个概念的目的在于，很多协议对涉及到商业发布的时候，会有哪些是衍生的，哪些是独立的，有着明确的商业发布规定。</span><span><br />
</span><span>接下来，说说常见的几种协议吧。其实上面我给出的几篇文章的链接里面对一些常见的开源协议已经有比较清晰的描述了，我这里也只是加人了个人的一些理解，希望对接触得少的人有一定的帮助吧。</span><span><br />
GPL</span><span>（</span><span>Gun General Public License</span><span>）</span><span> vesion 2.0 1991<br />
</span><span>最常见的开源协议，使用它作为授权协议的有大名鼎鼎的</span><span> Linux </span><span>。</span><span>GPL</span><span>最显著的两个特点就是网上称为的</span><span>&ldquo;</span><span>病毒性传播</span><span>&rdquo;</span><span>和</span><span>&ldquo;</span><span>不允许闭源的商业发布</span><span>&rdquo;</span><span>。</span><span><br />
</span><span>所谓的</span><span>&ldquo;</span><span>病毒性传播</span><span>&rdquo;</span><span>，指的是，</span><span>GPL</span><span>规定，所有从</span><span>GPL</span><span>协议授权的源码衍生出来的（即上面提到的</span><span>DerivativeModule</span><span>），或者要跟</span><span>GPL</span><span>授权的源码混着用的</span><span>Project</span><span>，都要遵循</span><span>GPL</span><span>协议，就像病毒一样，粘上了关系，就</span><span>&ldquo;</span><span>中毒</span><span>&rdquo;</span><span>了。</span><span>GPL</span><span>这样规定的目的是，保证在</span><span>GPL</span><span>协议保护下的产品，不会再受到其他协议或者授权的约束。即让跟</span><span>GPL</span><span>有关系的源码都能免费获取。举个例子，如果你的改进的</span><span>Linux</span><span>中使用了</span><span>GPL</span><span>授权下的开源模块（也必须使用，你不可能自己重新去做个内核吧，如果做出来了，你也没必要叫</span><span>Linux</span><span>了。），那么你整个</span><span>Linux</span><span>产品也必须遵循</span><span> GPL</span><span>协议去开源，不能以其他方式去开源发布，更不允许闭源发布。这样一来，就不会出现这样一个</span><span>Linux</span><span>－－这个功能是</span><span>GPL</span><span>协议授权的，可以免费获取源码，而另外一个功能是其他协议下的，拿不到源码。这点规定对使用或者研究该产品的人来说，是一个极大的便利。</span><span><br />
</span><span>而</span><span>&ldquo;</span><span>不允许闭源商业发布</span><span>&rdquo;</span><span>指的是，在</span><span> GPL</span><span>授权下，你的软件产品可以商业发布，拿去卖钱，但是在这同时，你也必须将该产品的源码以</span><span>GPL</span><span>协议方式开源发布出去，供他人免费获取。也许有人会迷惑，拿去卖，又同时开源，那谁来买阿？这个产品怎么赚钱呢？？这就涉及到开源产品的商业模式的问题了，想了解相关一些信息的话，可以看看以上我给出链接的一些文章。至于后面，可能会写一篇关于开源项目的商业模式的随笔。</span><span><br />
GPL</span><span>协议下的商业发布的一个关键点就像</span><span> Java </span><span>视线论坛的</span><span> Robbin</span><span>所说的，</span><span>GPL</span><span>是针对软件源代码的版权，而不是针对软件编译后二进制版本的版权。你有权免费获得软件的源代码，但是你没有权力免费获得软件的二进制发行版本。</span><span>GPL</span><span>对软件发行版本唯一的限制就是：你的发行版本必须把完整的源代码一同提供。</span><span><br />
<br />
BSD</span><span>（</span><span>Berkeley Software Distribution</span><span>）</span><span><br />
</span><span>跟</span><span>GPL</span><span>有很大的不同，</span><span>BSD</span><span>协议是给予人很大的自由的一种开源协议。其最大的特点是，</span><span>Recipients </span><span>几乎可以对源码</span><span>&ldquo;</span><span>为所欲为</span><span>&rdquo;</span><span>，可以自由地修改，自由地使用，修改后再以其他方式再发布（商业或者开源）。但，你做这些事情的时候，还是得遵循以下规则：</span><span><br />
1</span><span>．</span><span> </span><span>如果再发布的产品中包含原</span><span>&ldquo;</span><span>源代码</span><span>&rdquo;</span><span>，则在原</span><span>&ldquo;</span><span>源代码</span><span>&rdquo;</span><span>中必须带有原来代码中的</span><span>BSD</span><span>协议。</span><span> <br />
2</span><span>．</span><span> </span><span>如果再发布的只是二进制类库</span><span>/</span><span>软件（</span><span>Object Code / Product</span><span>），则需要在类库</span><span>/</span><span>软件的文档和版权声明中包含原来代码中的</span><span>BSD</span><span>协议。</span><span> <br />
3</span><span>．</span><span> </span><span>不可以用开源代码的作者</span><span>/</span><span>机构名字和原来产品的名字做市场推广。</span><span> <br />
</span><span>其实这几个规则约定的目的也只是达到一个目的：是他人的东西，别人以</span><span>BSD</span><span>开源了，你就不能不做任何声明而占为己有，更不能用他人的名义来做商业推广。你只对你自己的东西拥有绝对控制权。</span><span><br />
</span><span>举个例子，你用开源代码（</span><span>A</span><span>）修改或做其他增添之后，产生了产品</span><span>B</span><span>，这时候，你对</span><span>B</span><span>的控制由你自己决定，你可以用任何协议再开源，也可以闭源商业发布。但，因为如果</span><span>B</span><span>中包含了</span><span>A</span><span>或</span><span>A</span><span>的一部分（一点都不包含就不叫修改了），那你在</span><span>B</span><span>产品的版权声明中，必须有提到你有使用到</span><span>A </span><span>，并且附带上</span><span> A </span><span>的开源协议。而且不能做商业推广的时候</span><span> </span><span>将</span><span> B </span><span>冠以</span><span> </span><span>原开源作者的名义以促进商业推广。</span><span><br />
BSD</span><span>代码鼓励代码共享，但需要尊重代码作者的著作权。</span><span>BSD</span><span>由于允许使用者修改和重新发布代码，也允许使用或在</span><span>BSD</span><span>代码上开发商业软件发布和销售，因此是对商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选</span><span>BSD</span><span>协议，因为可以完全控制这些第三方的代码，在必要的时候可以修改或者二次开发。</span><span> <br />
<br />
Apache Licence vesion 2.0 <br />
Apache Licence </span><span>是著名的非盈利开源组织</span><span> Apache </span><span>采用的协议。该协议和</span><span>BSD</span><span>类似，同样鼓励代码共享和尊重原作者的著作权，同样允许代码修改，再发布（作为开源或商业软件）。需要满足的条件也和</span><span>BSD</span><span>类似：（配备英文原文，方便更准确理解）</span><span> <br />
1</span><span>．</span><span> </span><span>需要给</span><span> Recipients </span><span>一份</span><span>Apache Licence <br />
</span><span>（</span><span>You must give any other recipients of the Work or DerivativeWorks a copy of this License</span><span>）</span><span><br />
2</span><span>．</span><span> </span><span>如果你修改了代码，需要在被修改的文件中进行说明。</span><span><br />
</span><span>（</span><span>You must cause any modified files to carry prominent noticesstating that You changed the files</span><span>）</span><span> <br />
3</span><span>．</span><span> </span><span>在</span><span>Derivative Module</span><span>中（修改和包含源代码而衍生的代码）需要带有原来代码中的协议，商标，专利声明和其他原来作者规定需要包含的说明。</span><span> <br />
</span><span>（</span><span>You must retain, in the Source form of any DerivativeWorks that You distribute, all copyright, patent, trademark, and attribution noticesfrom the Source form of the Work, excluding those notices that do not pertain to anypart of the Derivative Works</span><span>）</span><span><br />
4</span><span>．</span><span> </span><span>如果再发布的产品中包含一个</span><span>Notice</span><span>文件，则在</span><span>Notice</span><span>文件中需要带有</span><span>Apache Licence</span><span>。你可以在</span><span>Notice</span><span>中增加自己的许可，但不可以表现为对</span><span>ApacheLicence</span><span>构成更改。</span> <span><br />
Apache Licence</span><span>也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布</span><span>/</span><span>销售。</span><span> <br />
<br />
<span></span>LGPL <br />
LGPL </span><span>是</span><span>GPL</span><span>的一个为主要为类库使用设计的开源协议。和</span><span>GPL</span><span>要求任何使用</span><span>/</span><span>修改</span><span>/</span><span>衍生之</span><span>GPL</span><span>类库的的软件必须采用</span><span>GPL</span><span>协议不同。</span><span>LGPL</span><span>允许商业软件通过类库引用</span><span>(link)</span><span>方式使用</span><span>LGPL</span><span>类库而不需要开源商业软件的代码。这使得采用</span><span>LGPL</span><span>协议的开源代码可以被商业软件作为类库引用并发布和销售。</span><span> <br />
</span><span>但是如果修改</span><span>LGPL</span><span>协议的代码或者衍生，则所有修改的代码，涉及修改部分的额外代码和衍生的代码都必须采用</span><span>LGPL</span><span>协议。因此</span><span>LGPL</span><span>协议的开源代码很适合作为第三方类库被商业软件引用，但不适合希望以</span><span>LGPL</span><span>协议代码为基础，通过修改和衍生的方式做二次开发的商业软件采用。</span><span><br />
<br />
<span></span>CPL(Common Public Liecense) vesion 1.0<br />
<span></span>CPL </span><span>是</span><span> IBM </span><span>提出的并通过了</span><span>OSI</span><span>（</span><span>Open Source Initiative</span><span>）批准的开源协议。主要用于一些</span><span>IBM </span><span>或跟</span><span> IBM </span><span>相关的开源软件</span><span> /</span><span>项目中。如</span><span> </span><span>很著名的</span><span>Java</span><span>开发环境</span><span> Eclipse </span><span>、</span><span>RIA</span><span>开发平台</span><span>Open Laszlo</span><span>等。</span> </p>
<p><span>CPL</span><span>也是一项对商业应用友好的协议。它允许</span><span> Recipients </span><span>对源码进行任意的使用、复制、分发、传播、展示、修改以及改后做闭源的二次商业发布，这点跟</span><span>BSD </span><span>很类似，也属于自由度比较高的开源协议。但是，需要遵循：</span><span><br />
1.</span><span>当一个</span><span>Contributors </span><span>将源码的整体或部分再次开源发布的时候，必须继续遵循</span><span>CPL </span><span>开源协议来发布，而不能改用其他协议发布。除非你得到了原</span><span>&ldquo;</span><span>源码</span><span>&rdquo;Owner </span><span>的</span><span> </span><span>授权。</span><span> <br />
2.CPL</span><span>协议下，你可以将源码不做任何修改来商业发布。但如果你要将修改后的源码其开源，而且当你再发布的是</span><span>ObjectCode </span><span>的时候，你必须声明</span><span> </span><span>它的</span><span>Source Code </span><span>是可以获取的，而且要告知获取方法</span><span><br />
3.</span><span>当你需要将</span><span> CPL </span><span>下的源码作为一部分跟其他私有的源码混和着成为一个</span><span> Project</span><span>发布的时候，你可以将整个</span><span>Project/Product </span><span>以私人的协议发布，但要声明哪一部分代码是</span><span>CPL</span><span>下的，而且声明那部分代码继续遵循</span><span>CPL</span><span>。</span></p>
<p><span>4.</span><span>独立的模块（</span><span>Separate Module</span><span>），不需要开源。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/48169#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><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, 27 Mar 2007 12:35:00 +0800</pubDate>
        <link>http://jelly.javaeye.com/blog/48169</link>
        <guid>http://jelly.javaeye.com/blog/48169</guid>
      </item>
      <item>
        <title>Oracle中的BLOB和CLOB</title>
        <author>jelly</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://jelly.javaeye.com">jelly</a>&nbsp;
          链接：<a href="http://jelly.javaeye.com/blog/65796" style="color:red;">http://jelly.javaeye.com/blog/65796</a>&nbsp;
          发表时间: 2007年03月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>一、区别和定义</h1>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>LONG:</strong> 可变长的<font color="#993300">字符串</font>数据，最长2G，LONG具有VARCHAR2列的特性，可以存储长文本一个表中最多一个LONG列<br />
　　<strong>LONG RAW:</strong> 可变长<font color="#993300">二进制</font>数据，最长2G<br />
　　<strong>CLOB:</strong>&nbsp; <span><font color="#ff9900">字符大对象<font face="Times New Roman">Clob </font></font></span>用来存储单字节的<font color="#993300">字符</font>数据<br />
　　<strong>NCLOB:</strong> 用来存储多字节的<font color="#993300">字符</font>数据<br />
　　<strong>BLOB:</strong> 用于存储<font color="#993300">二进制</font>数据<br />
　　<strong>BFILE:</strong> 存储在文件中的<font color="#993300">二进制</font>数据，这个文件中的数据只能被只读访。但该文件不包含在数据库内。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复. <br />
　　<br />
　　CLOB，NCLOB，BLOB都是内部的<font color="#993300">LOB(Large Object)</font>类型，最长4G，没有LONG只能有一列的限制 </font></p>
<p><font size="2">　　要保存图片、文本文件、Word文件各自最好用哪种数据类型?<br />
　　--BLOB最好，LONG　RAW也不错，但Long是oracle将要废弃的类型，因此建议用BLOB。</font></p>
<p><font size="2"></font></p>
<h1>二、操作 </h1>
<h3>1、 get</h3>
<p><font size="2"></font></p>
<h5>CLOB</h5>
<p>&nbsp;</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//获得数据库连接 </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionFactory.getConnection(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//不需要&ldquo;for&nbsp;update&rdquo; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;st.executeQuery(</span><span class="string">&quot;select&nbsp;CLOBATTR&nbsp;from&nbsp;TESTCLOB&nbsp;where&nbsp;ID=1&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next()) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.sql.Clob&nbsp;clob&nbsp;=&nbsp;rs.getClob(</span><span class="string">&quot;CLOBATTR&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Reader&nbsp;inStream&nbsp;=&nbsp;clob.getCharacterStream(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;c&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">char</span><span>[(</span><span class="keyword">int</span><span>)&nbsp;clob.length()]; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inStream.read(c); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//data是读出并需要返回的数据，类型是String </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;String(c); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inStream.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;inStream.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;con.commit(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<h5>BLOB</h5>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//获得数据库连接 </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionFactory.getConnection(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//不需要&ldquo;for&nbsp;update&rdquo; </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;st.executeQuery(</span><span class="string">&quot;select&nbsp;BLOBATTR&nbsp;from&nbsp;TESTBLOB&nbsp;where&nbsp;ID=1&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next()) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.sql.Blob&nbsp;blob&nbsp;=&nbsp;rs.getBlob(</span><span class="string">&quot;BLOBATTR&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inStream&nbsp;=&nbsp;blob.getBinaryStream(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//data是读出并需要返回的数据，类型是byte[] </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[input.available()]; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inStream.read(data); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inStream.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;inStream.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.commit(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<h3>2、 put</h3>
<h5>CLOB</h5>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//获得数据库连接 </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionFactory.getConnection(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//插入一个空对象empty_clob() </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;st.executeUpdate(</span><span class="string">&quot;insert&nbsp;into&nbsp;TESTCLOB&nbsp;(ID,&nbsp;NAME,&nbsp;CLOBATTR)&nbsp;values&nbsp;(1,&nbsp;&quot;</span><span>thename</span><span class="string">&quot;,&nbsp;empty_clob())&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//锁定数据行进行更新，注意&ldquo;for&nbsp;update&rdquo;语句 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;st.executeQuery(</span><span class="string">&quot;select&nbsp;CLOBATTR&nbsp;from&nbsp;TESTCLOB&nbsp;where&nbsp;ID=1&nbsp;for&nbsp;update&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next()) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//得到java.sql.Clob对象后强制转换为oracle.sql.CLOB </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oracle.sql.CLOB&nbsp;clob&nbsp;=&nbsp;(oracle.sql.CLOB)&nbsp;rs.getClob(</span><span class="string">&quot;CLOBATTR&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Writer&nbsp;outStream&nbsp;=&nbsp;clob.getCharacterOutputStream(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//data是传入的字符串，定义：String&nbsp;data </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">char</span><span>[]&nbsp;c&nbsp;=&nbsp;data.toCharArray(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(c,&nbsp;</span><span class="number">0</span><span>,&nbsp;c.length); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;outStream.flush(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;outStream.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;con.commit(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
</ol>
</div>
<div class="code_title"></div>
<div class="code_title"></div>
<div class="code_title">BLOB</div>
<div class="code_title"></div>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//获得数据库连接 </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;con&nbsp;=&nbsp;ConnectionFactory.getConnection(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.setAutoCommit(</span><span class="keyword">false</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;Statement&nbsp;st&nbsp;=&nbsp;con.createStatement(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//插入一个空对象empty_blob() </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;st.executeUpdate(</span><span class="string">&quot;insert&nbsp;into&nbsp;TESTBLOB&nbsp;(ID,&nbsp;NAME,&nbsp;BLOBATTR)&nbsp;values&nbsp;(1,&nbsp;&quot;</span><span>thename</span><span class="string">&quot;,&nbsp;empty_blob())&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//锁定数据行进行更新，注意&ldquo;for&nbsp;update&rdquo;语句 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;ResultSet&nbsp;rs&nbsp;=&nbsp;st.executeQuery(</span><span class="string">&quot;select&nbsp;BLOBATTR&nbsp;from&nbsp;TESTBLOB&nbsp;where&nbsp;ID=1&nbsp;for&nbsp;update&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(rs.next()) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//得到java.sql.Blob对象后强制转换为oracle.sql.BLOB </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oracle.sql.BLOB&nbsp;blob&nbsp;=&nbsp;(oracle.sql.BLOB)&nbsp;rs.getBlob(</span><span class="string">&quot;BLOBATTR&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;outStream&nbsp;=&nbsp;blob.getBinaryOutputStream(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//data是传入的byte数组，定义：byte[]&nbsp;data </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outStream.write(data,&nbsp;</span><span class="number">0</span><span>,&nbsp;data.length); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;outStream.flush(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;outStream.close(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;con.commit(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;con.close(); &nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jelly.javaeye.com/blog/65796#comments" style="color:red;">