<?xml version="1.0" encoding="UTF-8" ?>



<rss version="2.0" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">

<channel>
<title><![CDATA[完胜]]> </title>
<description>
<![CDATA[aha~~]]>
</description>
<link>http://jonny.blog.bokee.net/</link>
<language>zh-cn</language>
<creator>jonny</creator>
<pubDate>Mon, 10 Jul 2006 09:25:55 CST </pubDate>
<generatorAgent rdf:resource="http://www.bokee.net"/>
<ttl>5</ttl>

<item>
<title>Hibernate程序性能优化的考虑要点</title>
<link>http://www.bokee.net/blogmodule/weblogcomment_viewEntry/473884.html</link>
<description>
<![CDATA[本文依照HIBERNATE帮助文档，一些网络书籍及项目经验整理而成，只提供要点和思路，具体做法可以留言探讨，或是找一些更详细更有针对性的资料。<br /><br />
<p>　　初用HIBERNATE的人也许都遇到过性能问题，实现同一功能，用HIBERNATE与用JDBC性能相差十几倍很正常，如果不及早调整，很可能影响整个项目的进度。</p>
<p>　　大体上，对于HIBERNATE性能调优的主要考虑点如下:</p>
<p>　　&Oslash; 数据库设计调整</p>
<p>　　&Oslash; HQL优化</p>
<p>　　&Oslash; API的正确使用(如根据不同的业务类型选用不同的集合及查询API)</p>
<p>　　&Oslash; 主配置参数(日志，查询缓存，fetch_size, batch_size等)</p>
<p>　　&Oslash; 映射文件优化(ID生成策略，二级缓存，延迟加载，关联优化)</p>
<p>　　&Oslash; 一级缓存的管理</p>
<p>　　&Oslash; 针对二级缓存，还有许多特有的策略</p>
<p>　　&Oslash; 事务控制策略。</p>
<p><strong>　　1、 数据库设计</strong></p>
<p>　　a) 降低关联的复杂性</p>
<p>　　b) 尽量不使用联合主键</p>
<p>　　c) ID的生成机制，不同的数据库所提供的机制并不完全一样</p>
<p>　　d) 适当的冗余数据，不过分追求高范式</p>
<p><strong>　　2、 HQL优化</strong></p>
<p>　　HQL如果抛开它同HIBERNATE本身一些缓存机制的关联，HQL的优化技巧同普通的SQL优化技巧一样，可以很容易在网上找到一些经验之谈。</p>
<p><strong>　　3、 主配置</strong></p>
<p>　　a) 查询缓存，同下面讲的缓存不太一样，它是针对HQL语句的缓存，即完全一样的语句再次执行时可以利用缓存数据。但是，查询缓存在一个交易系统(数据变更频繁，查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。</p>
<p>　　b) fetch_size，同JDBC的相关参数作用类似，参数并不是越大越好，而应根据业务特征去设置</p>
<p>　　c) batch_size同上。</p>
<p>　　d) 生产系统中，切记要关掉SQL语句打印。</p>
<p><strong>　　4、 缓存</strong></p>
<p>　　a) 数据库级缓存:这级缓存是最高效和安全的，但不同的数据库可管理的层次并不一样，比如，在ORACLE中，可以在建表时指定将整个表置于缓存当中。</p>
<p>　　b) SESSION缓存:在一个HIBERNATE SESSION有效，这级缓存的可干预性不强，大多于HIBERNATE自动管理，但它提供清除缓存的方法，这在大批量增加/更新操作是有效的。比如，同 时增加十万条记录，按常规方式进行，很可能会发现OutofMemeroy的异常，这时可能需要手动清除这一级缓存:Session.evict以及 Session.clear</p>
<p>　　c) 应用缓存:在一个SESSIONFACTORY中有效，因此也是优化的重中之重，因此，各类策略也考虑的较多，在将数据放入这一级缓存之前，需要考虑一些前提条件:</p>
<p>　　i. 数据不会被第三方修改(比如，是否有另一个应用也在修改这些数据?)</p>
<p>　　ii. 数据不会太大</p>
<p>　　iii. 数据不会频繁更新(否则使用CACHE可能适得其反)</p>
<p>　　iv. 数据会被频繁查询</p>
<p>　　v. 数据不是关键数据(如涉及钱，安全等方面的问题)。</p>
<p>　　缓存有几种形式，可以在映射文件中配置:read-only(只读，适用于很少变更的静态数据/历史数据)，nonstrict-read- write，read-write(比较普遍的形式，效率一般)，transactional(JTA中，且支持的缓存产品较少)</p>
<p>　　d) 分布式缓存:同c)的配置一样，只是缓存产品的选用不同，在目前的HIBERNATE中可供选择的不多，oscache, jboss cache，目前的大多数项目，对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中，只利用数据库级的缓存是最安全的。</p>
<p><strong>　　5、 延迟加载</strong></p>
<p>　　a) 实体延迟加载:通过使用动态代理实现</p>
<p>　　b) 集合延迟加载:通过实现自有的SET/LIST，HIBERNATE提供了这方面的支持</p>
<p>　　c) 属性延迟加载:</p>
<p><strong>　　6、 方法选用</strong></p>
<p>　　a) 完成同样一件事，HIBERNATE提供了可供选择的一些方式，但具体使用什么方式，可能用性能/代码都会有影响。显示，一次返回十万条记录 (List/Set/Bag/Map等)进行处理，很可能导致内存不够的问题，而如果用基于游标(ScrollableResults)或 Iterator的结果集，则不存在这样的问题。</p>
<p>　　b) Session的load/get方法，前者会使用二级缓存，而后者则不使用。</p>
<p>　　c) Query和list/iterator，如果去仔细研究一下它们，你可能会发现很多有意思的情况，二者主要区别(如果使用了Spring，在HibernateTemplate中对应find,iterator方法):</p>
<p>　　i. list只能利用查询缓存(但在交易系统中查询缓存作用不大)，无法利用二级缓存中的单个实体，但list查出的对象会写入二级缓存，但它一般只生成较少的执行SQL语句，很多情况就是一条(无关联)。</p>
<p>　　ii. iterator则可以利用二级缓存，对于一条查询语句，它会先从数据库中找出所有符合条件的记录的ID，再通过ID去缓存找，对于缓存中没有的记录，再 构造语句从数据库中查出，因此很容易知道，如果缓存中没有任何符合条件的记录，使用iterator会产生N+1条SQL语句(N为符合条件的记录数)</p>
<p>　　iii. 通过iterator，配合缓存管理API，在海量数据查询中可以很好的解决内存问题，如:</p>
<p>　　while(it.hasNext()){</p>
<p>　　YouObject object = (YouObject)it.next();</p>
<p>　　session.evict(youObject);</p>
<p>　　sessionFactory.evice(YouObject.class, youObject.getId());</p>
<p>　　}</p>
<p>　　如果用list方法，很可能就出OutofMemory错误了。</p>
<p>　　iv. 通过上面的说明，我想你应该知道如何去使用这两个方法了。</p>
<p><strong>　　7、 集合的选用</strong></p>
<p>　　在HIBERNATE 3.1文档的&ldquo;19.5. Understanding Collection performance&rdquo;中有详细的说明。</p>
<p><strong>　　8、 事务控制</strong></p>
<p>　　事务方面对性能有影响的主要包括:事务方式的选用，事务隔离级别以及锁的选用</p>
<p>　　a) 事务方式选用:如果不涉及多个事务管理器事务的话，不需要使用JTA，只有JDBC的事务控制就可以。</p>
<p>　　b) 事务隔离级别:参见标准的SQL事务隔离级别</p>
<p>　　c) 锁的选用:悲观锁(一般由具体的事务管理器实现)，对于长事务效率低，但安全。乐观锁(一般在应用级别实现)，如在HIBERNATE中可以定义 VERSION字段，显然，如果有多个应用操作数据，且这些应用不是用同一种乐观锁机制，则乐观锁会失效。因此，针对不同的数据应有不同的策略，同前面许 多情况一样，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解。</p>
<p><strong>　　9、 批量操作</strong></p>
<p>　　即使是使用JDBC，在进行大批数据更新时，BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置batch_size来让其支持批量操作。</p>
<p>　　举个例子，要批量删除某表中的对象，如&ldquo;delete Account&rdquo;，打出来的语句，会发现HIBERNATE找出了所有ACCOUNT的ID，再进行删除，这主要是为了维护二级缓存，这样效率肯定高不 了，在后续的版本中增加了bulk delete/update，但这也无法解决缓存的维护问题。也就是说，由于有了二级缓存的维护问题，HIBERNATE的批量操作效率并不尽如人意!</p>
<p>　　从前面许多要点可以看出，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务 特征有足够的了解，一般的，优化方案应在架构设计期就基本确定，否则可能导致没必要的返工，致使项目延期，而作为架构师和项目经理，还要面对开发人员可能 的抱怨，必竟，我们对用户需求更改的控制力不大，但技术/架构风险是应该在初期意识到并制定好相关的对策。</p>
<p>　　还有一点要注意，应用层的缓存只是锦上添花，永远不要把它当救命稻草，应用的根基(数据库设计，算法，高效的操作语句，恰当API的选择等)才是最重要的。</p>]]>
</description>
<guid isPermaLink="false">http://www.bokee.net/blogmodule/weblogcomment_viewEntry/473884.html</guid>
<subject>我的最爱JAVA/C#</subject>
<author>jonny</author>
<category>我的最爱JAVA/C#</category>
<pubDate>Sun, 31 Dec 2006 09:11:11 CST </pubDate>
</item>

<item>
<title>软件项目的质量管理</title>
<link>http://www.bokee.net/blogmodule/weblogcomment_viewEntry/456911.html</link>
<description>
<![CDATA[<table width="100%" align="center">
    <tbody>
        <tr>
            <td class="content">
            <p class="content">　软件的质量是软件开发各个阶段质量的综合反映，本文结合&ldquo;金保&rdquo;工程软件项目管理的实际经验，探讨了在项目计划、需求分析、软件开发和系统维护等四个关键环节进行软件质量控制的方法。              </p>
            <p class="content">　软件的质量</p>
            <p class="content">　是软件开发各个阶段质量的综合反映。软件项目的建设包括项目计划、需求分析、软件开发和系统维护等阶段，质量管理工作会始终贯彻在项目建设的各个阶段，本文结合笔者在&ldquo;金保&rdquo;工程的实践体会，围绕项目建设各个阶段的质量管理进行探讨。              </p>
            <p class="content">　1. 项目计划的质量管理 </p>
            <p class="content"> 　科学合理地制定项目开发计划，是项目成功的关键，在制定项目计划时，以下三个方面需要特别注意。              </p>
            <p class="content"> 　首先，项目计划必须群策群力。项目计划的制定不仅需要对项目任务进行工作分解(WBS)和对资源估算以制定项目计划，更需要在项目计划中结合历史项目的 实践经验和相关领域的行业经验，科学地评估项目各阶段所需要的时间并预留风险缓冲时间。通常可先由项目承建方制订项目计划草案，项目计划草案注明项目各阶 段的产生物和里程碑时间，再由业主、监理、承建方的主要负责领导和技术骨干对项目计划草案进行讨论，并根据各方意见进行修订和完善，最终形成各方认可的项 目计划。 </p>
            <p class="content"> 　其次，项目计划要因变而变。在&ldquo;金保&rdquo;工程建设中，软件项目开发往往涉及劳动保障多个部门的工作，因而项目计划在实施过程往往受到多种因素的影响。项目 计划要跟上项目的实际变化，通过动态调整投入项目的资源，合理地调节项目进度以及阶段性的里程碑，使得项目计划反映项目的实际进度，从而确保项目质量保证 的实施。 </p>
            <p class="content"> 　最后，建立项目沟通制度。每周召开业主方、承建方、监理方参加的项目例会，共同协商项目建设中所遇到的问题，明确责任分工，确定下一步工作计划，并根据实际情况及时调整，确保项目按计划进行。              </p>
            <p class="content">　2. 需求分析的质量管理 </p>
            <p class="content"> 　把握正确的业务需求是项目成功的关键。需求分析是软件开发人员掌握业务流程，最终确定软件需要做什么和如何做的定义过程。由于对业务的需求分析是个迭代的过程，只有通过持续地与业务人员进行交流确认，才能最终掌握业务的实际需求。              </p>
            <p class="content"> 　在&ldquo;金保&rdquo;工程建设中，为了减少需求分析阶段可能发生的各种风险，劳动保障部门信息中心的技术人员利用自己既掌握劳动保障的业务政策，又懂得软件开发技 术和方法的优势，积极参与到软件项目中，做业务人员和软件开发人员联系的桥梁和纽带，既引导业务人员提出业务的需求，也帮助软件开发人员掌握业务规则。由 于很多业务流程非常复杂，而且不可视，为了更好地获得业务需求，要求承建方制作软件原型，软件开发人员通过原型与业务人员进行进一步的沟通，最终获得与业 务流程相一致的软件模型。需求分析结束后，编写成《用户需求说明书》、《需求规格说明书》，由业主、监理、承建方三方签字认可，作为验收方案和验收标准， 并做好变更控制和配置管理。 </p>
            <p class="content">　3. 软件开发的质量管理 </p>
            <p class="content"> 　软件开发是软件实现的重要阶段，需要通过运行多种质量管理方法做好软件开发过程的质量控制。这个时期的质量管理的方法包括了日常检查、阶段评审、方案检验和质量原因分析等。              </p>
            <p class="content"> 　日常检查贯彻于软件开发的全过程，通过对业务调研、系统设计和系统实现等过程进行监督，及时识别和发现缺陷。阶段评审主要对各阶段的产出物进行评审，尤 其是需要加强对需求阶段的《用户需求说明书》、《需求规格说明书》、系统设计阶段的《设计说明书》，以及测试阶段的《确认测试用例》、《集成测试用例》的 评审工作，通过评审发现阶段性问题，通过及时修改和完善，尽可能减少带入下一阶段的缺陷数目。 </p>
            <p class="content"> 　方案检验是对在软件的设计方案进行模拟测试，通过对存储数据量、并发用户数、网络环境等多方面的综合验证测试，以保证系统设计方案的正确性。质量原因分 析报告用鱼刺图来展现影响软件质量的各种直接和间接的原因以及构成这些因素，以总结经验、吸取教训，避免类似的质量缺陷重复发生。 </p>
            <p class="content">　4. 系统维护的质量管理 </p>
            <p class="content"> 　软件项目开发完成交付使用后，随着时间的推移，承建方的开发人员会逐渐转移到其他项目，从而在技术服务和技术响应上得不到有效的支持，而软件随着推广使 用的进一步扩大，对软件的可靠性、稳定性等方面提出了更高的要求，最终出现承建方的维护不及时、业主方维护工作繁重的局面。 </p>
            <p class="content"> 　为解决系统维护阶段的问题，首先在项目建设初期劳动保障信息中心的技术人员应该参与软件的设计和开发，通过掌握软件的核心技术和运行方法，使得软件在运 行和维护期间不需要过分依赖于承建方，只要不是大的改动都能应付，特别要熟练掌握软硬件环境的安装、维护、调优和备份等工作。其次，完备的文档为程序的维 护、更新、扩展提供良好的帮助，承建方应该提供完整的文档，包括软件安装手册、软件操作手册、在线帮助、系统管理手册等，为以后的维护工作提供方便。 </p>
            <p><span class="content"> 　在&ldquo;金保&rdquo;工程建设中，要提高软件项目质量管理的方法有很多，例如在软件企业实施CMM规范或者引入RUP过程等，但对于参与&ldquo;金保&rdquo;工程建设的大多数 中小型软件企业而言很不现实。首先，这需要企业投入大量的资金和人力物力，这不是企业所能承受的; 其次，CMM和RUP太大、太广，要求具有不同专业背景的技术人员，并且在企业内部建立起层次分明和分工清晰管理体系，而这些恰恰又是中小型软件企业所缺 乏的。在&ldquo;金保&rdquo;工程的建设实践中，我们深切体会到，针对软件质量管理的薄弱环节实施质量管理改进，不用投入太多人力物力，就能较大程度地提高软件的质 量。</span>              </p>
            </td>
        </tr>
    </tbody>
</table>]]>
</description>
<guid isPermaLink="false">http://www.bokee.net/blogmodule/weblogcomment_viewEntry/456911.html</guid>
<subject>软件人生</subject>
<author>jonny</author>
<category>软件人生</category>
<pubDate>Fri, 22 Dec 2006 16:35:50 CST </pubDate>
</item>

<item>
<title>xajax</title>
<link>http://www.bokee.net/blogmodule/weblogcomment_viewEntry/454626.html</link>
<description>
<![CDATA[什么是xajax? <br />xajax如何工作? <br />为什么我要使用xajax代替其他PHP的Ajax库? <br />如何在我的PHP脚本之中使用xajax? <br />如何异步更新内容? <br />如何异步处理表单数据? <br />如何给xajax增加定制功能? <br />我能在私有或者收费产品之中使用xajax吗?
<p>What is xajax? <br />How does xajax work? <br />Why should I use xajax instead of another Ajax library for PHP? <br />How do I use xajax in my PHP script? <br />How do I update my content asynchronously? <br />How do I process form data asynchronously? <br />How do I add custom functionality to xajax? <br />May I use xajax in a proprietary product and charge for it?</p>
<p>什么是xajax?<br />Xajax是一个开源的 PHP 类库 它能够让你黏合HTML、CSS、JavaScript和PHP，轻而易举的开发功能强大、基于WEB的AJAX应用软件. 使用xajax开发的应用软件，无需重新调入页面，就能够异步调用服务器端的PHP函数和更新内容. <br />What is xajax?<br />xajax is an open source PHP class library that allows you to easily create powerful, web-based, Ajax applications using HTML, CSS, JavaScript, and PHP. Applications developed with xajax can asynchronously call server-side PHP functions and update content without reloading the page. <br />&nbsp;<br />xajax 如何工作?<br />你的应用软件需要异步调用的PHP函数， xajax的PHP对象都生成了对应的封装好了的JavaScript函数. 当被调用时，封装的函数使用JavaScript的XMLHttpRequest对象与服务器异步通讯，调用xajax对象对应的PHP函数. 调用结束后, PHP函数由xajax返回一个xajax的XML响应传递给应用程序. XML响应包含了特定的指令和数据，他们可以被xajax的JavaScript消息分析器解析，并且被用于更新你的应用程序的内容.<br />How does xajax work?<br />The xajax PHP object generates JavaScript wrapper functions for the PHP functions you want to be able to call asynchronously from your application. When called, these wrapper functions use JavaScript's XMLHttpRequest object to asynchronously communicate with the xajax object on the server which calls the corresponding PHP functions. Upon completion, an xajax XML response is returned from the PHP functions, which xajax passes back to the application. The XML response contains instructions and data that are parsed by xajax's JavaScript message pump and used to update the content of your application.<br />为什么我要使用xajax代替其他PHP的ajax库?<br />你应该选择一个最是和你的项目需要的库.<br />xajax 提供了以下的功能, 它们使得ajax富有特色而又功能强大: <br />Why should I use xajax instead of another Ajax library for PHP?<br />You should choose whatever library will best meet the needs of your project.<br />xajax offers the following features that, together, make it unique and powerful: <br />Xajax 特殊的 XML 响应 / javascript 消息分析系统 帮助你做到, 自动的处理函数返回的数据，按照PHP函数返回的指令更新内容或者状态. 因为xajax作了这些工作Because xajax does the work, 你不需要写javascript的回调处理函数. <br />xajax's unique XML response / javascript message-pump system does the work for you, automatically handling the data returned from your functions and updating your content or state according to the instructions you return from your PHP functions. Because xajax does the work, you don't have to write javascript callback handler functions. <br />Xajax反对将代码和数据紧密地杂糅在一起的主张, 并且保持xajax的代码从与他代码分离. 因为它是对象构造的, 你可以加上自己定制的功能给xajax去扩展xajaxResponse 类和使用addScript方法. <br />xajax is object oriented to maintain tighter relationships between the code and data, and to keep the xajax code separate from other code. Because it is object oriented, you can add your own custom functionality to xajax by extending the xajaxResponse class and using the addScript() method. <br />xajax 可以工作在 Firefox, Mozilla, 大部分基于 Mozilla 的浏览器, Internet Explorer, 和 Safari. <br />xajax works in Firefox, Mozilla, probably other Mozilla based browsers, Internet Explorer, and Safari. <br />除了更新元素的值和内含的HTML内容(innerHTML), xajax 还能用于更新样式(styles), css 类, 多选和单选按钮选择,甚至可以更新任何元素的属性. <br />In addition to updating element values and innerHTML, xajax can be used to update styles, css classes, checkbox and radio button selection, or nearly any other element attribute. <br />xajax 支持使用一维或者多维数组、关联数组(哈希数组) 作为xajax函数的参数从javascript传送给PHP. 反之Additionally, 如果你传送一个javascript的对象给xajax函数，PHP函数将接受一个描叙对象属性的关联数组(哈希数组). <br />xajax supports passing single and multidimensional arrays and associative arrays from javascript to PHP as parameters to your xajax functions. Additionally, if you pass a javascript object into an xajax function, the PHP function will receive an associative array representing the properties of the object. <br />xajax 提供了一种简单的异步表单处理方式. 使用 xajax.getFormValues() javascript 方法, 你可以轻而易举的在表单之中提交一个描绘值的数组作为参数传送到xajax异步处理函数: <br />xajax_processForm(xajax.getFormValues('formId');<br />. 它可以处理复杂的input 元素名称 ，例如 &quot;checkbox[][]&quot; 或者 &quot;name[first]&quot; 产生的多维或者关联数组(哈希数组), 就是普通提交表单那样使用PHP的$_GET数组<br />xajax provides easy asynchronous Form processing. By using the xajax.getFormValues() javascript method, you can easily submit an array representing the values in a form as a parameter to a xajax asynchronous function: <br />xajax_processForm(xajax.getFormValues('formId');<br />. It even works with complex input names like &quot;checkbox[][]&quot; and &quot;name[first]&quot; to produce multidimensional and associative arrays, just as if you had submitted the form and used the PHP $_GET array<br />使用xajax你可以动态的发送附加的javascript作为请求的响应到你的应用软件中运行，而这就和动态的更新元素的属性一样方便. <br />Using xajax you can dynamically send additional javascript to your application to be run in response to a request as well as dynamically update element attributes. <br />Xajax会自动比较PHP函数返回的数据与你已经标记需要修改的元素属性. 只有当新的数据确实可以改变现有的属性，属性才会真的被更新. 这将可消除程序在一定时间间隔内更新与当前内容相同或者不同的内容而出现的明显的闪烁. <br />xajax automatically compares the data returned from the PHP functions to the data that is already in the attribute of the element you have marked for change. The attribute is only updated with the new data if it will actually change what is already in the attribute. This eliminates the flicker often observed in applications that update content at a regular time interval with data which may or may not differ from extant content. <br />每一个通过xajax简单注册的函数都可以有不同的请求方式. 所有的函数默认使用POST方式，除非你明确的指定使用GET方式. 如果使用GET请求，你必须非常明确的考虑它确实是你所需要的 <br />Each function registered to be accessible through xajax can have a different request type. All functions default to use POST unless GET is explicitly set. This is to encourage careful consideration of when to use GET requests <br />如果没有指定URI，xajax将设法自动确定脚本的URI. Xajax的自动确定算法经过了充分的验证，确保在大部分HTTPS或者未知端口的HTTP服务器上也可以正常的工作. <br />If no request URI is specified, xajax tries to autodetect the URL of the script. The xajax autodetection algorithm is sophisticated enough that, on most servers, it will work under a secure https:// protocol as well as http:// and with nonstandard ports. <br />Xajax使用UTF8编码所有的请求和响应，以确保支持绝大部分的字符和语言. Xajax已经成功测试了多种不同的UNICODE字符，包括Spanish, Russian, Arabic, and Hebrew <br />xajax encodes all of its requests and responses in UTF-8 so that it can support a wider range of characters and languages. xajax has been successfully tested with various unicode characters including Spanish, Russian, Arabic, and Hebrew <br />几乎所有xajax生成的javascript都可以通过动态的外部javascript包含到你的web程序之中. 当你在浏览器之中查看程序的源代码时，不会有JavaScript的函数定义混杂在HTML标记之中. <br />Nearly all of the javascript generated by xajax is included into your web application through dynamic external javascript. When you view the source of your application in your browser, the markup will be not cluttered by JavaScript function definitions. <br />Xajax可以使用在Smarty模板系统之中，仅仅需要创建一个smarty变量就可以包含xajax的javascript: <br />$smarty-&gt;assign('xajax_javascript', $xajax-&gt;getJavascript());<br />然后你可以使用在header模版之中使用 <br />{$xajax_javascript}<br />从而把xajax应用到你的站点.<br />xajax can be used with the Smarty templating system by creating a variable in smarty that contains the xajax javascript: <br />$smarty-&gt;assign('xajax_javascript', $xajax-&gt;getJavascript());<br />Then you can use <br />{$xajax_javascript}<br />in your header template to use xajax on your site.<br />如何在我的PHP脚本之中使用xajax?<br />Xajax的设计是如此的富有特色，以至于不管是已有的web程序还是新的项目，它都能够被极其简单的部署和应用. 仅仅需要七步，你就可以在几乎任何PHP脚本之中加入xajax的强大功能: <br />How do I use xajax in my PHP script?<br />xajax is designed to be extremely easy to implement in both existing web applications as well as new projects. You can add the power of xajax to nearly any PHP script in seven easy steps: <br />包含xajax类库:<br />require_once(&quot;xajax.inc.php&quot;);<br />实例化xajax 对象:<br />$xajax = new xajax();<br />注册你需要通过xajax调用的PHP函数的名称:<br />$xajax-&gt;registerFunction(&quot;myFunction&quot;);<br />编写注册的PHP函数，并且在函数之中使用xajaxResponse 对象返回XML指令: <br />function myFunction($arg)<br />{<br />&nbsp;&nbsp; // 对$arg做一些基本处理例如从数据库检索数据<br />&nbsp;&nbsp; // 然后把结果赋值给变量，例如$newContent<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; // 实例化xajaxResponse 对象<br />&nbsp;&nbsp; $objResponse = new xajaxResponse();<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; // 添加指令到响应之中，用于指派<br />&nbsp;&nbsp; //指定元素(例如id=&quot;SomeElementId&quot;)的innerHTML属性的新的内容<br />&nbsp;&nbsp; $objResponse-&gt;addAssign(&quot;SomeElementId&quot;,&quot;innerHTML&quot;, $newContent);<br />&nbsp;&nbsp; <br />&nbsp;&nbsp; //返回xajaxResponse 对象生成的XML响应<br />&nbsp;&nbsp; return $objResponse-&gt;getXML();<br />}<br />在你的脚本输出任何信息之前，调用xajax用于接管请求:<br />$xajax-&gt;processRequests();<br />在页面的 &lt;head&gt;&lt;/head&gt; 标签之间, 告诉xajax生成所必需的JavaScript:<br />&lt;?php $xajax-&gt;printJavascript(); ?&gt;<br />在程序中，从JavaScript事件或者函数调用前面注册的函数: <br />&lt;div id=&quot;SomeElementId&quot;&gt;&lt;/div&gt;<br />&lt;button onclick=&quot;xajax_myFunction(SomeArgument);&quot;&gt;<br />Include the xajax class library:<br />require_once(&quot;xajax.inc.php&quot;);<br />Instantiate the xajax object:<br />$xajax = new xajax();<br />Register the names of the PHP functions you want to be able to call through xajax:<br />$xajax-&gt;registerFunction(&quot;myFunction&quot;);<br />Write the PHP functions you have registered and use the xajaxResponse object to return XML commands from them: <br />function myFunction($arg) <br />{ <br />&nbsp; // do some stuff based on $arg like query data from a database and <br />&nbsp; // put it into a variable like $newContent </p>
<p>&nbsp; // Instantiate the xajaxResponse object <br />&nbsp; $objResponse = new xajaxResponse(); </p>
<p>&nbsp; // add a command to the response to assign the innerHTML attribute of <br />&nbsp; // the element with id=&quot;SomeElementId&quot; to whatever the new content is <br />&nbsp; $objResponse-&gt;addAssign(&quot;SomeElementId&quot;,&quot;innerHTML&quot;, $newContent); </p>
&nbsp; //return the XML response generated by the xajaxResponse object <br />&nbsp; return $objResponse-&gt;getXML();<br />}<br />Before your script sends any output, have xajax handle any requests:<br />$xajax-&gt;processRequests();<br />Between your &lt;head&gt;&lt;/head&gt; tags, tell xajax to generate the necessary JavaScript:<br />&lt;?php $xajax-&gt;printJavascript(); ?&gt;<br />Call the function from a JavaScript event or function in your application: <br />&lt;div id=&quot;SomeElementId&quot;&gt;&lt;/div&gt;<br />&lt;button onclick=&quot;xajax_myFunction(SomeArgument);&quot;&gt;<br />&nbsp;<br />就这么简单. xajax 会处理其他所有的事情. 你所要做的主要工作就是编写PHP函数，然后从函数之中返回xajax的XML响应。而后者通过xajaxResponse类可以非常简单的生成.<br />That's it. xajax takes care of most everything else. Your biggest task is writing the PHP functions and returning xajax XML responses from them-- which is made extremely easy by the xajaxResponse class.<br />&nbsp;<br />如何异步更新内容?<br />Xajax 最富有特色的功能或许就是xajaxResponse类. 其他的Ajax库需要你自己编写JavaScript的回调句柄去处理一个异步请求返回的数据并更新内容. xajax, 从另外一个角度来说, 允许你使用PHP简单的控制内容. xajaxResponse 让你在PHP函数之中创建XML指令返回给你的程序. XML将被xajax的消息分析器解析，指令将告诉xajax如何更新程序的内容和状态. xajaxResponse类目前提供了以下指令:<br />How do I update my content asynchronously?<br />Perhaps the most unique feature of xajax is the xajaxResponse class. Other Ajax libraries require you to write your own callback handlers in JavaScript to process the data returned from an asynchronous request and to update the content. xajax, on the other hand, allows you to easily control your content from PHP. The xajaxResponse class allows you to create XML instructions to return to your application from your PHP functions. The XML is parsed by xajax message pump and the instructions tell xajax how to update the content and state of your application. The xajaxResponse class currently offers the following commands: <br />addAssign($sTargetId,$sAttribute,$sData)<br />给命名为$sTargetId的元素的$sAttribute属性赋值$sData <br />$objResponse-&gt;addAssign(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />$objResponse-&gt;addAssign(&quot;checkBox1&quot;,&quot;checked&quot;,&quot;true&quot;);<br />addAssign($sTargetId,$sAttribute,$sData)<br />Assigns the $sAttribute of the element identified by $sTargetId to $sData<br />$objResponse-&gt;addAssign(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />$objResponse-&gt;addAssign(&quot;checkBox1&quot;,&quot;checked&quot;,&quot;true&quot;);<br />addAppend($sTargetId,$sAttribute,$sData)<br />给命名为$sTargetId的元素的$sAttribute属性追加值$sData<br />$objResponse-&gt;addAppend(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />addAppend($sTargetId,$sAttribute,$sData)<br />Appends $sData to the $sAttribute of the element identified by $sTargetId <br />$objResponse-&gt;addAppend(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />addPrepend($sTargetId,$sAttribute,$sData)<br />预备给命名为$sTargetId的元素的$sAttribute属性赋值$sData <br />$objResponse-&gt;addPrepend(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />addPrepend($sTargetId,$sAttribute,$sData)<br />Prepends $sData to the $sAttribute of the element identified by $sTargetId <br />$objResponse-&gt;addPrepend(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;Some Text&quot;);<br />addReplace($sTargetId,$sAttribute,$sSearch,$sData)<br />替换命名为$sTargetId的元素的$sAttribute属性的值之中的$sSearch为$sData <br />$objResponse-&gt;addReplace(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;text&quot;,&quot;&lt;strong&gt;text&lt;/strong&gt;&quot;);<br />addReplace($sTargetId,$sAttribute,$sSearch,$sData)<br />replaces all instances of $sSearch with $sData in the $sAttribute of the element identified by $sTargetId <br />$objResponse-&gt;addReplace(&quot;contentDiv&quot;,&quot;innerHTML&quot;,&quot;text&quot;,&quot;&lt;strong&gt;text&lt;/strong&gt;&quot;);<br />addClear($sTargetId,$sAttribute)<br />清空命名为$sTargetId的元素的$sAttribute属性的值 <br />$objResponse-&gt;addClear(&quot;Input1&quot;,&quot;value&quot;);<br />addClear($sTargetId,$sAttribute)<br />Clears the $sAttribute of the element identified by $sTargetId <br />$objResponse-&gt;addClear(&quot;Input1&quot;,&quot;value&quot;);<br />addCreate($sParentId, $sTagname, $sId, $sType)<br />在已经存在的命名为$sParentId的元素下添加一个名叫$sTagName的子元素，并且把他的id赋值为$sId，可选的类型赋值为 $sType. <br />$objResponse-&gt;addCreate(&quot;form1&quot;,&quot;input&quot;, &quot;pass&quot;, &quot;password&quot;);<br />addCreate($sParentId, $sTagname, $sId, $sType)<br />Adds a new $sTagName child element to an existing element identified by $sParentId, and assigns it the id $sId and the optional type $sType. <br />$objResponse-&gt;addCreate(&quot;form1&quot;,&quot;input&quot;, &quot;pass&quot;, &quot;password&quot;);<br />addRemove($sElementId)<br />从你的程序之中移除命名为$sElementId的元素<br />$objResponse-&gt;addRemove(&quot;div1&quot;);<br />addRemove($sElementId)<br />Removes the element identified by $sElementId from your application <br />$objResponse-&gt;addRemove(&quot;div1&quot;);<br />addAlert($sMsg)<br />显示一个内容为 $sMsg 的警告框(JavaScript的Alert)<br />$objResponse-&gt;addAlert(&quot;This is some text&quot;);<br />addAlert($sMsg)<br />Display an alert box with $sMsg <br />$objResponse-&gt;addAlert(&quot;This is some text&quot;);<br />addScript($sJS)<br />执行JavaScript代码 $sJS (演示代码原文有误)<br />$objResponse-&gt;addScript(&quot;var txt = prompt('get some text');&quot;);<br />addScript($sJS)<br />Execute the JavaScript code $sJS<br />$objResponse-&gt;addAlert(&quot;var txt = prompt('get some text');&quot;);<br />&nbsp;<br />一 个独立的XML响应可能包含多个指令, 他们将按照加入响应的顺序执行. 让我们用一个用户在你的程序之中点击按钮为例来进行说明. Onclick事件调用PHP函数对应的javascript封装.这个封装通过XMLHttpRequest发送异步请求到服务器给xajax调用 PHP函数. PHP函数做了一次数据库查询, 处理了一些数据, 或者序列化. 然后你使用xajaxResponse类生成包含多个指令的xajax的XML响应 ，并回送给xajax的消息分析器执行: <br />A single XML response may contain multiple commands, which will executed in the order they were added to the response. For example, let's say that a user clicks on a button in your application. The onclick event calls the javascript wrapper for a PHP function. That wrapper sends an asynchronous request to the server through XMLHttpRequest where xajax calls the PHP function. The PHP function does a database lookup, some data manipulation, or serialization. You use the xajaxResponse class to generate an xajax XML response containing multiple commands to send back to the xajax message pump to be executed:<br />&nbsp;&nbsp;&nbsp; $objResponse = new xajaxResponse();<br />&nbsp;&nbsp;&nbsp; $objResponse.addAssign(&quot;myInput1&quot;,&quot;value&quot;,$DataFromDatabase);<br />&nbsp;&nbsp;&nbsp; $objResponse.addAssign(&quot;myInput1&quot;,&quot;style.color&quot;,&quot;red&quot;);<br />&nbsp;&nbsp;&nbsp; $objResponse.addAppend(&quot;myDiv1&quot;,&quot;innerHTML&quot;,$DataFromDatabase2);<br />&nbsp;&nbsp;&nbsp; $objResponse.addPrepend(&quot;myDiv2&quot;,&quot;innerHTML&quot;,$DataFromDatabase3);<br />&nbsp;&nbsp;&nbsp; $objResponse.addReplace(&quot;myDiv3&quot;,&quot;innerHTML&quot;,&quot;xajax&quot;,&quot;&lt;strong&gt;xajax&lt;/strong&gt;&quot;);<br />&nbsp;&nbsp;&nbsp; $objResponse.addScript(&quot;var x = prompt(&quot;Enter Your Name&quot;);&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; return $objResponse-&gt;getXML();<br />&nbsp;<br />$objResponse = new xajaxResponse();<br />&nbsp;&nbsp;&nbsp; $objResponse.addAssign(&quot;myInput1&quot;,&quot;value&quot;,$DataFromDatabase);<br />$objResponse.addAssign(&quot;myInput1&quot;,&quot;style.color&quot;,&quot;red&quot;);<br />$objResponse.addAppend(&quot;myDiv1&quot;,&quot;innerHTML&quot;,$DataFromDatabase2);<br />$objResponse.addPrepend(&quot;myDiv2&quot;,&quot;innerHTML&quot;,$DataFromDatabase3);<br />$objResponse.addReplace(&quot;myDiv3&quot;,&quot;innerHTML&quot;,&quot;xajax&quot;,&quot;&lt;strong&gt;xajax&lt;/strong&gt;&quot;);<br />$objResponse.addScript(&quot;var x = prompt(&quot;Enter Your Name&quot;);&quot;);<br />return $objResponse-&gt;getXML();<br />xajax消息分析器将会解析XML消息，并执行以下工作: <br />id为myInput1的元素的值将被赋值为 $DataFromDatabase的数据. <br />id为myInput1的元素的颜色将会变为red. <br />$DataFromDatabase2的数据会被追加到id为myDiv1的元素innerHTML之中. <br />$DataFromDatabase3的数据会被预先赋值给id为myDiv2的元素innerHTML之中. <br />id为myDiv3的元素的innerHTML 之中所有的&quot;xajax&quot;将被替换为&quot;&lt;strong&gt;xajax&lt;/strong&gt;&quot;; 使得所有的单词 xajax 显示加粗. <br />一个提示框将会显示，用来询问用户姓名，从提示框返回的值会被命名为x的javascript变量接收.<br />The xajax message pump would parse the XML message and perform the following: <br />The value of the element with id myInput1 would be assigned to the data in $DataFromDatabase. <br />The color of the text in the element with id myInput1 would be changed to red. <br />The data in $DataFromDatabase2 would be appended to the innerHTML of the element with id myDiv1. <br />The data in $DataFromDatabase3 would be prepended to the innerHTML of the element with id myDiv2. <br />All occurrences of &quot;xajax&quot; in the innerHTML of the element with id myDiv3 would be replaced with &quot;&lt;strong&gt;xajax&lt;/strong&gt;&quot;; making all of the instances of the word xajax appear bold. <br />a prompt would be displayed asking for the user's name and the value returned from the prompt would be placed into a javascript variable named x.<br />所有这些都由构成的PHP函数在服务器端执行并返回xajax的XML响应.<br />All of this is implemented on the server side in the PHP function by forming and returning an xajax XML response.<br />如何异步处理表单数据?<br />Xajax使得异步处理表单数句非常非常的简单. xajax.getFormValues()方法会自动的从表单提取数据，并作为一个参数提交给xajax注册的PHP函数. <br />xajax.getFormValues() 仅仅需要一个参数, 可以是你需要处理得表单的id, 或者是一个实际的表单对象. 你也可以使用xajax.getFormValues作为一个参数给xajax 函数, 例如:<br />xajax_processFormData(xajax.getFormValues('formId'));<br />xajax 会生成一个与表单数据对应的请求字符串给xajax服务器解析，然后以一个与表单数据对应的数组传递给PHP函数，就想你提交表单使用PHP的$_GET数组那么简单.<br />Xajax 可以处理类似普通多维数组或者联合数组(哈希数组)等形式的复杂输入名字. 例如, 如果一个表单有三个多选框(checkboxes)并且都命名为 &quot;checkbox[]&quot;, 但是值分别为 &quot;check1&quot;, &quot;check2&quot;, 和 &quot;check3&quot;, 然后使用 xajax.getFormValues 函数作为参数传递给xajax 函数, 则 PHP 函数会接受到一个如下的数组: <br />array (<br />&nbsp; 'checkbox' =&gt; <br />&nbsp; array (<br />&nbsp;&nbsp;&nbsp; 0 =&gt; 'check1',<br />&nbsp;&nbsp;&nbsp; 1 =&gt; 'check2',<br />&nbsp;&nbsp;&nbsp; 2 =&gt; 'check3',<br />&nbsp; ),<br />)<br />作为函数参数的数组的结构与传统意义上提交表单之后的$_GET数组的结构相同. 你可以访问数组之中的checkbox 的数据: $aFormData['checkbox'][0]<br />How do I process form data asynchronously?<br />xajax makes processing form data asynchronously extremely easy. The xajax.getFormValues() method can be used to automatically extract the data from a form and pass it as a parameter to a PHP function you have registered with xajax. <br />xajax.getFormValues() takes one argument, which can be either the id of the form you want to process, or the actual form object. You use xajax.getFormValues as a parameter to your xajax function, like this:<br />xajax_processFormData(xajax.getFormValues('formId'));<br />xajax generates a query string representing the form data which is parsed by the xajax server and passed to your PHP function as an array representing the form data, just as if you had submitted the form and used the PHP $_GET array.<br />xajax will even handle complex input names to generate multidimensional and associative arrays. For instance, if you have a form with three checkboxes and you give them all the name &quot;checkbox[]&quot;, but different values like &quot;check1&quot;, &quot;check2&quot;, and &quot;check3&quot;, and you use the xajax.getFormValues function as a parameter to your xajax function, the PHP function will receive and array that looks like this: <br />array (<br />&nbsp; 'checkbox' =&gt; <br />&nbsp; array (<br />&nbsp;&nbsp;&nbsp; 0 =&gt; 'check1',<br />&nbsp;&nbsp;&nbsp; 1 =&gt; 'check2',<br />&nbsp;&nbsp;&nbsp; 2 =&gt; 'check3',<br />&nbsp; ),<br />)<br />The array argument to your function mirrors the structure that the $_GET array would have if you were to submit the form traditionally. You can then access the checkbox data in the array like this: <br />$aFormData['checkbox'][0]<br />如何给xajax增加定制功能?<br />Xajax 可以使用各种服加的用户定制功能进行扩展. 正因为xajax是完全面向对象的，并且可以使用xajaxResponse的addScript()方法，所以他具有无限扩展的可能. 你可以创建你自己的xajax响应类，来继承xajaxResponse 类以及它的方法，并加上你自己定制的响应. 让我们用一个定制的增加选择组合框(select combo boxes)选项的响应指令的例子来说明. 你可以象下面这样扩展xajaxResponse 类: <br />class myXajaxResponse extends xajaxResponse<br />{&nbsp; <br />&nbsp; function addAddOption($sSelectId, $sOptionText, $sOptionValue)&nbsp; <br />&nbsp; {&nbsp; <br />&nbsp;&nbsp;&nbsp; $sScript&nbsp; = &quot;var objOption = new Option('&quot;.$sOptionText.&quot;','&quot;.$sOptionValue.&quot;');&quot;;<br />&nbsp;&nbsp;&nbsp; $sScript .= &quot;document.getElementById('&quot;.$sSelectId.&quot;').options.add(objOption);&quot;;<br />&nbsp;&nbsp;&nbsp; $this-&gt;addScript($sScript);<br />&nbsp; }<br />}<br />现在, 取代xajaxResponse 对象的初始化, 把你自己的 myXajaxResponse 对象的初始化定义到你的 xajax PHP 函数之中: <br />$objResponse = new myXajaxResponse();<br />$objResponse-&gt;addAssign(&quot;div1&quot;, &quot;innerHTML&quot;, &quot;Some Text&quot;);&nbsp; <br />$objResponse-&gt;addAddOption(&quot;select1&quot;,&quot;New Option&quot;,&quot;13&quot;);&nbsp; <br />&nbsp;<br />return $objResponse-&gt;getXML();<br />被调用时，这个方法将会发送需要的javascript到页面并执行. 当然你也有另外一种做法Alternatively, 你可以在你的程序之中创建一个如下的javascript函数: <br />&lt;script type=&quot;text/javascript&quot;&gt;<br />function addOption(selectId,txt,val)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var objOption = new Option(txt,val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById(selectId).options.add(objOption);<br />}<br />&lt;/script&gt;<br />并且使用addScript() 调用这个方法: <br />$objResponse-&gt;addScript(&quot;addOption('select1','New Option','13');&quot;);<br />How do I add custom functionality to xajax?<br />xajax can be extended with all kinds of additional custom functionality. The extendability of xajax is made possible because it is object oriented, and by the addScript() method of the xajaxResponse class. You can create your own xajax response class that extends the xajaxResponse class and has all of the normal xajaxResponse methods, plus your own custom responses. For instance, let's say that you wanted to add a custom response command to add options to select combo boxes. You could extend the xajaxResponse class like this: <br />class myXajaxResponse extends xajaxResponse<br />{&nbsp; <br />&nbsp; function addAddOption($sSelectId, $sOptionText, $sOptionValue)&nbsp; <br />&nbsp; {&nbsp; <br />&nbsp;&nbsp;&nbsp; $sScript&nbsp; = &quot;var objOption = new Option('&quot;.$sOptionText.&quot;','&quot;.$sOptionValue.&quot;');&quot;;<br />&nbsp;&nbsp;&nbsp; $sScript .= &quot;document.getElementById('&quot;.$sSelectId.&quot;').options.add(objOption);&quot;;<br />&nbsp;&nbsp;&nbsp; $this-&gt;addScript($sScript);<br />&nbsp; }<br />}<br />Now, instead of instantiating an xajaxResponse object, you instantiate and use your myXajaxResponse object in your xajax PHP functions: <br />$objResponse = new myXajaxResponse();<br />$objResponse-&gt;addAssign(&quot;div1&quot;, &quot;innerHTML&quot;, &quot;Some Text&quot;);&nbsp; <br />$objResponse-&gt;addAddOption(&quot;select1&quot;,&quot;New Option&quot;,&quot;13&quot;);&nbsp; <br />&nbsp;<br />return $objResponse-&gt;getXML();<br />This method would send the necessary javascript to the page when it was called and execute it. Alternatively, you could create a javascript function in your application: <br />&lt;script type=&quot;text/javascript&quot;&gt;<br />function addOption(selectId,txt,val)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var objOption = new Option(txt,val);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.getElementById(selectId).options.add(objOption);<br />}<br />&lt;/script&gt;<br />and call it with the addScript() method: <br />$objResponse-&gt;addScript(&quot;addOption('select1','New Option','13');&quot;);<br />]]>
</description>
<guid isPermaLink="false">http://www.bokee.net/blogmodule/weblogcomment_viewEntry/454626.html</guid>
<subject>PHP</subject>
<author>jonny</author>
<category>PHP</category>
<pubDate>Thu, 21 Dec 2006 15:23:34 CST </pubDate>
</item>

<item>
<title>appfuse</title>
<link>http://www.bokee.net/blogmodule/weblogcomment_viewEntry/178017.html</link>
<description>
<![CDATA[<p>集成式应用框架<br />具体介绍：<br /><a href="http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh">http://raibledesigns.com/wiki/Wiki.jsp?page=AppFuseQuickStart_zh</a></p>]]>
</description>
<guid isPermaLink="false">http://www.bokee.net/blogmodule/weblogcomment_viewEntry/178017.html</guid>
<subject>我的最爱JAVA/C#</subject>
<author>jonny</author>
<category>我的最爱JAVA/C#</category>
<pubDate>Mon, 10 Jul 2006 09:41:48 CST </pubDate>
</item>

</channel>
</rss>
