﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-挚爱.NET 情人J2EE-随笔分类-程序生涯</title><link>http://www.blogjava.net/chenleiyu/category/7911.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 04 May 2007 09:07:44 GMT</lastBuildDate><pubDate>Fri, 04 May 2007 09:07:44 GMT</pubDate><ttl>60</ttl><item><title>(转)SOA，现在进行时</title><link>http://www.blogjava.net/chenleiyu/archive/2007/05/04/115324.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 04 May 2007 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/05/04/115324.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/115324.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2007/05/04/115324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/115324.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/115324.html</trackback:ping><description><![CDATA[<div style="TEXT-INDENT: 21pt" align=left>SOA现在正热得"烫手"。</div>
<div style="TEXT-INDENT: 21pt" align=left>对于SOA，目前我听到有两种说法：一种讲它是"颠覆性的革命架构"，一种是"谨慎观望"。但无疑，SOA最近几年发展得非常快，各主要软件厂商纷纷高调跟进，关于SOA的报道可以说是不绝于耳。对"SOA热"，程序员们有的兴奋和期待，有的则感到困惑，最近我在金蝶中间件于广州、上海等城市举行的"Java俱乐部"上和程序员们交流时，他们或是以一种朝圣者的表情说："以前面向对象的技术过时了，SOA时代来了"，或者一再恳切地追问我："SOA到底是什么？作用是什么？" <br>那么，SOA是什么?到底能解决什么问题、解决得怎样?我们和客户都准备好了吗?我给出的答案是"Just Processing，SOA-现在进行中"。</div>
<div style="TEXT-INDENT: 21pt" align=left>SOA到底是什么？</div>
<div style="TEXT-INDENT: 21pt" align=left>SOA（Service-Oriented Architecture）的定义是面向服务的架构，就是说将软件按照功能设计成一个个服务，这些服务用标准的方式定义接口、并通过标准的协议进行调用。SOA所定义的接口和调用方式是独立于编程语言和运行平台的，广义上讲SOA可以基于不同的底层技术实现，比如CORBA和Web Services。但CORBA由于过于复杂和臃肿已很少使用，所以目前所说的SOA绝大多数是基于Web Services技术实现。在Web Services的实现方式下，SOA服务的接口用XML进行定义。</div>
<div style="TEXT-INDENT: 21pt" align=left>在SOA架构下，软件开发从业务流程分析开始，使用组件化业务建模的方法识别和分析各种业务模型，将各种实践融入其中，在这个基础上建立用例，用例直接产生BPEL，这些BPEL则可以被融入一个服务整合框架中，其描述了各种服务的信息，从而把ESB上的各个模块统一起来，形成一个巨大的服务仓。</div>
<div style="TEXT-INDENT: 21pt" align=left>这样，SOA甚至是所有软件人员的一个梦:将中间层再进行抽离，在中间层作一个跨技术架构的元数据和业务逻辑，使之成为跨技术架构的、可长期继承、并不断积累的企业业务库和最宝贵的信息资产，也就是面向服务的组件库，而且这个服务组件库也可以被其它企业复用，且不依赖于任何一种技术架构。夸张一点说，如果所有软件企业都使用SOA架构，那么世界软件业将会发生彻底的改变。显然，这样一个框架不是一种产品，也不仅仅是一种技术，而是一种解决问题的方法论。</div>
<div style="TEXT-INDENT: 21pt" align=left>SOA可能应用的两个场景及现有问题</div>
<div style="TEXT-INDENT: 21pt" align=left>那么，SOA要解决的问题是什么？我认为，从技术本质上讲，SOA可能应用于两个场景：第一种是业务互通互联；第二种是封闭交易系统，即将元数据和业务逻辑抽离，形成可复用。举个例子，在第一种场景中，当不同企业之间的业务需要相互调用，这时就可能采用SOA技术；在第二种场景中，在企业内部需要将系统进行迁移时，利用SOA技术定义的原有数据和业务流程，可以很快完成。</div>
<div style="TEXT-INDENT: 21pt" align=left>无疑，SOA是一个伟大的思想，它试图定义一个大家（各种软件厂商）都"认"的、都"遵循"的法则，大家都使用这样的方法来进行互联互通，从而实现无界限的联通，以及服务组件库的继承和复用，解放无效和重复劳动。打一个不那么恰当的比喻，就像人类的语言一样。SOA或许就像《圣经》中那个著名的"通天塔"的故事：人们用同一种语言交流产生的威力是如此之大，以至于他们在巴比伦几乎要修成一个"通天塔"，直达上帝所在的天庭。</div>
<div style="TEXT-INDENT: 21pt" align=left>但是，在SOA应用的两个场景中，现存的问题同样也是明显的：</div>
<div style="TEXT-INDENT: 21pt" align=left>第一种场景：业务互联互通，就是应用系统互联。业务互联，与其说是技术问题，不如讲是业务问题，例如ERP、CRM的异步整合，数据层面整合都不能很好将两个系统整合，SOA仅仅是一种实现工具之一，整合效果并不会好不到那里去。我们可以说，在没有其他选项之前，SOA是一种最"不坏"的方式，但它并不能解决所有的问题，实际上EAI的牵涉面很广，而我们知道，有些问题并不是单纯靠技术就能解决的。</div>
<div style="TEXT-INDENT: 21pt" align=left>第二种场景：封闭交易系统，缺点是性能慢，而且基于Web Services的交易没有形成明确的规范。使用XML作信息交互比较慢是大家都承认的，性能问题将对SOA的发展造在一定的阻力。同时SOA规范本身没有完善，比如Transaction规范还在不断完善，而且Web Service多年来收效甚微。总的来说，SOA现在还处在一个发展阶段，很多标准还在制定，不同厂商间还存在不兼容的现象，因此SOA还不能说已经是一个成熟的技术，还需要时间的检验，还在"进行中"。当然，金蝶中间件作为JCP组织成员，也会推动SOA规范在J2EE平台上的实现。</div>
<div style="TEXT-INDENT: 21pt" align=left>中国用户的现实选择之惑</div>
<div style="TEXT-INDENT: 21pt" align=left>在憧憬SOA技术可能带来的前景之余，我们不得不回过头来冷静地说：SOA和我们大家的共同客户――中国企业还有距离。</div>
<div style="TEXT-INDENT: 21pt" align=left>中国信息化进程与欧美不同，大量的基础业务系统还没建立起来，整合需求并不如想象的那么大。从我们对客户的了解，发现很少有客户有SOA的需求。简单地总结就是，互通无基础，以新建系统为主，需求并不强烈。而欧美市场大量业务系统已建立起来需要整合，从这个角度讲，SOA是适用于他们的。同时，在成功案例极少的前提下，SOA还处于培育期，新建封闭交易系统使用SOA技术还是有一定风险的。</div>
<div style="TEXT-INDENT: 21pt" align=left>一项新技术需要市场的消化，大型企业出于保护企业投资，不会轻易地转移到新的技术平台；而即使像J2EE这样成熟的技术经过了这么多年的发展，也不敢说占有统治地位的市场份额。SOA还需要整个IT界的用户和供应商共同促进。</div>
<div style="TEXT-INDENT: 21pt" align=left>中国信息化需要什么样的技术架构、能够接受什么样的成本价位？这不仅仅是我们的客户需要考虑，我们软件厂商要比客户考虑得更清楚、更进一步。在这个充满变数的激烈竞争市场，只有冷静务实才能生存、发展。</div>
<br>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/115324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-05-04 16:17 <a href="http://www.blogjava.net/chenleiyu/archive/2007/05/04/115324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>（转）使用BEA AquaLogic BPM Suite</title><link>http://www.blogjava.net/chenleiyu/archive/2007/04/24/113362.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 24 Apr 2007 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/04/24/113362.html</guid><description><![CDATA[<table style="TABLE-LAYOUT: fixed">
    <tbody>
        <tr>
            <td>
            <div class=cnt>
            <h3>摘要</h3>
            <p>　　<a href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/aqualogic/business/"><u><font color=#0000ff>BEA&nbsp;AquaLogic&nbsp;Business&nbsp;Service&nbsp;Interaction</font></u></a>&nbsp;(ALBSI)产品线是一组集成的产品和工具，它们可以通过把人与应用程序关联，实现业务流程整个生命周期的自动化、执行和监控。收购Fuego后，AquaLogic&nbsp;BPM&nbsp;Suite（ALBPM）成为了ALBSI产品线的一部分。<a href="http://www.bea.com/framework.jsp?CNT=index.htm&amp;FP=/content/products/aqualogic/"><u><font color=#0000ff>BEA&nbsp;AquaLogic</font></u></a>是BEA产品家族的成员之一，可用确保SOA项目取得成功。</p>
            <p>　　&nbsp;本文演示了公司可以如何使用AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;5.5和其他BEA产品，并举例说明了如何在过程流中使用BEA&nbsp;WebLogic&nbsp;Integration&nbsp;8.1&nbsp;(WLI)组件，以及如何将AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1&nbsp;(ALSB)用于BPM引擎对Web&nbsp;service所做的中间调用。借助AquaLogic&nbsp;BPM&nbsp;HiPer&nbsp;Workspace&nbsp;5.5、WebLogic&nbsp;Portal&nbsp;8.1.5&nbsp;(WLP)和AquaLogic&nbsp;Integration&nbsp;Process&nbsp;1.5&nbsp;(ALIP)，业务分析师可以通过Web方式直接与过程流进行交互。</p>
            <h3>简介</h3>
            <p>　　随着业务流程管理（BPM）成为企业战略的一个关键部分，业务分析师和IT人员必须共同了解它的优势，以及如何才能最好地将业务流程管理与现有基础架构联系在一起。企业总是在没有软件支撑的情况下直接或间接地管理着业务流程。现在，企业可以应用软件来监控特定的业务流程，回顾其执行历史，为企业提供分析流程性能的功能，并对原始流程进行实时修改。</p>
            <p>　　&nbsp;本文提供了一个参考场景，即在一个简单的过程流中使用AquaLogic&nbsp;BPM&nbsp;Suite和其他BEA产品，以实现两个目标：创建一个过程流并调用一个在BEA&nbsp;WebLogic&nbsp;Integration&nbsp;Server中创建的Java流程；与AquaLogic&nbsp;Service&nbsp;Bus交互以调度不同的业务服务。</p>
            <p>　　&nbsp;在与AquaLogic&nbsp;BPM进行集成时，其他BEA产品可以从业务流程管理服务中受益，如图1中所示。您可以同时使用BPM和BEA&nbsp;Application&nbsp;Infrastructure和BEA&nbsp;Service&nbsp;Infrastructure。</p>
            <p align=center><img height=195 alt="使用BEA AquaLogic BPM Suite图-1" src="http://dev2dev.bea.com.cn/images/image061012001.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图1.&nbsp;AquaLogic&nbsp;BPM&nbsp;Suite可以与BEA&nbsp;Application&nbsp;Infrastructure和BEA&nbsp;Service&nbsp;Infrastructure一起使用，从而提供业务流程管理服务。</em></p>
            <p>　　&nbsp;本文假定您熟悉BEA家族的产品。每一节中都提供了一些参考资料，以便您了解其他的背景知识。</p>
            <h3>BPM简介</h3>
            <p>　　业务流程管理（<em>business&nbsp;process&nbsp;management</em>，BPM）这个术语定义了企业或业务组实现和完成特定流程所需的各种行为。流程准备就绪之后，就可以执行其他步骤来改进和优化它的流和性能。从广泛的意义上说，构成业务流程管理的主要行为可以分为4大类：设计、实现、执行和监控。BPM&nbsp;Suite这个术语适用于可用来监控、实现、运行、监控和优化业务流程的软件工具集。</p>
            <p>　　&nbsp;尽管描述上很抽象，但业务流程却是任何公司的日常运营和服务的一部分。下面给出流程的一些示例：</p>
            <ul>
                <li>申请房屋贷款——Loan&nbsp;Origination&nbsp;Process&nbsp;&nbsp;
                <li>启动一项手机服务——Account&nbsp;Initiation&nbsp;Process&nbsp;&nbsp;
                <li>雇佣一个新员工——Employee&nbsp;On-Boarding&nbsp;Process&nbsp;&nbsp;
                <li>构建一个新的喷气发动机——Parts&nbsp;and&nbsp;Assembly&nbsp;Process&nbsp;&nbsp; </li>
            </ul>
            <p>　　根据下面图2中的说明，还可以定义更加复杂的流程。BPM可以与其他软件解决方案部署在一起，以加强<a href="http://www.bea.com/content/news_events/white_papers/BEA_WLP_Lifecycle_Management_wp.pdf"><u><font color=#0000ff>流程门户</font></u></a>&nbsp;(PDF)的功能；BPM还可以参与到服务编排类型的项目中。</p>
            <ul>
                <li>如果用于流程门户，BPM功能有助于引导应用程序导航流实现特定目标。例如，以portlet形式表现的一组画面流可以由BPM引擎来驱动。&nbsp;&nbsp;
                <li>如果用于服务编排，BPM引擎可以使用<a href="http://dev2dev.bea.com/webservices/bpel/bpel_faq.html"><u><font color=#0000ff>BPEL</font></u></a>标准来驱动一系列服务调用。在这种情况下，可能不需要进行用户交互。&nbsp;&nbsp; </li>
            </ul>
            <p>　　图2演示了如何构建复杂的流来匹配企业中的业务流程。以下是使用AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5工具构建的业务流程的一个示例。</p>
            <p align=center><img height=248 alt="使用BEA AquaLogic BPM Suite图-2" src="http://dev2dev.bea.com.cn/images/image061012002.jpg" width=593 border=0></p>
            <p>　　<em>图2.&nbsp;业务流程流</em></p>
            <p>　　&nbsp;记住，如果可以的话，应该将大型流程分解为较小的子流程，这样可以改进设计。</p>
            <h3>一个集成场景示例</h3>
            <p>　　让我们分析一个集成场景示例，并考虑如何实现它。如果能吃透这个示例，您将了解到如何在AquaLogic&nbsp;BPM中使用WebLogic&nbsp;Integration组件（比如<a href="http://e-docs.bea.com/workshop/docs81/doc/en/integration/tutorial/tutsimple/tutWLIProcessCreateApp.html"><u><font color=#0000ff>Process&nbsp;Definition&nbsp;for&nbsp;Java</font></u></a>，JPD）和AquaLogic&nbsp;Service&nbsp;Bus中的业务服务。下面概括性地介绍了这个以AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;5.5为中心的集成了各种产品的高级场景：</p>
            <ul>
                <li>业务分析师使用AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;5.5定义了一个初始的业务流程流。分析师将使用AquaLogic&nbsp;BPM&nbsp;Designer定义流程，并与IT人员共享该流程定义。&nbsp;&nbsp;
                <li>初始的过程流准备就绪之后，技术用户就可以使用AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5工具实现任何所需的服务或系统集成。&nbsp;&nbsp;
                <li>使用WebLogic&nbsp;Workshop&nbsp;8.1，开发人员可以使用WebLogic&nbsp;Integration&nbsp;8.1.5组件来创建JPD。&nbsp;&nbsp;
                <li>创建组件之后，开发人员将会在AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5工具中调用它们。&nbsp;&nbsp;
                <li>使用AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1或以后版本，开发人员或系统管理员将在公共的BEA&nbsp;WSRP&nbsp;Test&nbsp;Server上注册一个业务服务，并创建一个代理服务。&nbsp;&nbsp;
                <li>创建并配置完组件之后，开发人员将在AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5工具中调用它们。&nbsp;&nbsp;
                <li>最后，可以使用WebLogic&nbsp;Portal&nbsp;8.1.5或AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5运行和监控业务流程。&nbsp;&nbsp; </li>
            </ul>
            <p>　　为了实现这个场景，必须在目标计算机环境中安装下面列出的各种软件。开发人员可以选择只安装他或她最熟悉、使用效率最高的产品。必须安装AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5，以便对过程流进行建模，并将它与其他系统联系起来。</p>
            <ul>
                <li><a href="http://commerce.bea.com/products/aqualogic/aqualogic_prod_fam.jsp"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5&nbsp;</font></u></a>&nbsp;
                <li><a href="http://commerce.bea.com/products/aqualogic/aqualogic_prod_fam.jsp"><u><font color=#0000ff>AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5</font></u></a>&nbsp;&nbsp;
                <li><a href="http://commerce.bea.com/products/aqualogic/aqualogic_prod_fam.jsp"><u><font color=#0000ff>AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1&nbsp;or&nbsp;later</font></u></a>&nbsp;&nbsp;
                <li><a href="http://commerce.bea.com/products/weblogicplatform/weblogic_prod_fam.jsp"><u><font color=#0000ff>WebLogic&nbsp;Workshop&nbsp;8.1.5</font></u></a>&nbsp;&nbsp;
                <li><a href="http://commerce.bea.com/products/weblogicplatform/weblogic_prod_fam.jsp"><u><font color=#0000ff>WebLogic&nbsp;Integration&nbsp;8.1.5</font></u></a>&nbsp;&nbsp;
                <li><a href="http://commerce.bea.com/products/weblogicplatform/weblogic_prod_fam.jsp"><u><font color=#0000ff>WebLogic&nbsp;Portal&nbsp;8.1.5</font></u></a>&nbsp;&nbsp; </li>
            </ul>
            <h3>AquaLogic&nbsp;BPM&nbsp;Suite</h3>
            <p>　　AquaLogic&nbsp;BPM&nbsp;Suite是一个完整的产品套件，用于创建、执行和优化业务流程。这个套件支持业务与IT之间的协作，以便自动化和优化业务流程。这可以提高效率和灵活性，降低成本，并改进服务的一致性和质量。</p>
            <p align=center><img height=290 alt="使用BEA AquaLogic BPM Suite图-3" src="http://dev2dev.bea.com.cn/images/image061012003.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图3.&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Suite组件</em></p>
            <p>　　&nbsp;图&nbsp;3&nbsp;显示了AquaLogic&nbsp;BPM&nbsp;Suite的不同组件。<a href="http://edocs.bea.com/"><u><font color=#0000ff>产品文档</font></u></a>中对这些组件进行了详细的说明。这些组件包括：(1)&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Designer、(2)&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Studio、(3)&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Enterprise&nbsp;Server、(4)&nbsp;BEA&nbsp;AquaLogic&nbsp;HiPer&nbsp;Workspace&nbsp;for&nbsp;BPM、(5)&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Manager和&nbsp;(6)&nbsp;BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Dashboard。</p>
            <h3>使用AquaLogic&nbsp;BPM&nbsp;Designer设计过程流</h3>
            <p>　　业务分析师使用AquaLogic&nbsp;BPM&nbsp;Designer对业务流程流进行建模。这一节的目标是说明如何创建集成场景示例中将要用到的过程流。</p>
            <p>　　&nbsp;在开始构建BPM场景时，需要运行AquaLogic&nbsp;BPM&nbsp;Designer。在Designer工具中，业务用户可以定义流来代表业务流程。他们可以通过轻松拖放各种行为对任意流程进行建模。然后，可以将流保存为XML&nbsp;Process&nbsp;Definition&nbsp;Language&nbsp;(<a href="http://www.wfmc.org/standards/XPDL.htm"><u><font color=#0000ff>XPDL</font></u></a>)文件。XPDL标准提供了一种XML文件格式，可使用这种格式在工具之间交换流程模型。</p>
            <p>　　&nbsp;本文将简要介绍一个简单的流程，它带有与一个使用三个软件组件构建的Java流程的集成点，这些组件是：1)&nbsp;WebLogic&nbsp;Integration&nbsp;8.1.5;&nbsp;(2)使用WebLogic&nbsp;Workshop&nbsp;8.1.5构建的一个Web&nbsp;service;&nbsp;(3)通过AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1公开的一个Web&nbsp;service。这个流程如图4所示。要了解有关各种结构和建模技术的更多信息，请访问<a href="http://edocs.bea.com/albsi/docs55/index.html"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;产品文档</font></u></a>。</p>
            <p align=center><img height=32 alt="使用BEA AquaLogic BPM Suite图-4" src="http://dev2dev.bea.com.cn/images/image061012019.gif" width=32 border=0><img height=250 alt="使用BEA AquaLogic BPM Suite图-5" src="http://dev2dev.bea.com.cn/images/image061012004.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图4.&nbsp;调用WebLogic&nbsp;Integration&nbsp;JPD组件和一些Web&nbsp;service的过程流，其中一个是通过AquaLogic&nbsp;Service&nbsp;Bus调用的</em></p>
            <p>　　&nbsp;至此，业务分析师已经完成了对业务流程流的建模。他们使用了AquaLogic&nbsp;BPM&nbsp;Designer定义流程，并以XPDL格式保存文件。</p>
            <p>　　&nbsp;现在可以与IT人员共享流程定义。技术用户和开发人员也可以参与进来，并使用不同的服务和子系统来参与和添加集成的技术方面的内容。他们将会用到下一节中定义的AquaLogic&nbsp;Studio工具。</p>
            <p>　　&nbsp;在这个示例中，将过程流保存为"ProcessOne"，保存在"ProcessOne.xpdl"名称下的AquaLogic&nbsp;BPM&nbsp;Studio的project目录中。稍后流程将会被部署在BPM服务器中，BPM服务器提供了几种可选的体系结构，以便在以下平台上进行灵活的部署：单机、WebLogic&nbsp;Server&nbsp;8.1&nbsp;SP5、WebSphere&nbsp;5.1或更高版本，以及JBoss&nbsp;3.2或更高版本。</p>
            <p>　　&nbsp;业务分析师如何捕捉业务流程并对其建模呢？他们可以使用AquaLogic&nbsp;BPM&nbsp;Designer，这是为业务分析师提供的一个完整设计环境。它支持通过在屏幕上拖放流程元素来创建任意类型的流程。</p>
            <h3>使用AquaLogic&nbsp;BPM&nbsp;Studio构建过程流</h3>
            <p>　　AquaLogic&nbsp;BPM&nbsp;Studio是流程开发人员的工作平台，如图5所示。它包括AquaLogic&nbsp;BPM&nbsp;Designer，并添加了其他大量工具，以支持开发人员编写业务逻辑，与现有应用程序建立联系，以及组装用来与人进行交互的用户界面。本节的目标是采用前一节中创建的业务流程流，并了解开发人员的观点。</p>
            <p>　　&nbsp;该Studio拥有单机版的AquaLogic&nbsp;BPM引擎，在BPM服务器上进行实际部署之前，允许开发人员执行所有的集成和测试。不需要使用其他软件。Studio内部的ALBPM引擎与本地的Tomcat部署在一起。该BPM引擎是BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Enterprise&nbsp;Server的一部分，它负责编排所有流程及其资源——人、企业、应用程序和系统，管理正确的次序，实施业务规则，并审计每个步骤以确保纠正流程执行、逐步升级和异常管理。服务器负责执行用BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Designer和BEA&nbsp;AquaLogic&nbsp;BPM&nbsp;Studio设计的流程，以及使用BPEL（行业标准的业务流程执行语言）编写的任意流程。</p>
            <p align=center><img height=440 alt="使用BEA AquaLogic BPM Suite图-6" src="http://dev2dev.bea.com.cn/images/image061012005.jpg" width=553 border=0></p>
            <p>　　&nbsp;<em>图5.&nbsp;图2中创建的流程的AquaLogic&nbsp;BPM&nbsp;Studio&nbsp;5.5视图</em></p>
            <p>　　&nbsp;若想完整地了解<a href="http://edocs.bea.com/albsi/docs55/index.html"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Suite</font></u></a>的所有组件，可以访问BEA&nbsp;Web站点的产品页面。</p>
            <p>　　&nbsp;开发人员如何使用AquaLogic&nbsp;BPM&nbsp;Suite呢？他们可以使用AquaLogic&nbsp;BPM&nbsp;Studio工具，它是流程开发人员的工作平台。AquaLogic&nbsp;BPM&nbsp;Suite包括AquaLogic&nbsp;BPM&nbsp;Designer中的所有内容，并添加了其他大量工具，以支持开发人员编写业务逻辑，与现有应用程序建立联系，以及组装用来与人进行交互的用户界面。</p>
            <h3>与WebLogic&nbsp;Integration进行集成</h3>
            <p>　　AquaLogic&nbsp;BPM&nbsp;Suite可以在Web&nbsp;service级别上与WebLogic&nbsp;Integration进行集成。本节的目标是说明如何通过Web&nbsp;service公开JPD。为此，我将在一个控件中包装JPD，并基于该控件生成一个Web&nbsp;service。</p>
            <p>　　&nbsp;在这里，开发人员可以有两个选择。他们可以安装并启动WebLogic&nbsp;Integration&nbsp;8.1.5中自带的示例集成项目，或者从头开始构建一个项目。</p>
            <p>　　&nbsp;安装WebLogic&nbsp;Integration之后启动WebLogic&nbsp;Workshop，然后打开示例应用程序：</p>
            <pre>INSTALL/weblogic81/samples/integration/samplesApp</pre>
            <p>　　接下来，<a href="http://e-docs.bea.com/workshop/docs81/doc/en/integration/tutorial/tutsimple/tutWLIProcessCreateApp.html"><u><font color=#0000ff>创建一个新的JPD</font></u></a>或者使用本文下载文件中可用的一些内容。注意，由于篇幅有限，本文并没有给出完整的项目域及其相关文件；本文假定开发人员将会使用该产品中安装的标准项目，或者将按照文档中的指导从头构建一个项目。</p>
            <p>　　&nbsp;下面简要描述了一个简单的JPD。图6中包含了一个Java流程的Java实现类，并对配置流程行为做了特别的注释。示例业务流程在以下应用程序中可用：Tutorial:&nbsp;Hello&nbsp;World&nbsp;Process&nbsp;Application、Tutorial:&nbsp;Process&nbsp;Application和New&nbsp;Process&nbsp;Application。要使用这些应用程序，可以在WebLogic&nbsp;Workshop中选择File-&gt;New-&gt;Application。</p>
            <p>　　&nbsp;图6显示了本文使用的JPD示例的可视化表示。Java流程执行了一个步骤。注意，这里可以使用各种配置来添加几个步骤。</p>
            <p align=center><img height=448 alt="使用BEA AquaLogic BPM Suite图-7" src="http://dev2dev.bea.com.cn/images/image061012006.jpg" width=414 border=0></p>
            <p>　　&nbsp;<em>图6.&nbsp;使用WebLogic&nbsp;Workshop&nbsp;8.1.5构建的JPD的可视化表示</em></p>
            <p>　　&nbsp;要从头构建一个集成项目，开发人员需要创建一个WebLogic&nbsp;Integration&nbsp;8.1.5域，其中包含项目所需的所有组件。接下来，应该创建一个新的WebLogic&nbsp;Integration&nbsp;8.1.5应用程序，并在WebLogic&nbsp;Workshop&nbsp;8.1.5中创建一个新项目。产品文档中包含了有关如何使用<a href="http://e-docs.bea.com/wls/docs81/adminguide/createdomain.html"><u><font color=#0000ff>配置向导</font></u></a>构建新域的完整细节。</p>
            <p>　　&nbsp;在获得WebLogic&nbsp;Integration应用程序和项目并创建一个JPD之后，可以使用另一种叫做Java控件的技术。注意，在WebLogic&nbsp;Workshop&nbsp;9.2（发布于2006年6月）中，Java控件被实现为Apache&nbsp;Foundation技术集合中的<a href="http://beehive.apache.org/"><u><font color=#0000ff>Beehive&nbsp;Controls</font></u></a>。通过使用上下文菜单，开发人员可以选择&#8220;Generate&nbsp;Process&nbsp;Control&#8221;选项来获得基于JPD文件创建的控件。图7演示了如何使用WebLogic&nbsp;Workshop&nbsp;8.1.5功能集合来实现这一点。WebLogic&nbsp;Platform&nbsp;8.1中的Java控件是可以跨所有BEA产品使用的构建块。</p>
            <p align=center><img height=408 alt="使用BEA AquaLogic BPM Suite图-8" src="http://dev2dev.bea.com.cn/images/image061012007.jpg" width=408 border=0></p>
            <p>　　&nbsp;<em>图7.&nbsp;根据JPD定义生成一个Java控件</em></p>
            <p>　　&nbsp;为了完成示例中的JPD，需要使它可以用作Web&nbsp;service。这个步骤将允许运行在AquaLogic&nbsp;BPM&nbsp;Engine上的任意流程调用Java流程并与之进行交互。在图8中，开发人员可以快速为表示Java流程的Java控件生成一个Web&nbsp;service。这可以在WebLogic&nbsp;Workshop&nbsp;8.1.5的上下文菜单中完成。IDE将自动生成Web&nbsp;service文件及其相关配置。</p>
            <p align=center><img height=32 alt="使用BEA AquaLogic BPM Suite图-9" src="http://dev2dev.bea.com.cn/images/image061012020.gif" width=32 border=0><img height=199 alt="使用BEA AquaLogic BPM Suite图-10" src="http://dev2dev.bea.com.cn/images/image061012008.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图8.&nbsp;用Java控件生成Web&nbsp;service</em></p>
            <p>　　&nbsp;在创建JPD并生成Java控件和Web&nbsp;service之后，可以通过WebLogic&nbsp;Workshop&nbsp;8.1.5测试工具来测试Web&nbsp;service。一切就绪之后，就可以从AquaLogic&nbsp;BPM&nbsp;Suite调用它了。</p>
            <p>　　&nbsp;那么如何与JPD进行集成呢？编写所有JPD，在控件中捕捉它们，并将它们公开为Web&nbsp;service。BEA&nbsp;WebLogic&nbsp;Integration提供了一种开发人员友好的、基于标准的方法，可用该方法整合企业资源，从而支持跨不同系统的细粒度业务流程。开发人员拥有了一个功能强大、经得起实践检验的平台，从而可以快速地构建和公开Java流程。</p>
            <h3>与Web&nbsp;Service进行集成</h3>
            <p>　　使用AquaLogic&nbsp;BPM&nbsp;Suite，您可以轻松地注册和使用Web&nbsp;service。本节的目标是，访问一个将在集成场景中调用的可公共访问的Web&nbsp;service。为了完成这个示例，我们使用BEA的公共<a href="http://wsrp.bea.com/"><u><font color=#0000ff>测试服务器</font></u></a>作为主机创建了一组测试Web&nbsp;service。在这个站点上，除了其他一些测试服务之外，还有一个Weather&nbsp;Service。开发人员可以通过Internet访问这些部署在WebLogic&nbsp;Platform&nbsp;8.1.5上的服务，WSDL的地址是：</p>
            <ul>
                <li><a href="http://wsrp.bea.com/portal/boulder/weather.wsdl"><u><font color=#0000ff>http://wsrp.bea.com/portal/boulder/weather.wsdl</font></u></a>&nbsp;&nbsp; </li>
            </ul>
            <p>　　这恰好是驻留BEA的<a href="http://dev2dev.bea.com/pub/a/2006/06/portal-federation-wlp9.html"><u><font color=#0000ff>WSRP</font></u></a>测试服务器的公共测试服务器。WSRP测试服务器是BEA开发的又一个基于标准的有趣技术集。当开发人员调用天气WSDL时，他们应该获取下一节中用于AquaLogic&nbsp;Service&nbsp;Bus的测试服务的一个列表。</p>
            <h3>与&nbsp;AquaLogic&nbsp;Service&nbsp;Bus进行集成</h3>
            <p>　　让我们回顾一下前面的内容，业务分析师可以使用AquaLogic&nbsp;BPM&nbsp;Suite创建过程流，开发人员可以创建JPD，而公共的Web&nbsp;service可以作为示例使用。现在，让我们看一看如何使用AquaLogic&nbsp;Service&nbsp;Bus来演示使用Web&nbsp;service和服务总线创建代理服务的过程。AquaLogic&nbsp;BPM&nbsp;Suite将会调用这个服务。</p>
            <p>　　&nbsp;在本节中，我们将使用Boulder&nbsp;Weather服务在服务总线中创建代理服务。这个服务可以由服务总线公开，而且AquaLogic&nbsp;BPM&nbsp;Suite也可以调用它。AquaLogic&nbsp;Service&nbsp;Bus的使用让该实现更加健壮。任何对底层IT系统的改动都不会影响流程使用的接口。它还提供独立于BPM套件的单独控制和管理，而这对于SOA至关重要。这使得IT小组能够更好地管理他们拥有和维护的服务策略和资源。<a href="http://dev2dev.bea.com/blog/jesperfj/archive/2006/06/bpm_and_soa.html"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Suite可以部署为SOA的一部分</font></u></a>，这意味着当业务流程连接到底层系统时，它会连接到企业服务总线提供的代理服务，从而隐藏了底层应用程序和数据库的复杂性。</p>
            <p>　　&nbsp;一开始，管理员或开发人员可以使用随AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1安装一起提供的样本实例。开发人员可能想定制配置服务总线的某些方面，而这样做就要求使用他们自己的安装。产品文档提供了一篇教程，说明了如何获得步骤和概念的流。关于<a href="http://dev2dev.bea.com/alservicebus/"><u><font color=#0000ff>AquaLogic&nbsp;Service&nbsp;Bus</font></u></a>的信息，可以查看产品文档。</p>
            <p>　　&nbsp;在学习本节内容之前，启动AquaLogic&nbsp;Service&nbsp;Bus&nbsp;并打开随安装一起提供的示例应用程序。可以在命令行执行以下命令来启动应用程序：&lt;Install&gt;\weblogic91\samples\domains\servicebus\StartWebLogic.cmd。</p>
            <p>　　&nbsp;至此，就可以使用上一节中的WSDL来注册Weather&nbsp;Service了：</p>
            <ul>
                <li><a href="http://wsrp.bea.com/portal/boulder/weather.wsdl"><u><font color=#0000ff>http://wsrp.bea.com/portal/boulder/weather.wsdl</font></u></a>&nbsp;&nbsp; </li>
            </ul>
            <p>　　登录之后，应该查看一下现有服务的当前状态。从Service&nbsp;Summary和Server&nbsp;Summary面板上可以看到这些信息。左侧的导航栏还带有可用于配置新服务的选项卡。与BEA&nbsp;WebLogic&nbsp;Server类似，在进行任何更改之前，开发人员和管理员必须访问Change&nbsp;Center，这样才能使更改生效。</p>
            <p>　　&nbsp;图&nbsp;9&nbsp;显示了可用于标准安装的一些预加载服务。</p>
            <p align=center><img height=235 alt="使用BEA AquaLogic BPM Suite图-11" src="http://dev2dev.bea.com.cn/images/image061012009.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图9.&nbsp;AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1,&nbsp;Administration&nbsp;Console</em></p>
            <p>　　&nbsp;在左侧导航栏的project选项卡中，应该为要使用服务总线进行调度的服务创建一个新的项目。在这个步骤中，Weather&nbsp;WSDL被上传到服务总线。开发人员或管理员将对他们要调用的业务服务进行配置。可以将这些服务将用作总线代理服务。这种中间介质在SOA中特别重要，因为在SOA中，底层服务可能会修改和需要完善的代理，以确保服务质量(QoS)。图10显示了已配置的项目以及它们各自的服务。</p>
            <p align=center><img height=239 alt="使用BEA AquaLogic BPM Suite图-12" src="http://dev2dev.bea.com.cn/images/image061012010.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图10.&nbsp;创建Project&nbsp;Boulder&nbsp;Weather和配置WSDL、业务和代理服务。</em></p>
            <p>　　&nbsp;关于如何配置WSDL、业务服务和代理服务的更多详细信息，请参阅<a href="http://edocs.bea.com/alsb/docs21/index.html"><u><font color=#0000ff>服务总线文档</font></u></a>和<a href="http://edocs.bea.com/alsb/docs21/examples/index.html"><u><font color=#0000ff>示例项目</font></u></a>。</p>
            <p>　　&nbsp;至此，您可以有创造性地使用从AquaLogic&nbsp;BPM调用的代理服务。打开消息流面板，上面有几个用来与服务进行交互的选项。图11显示了指向消息流面板的图标。</p>
            <p align=center><img height=343 alt="使用BEA AquaLogic BPM Suite图-13" src="http://dev2dev.bea.com.cn/images/image061012011.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图11.&nbsp;通过消息流可以更加深入地了解代理服务。</em></p>
            <p>　　&nbsp;进入消息流面板之后，可以将业务服务展开为支持转换和任意其他可以更好地代理服务的步骤。可以给服务添加新节点，以便执行单独的操作、审查消息的内容和修改通过服务总线传递的服务流。</p>
            <p>　　&nbsp;路由节点可以同时在Request&nbsp;Actions和Response&nbsp;Actions中进行操作。如果通过业务服务的WSDL可以使用不同的服务，那么在每个节点中都可以查看和选择它们，从而调用它们，如图12所示。如果开发人员和管理员需要，可以在每个节点中添加动作。</p>
            <p align=center><img height=167 alt="使用BEA AquaLogic BPM Suite图-14" src="http://dev2dev.bea.com.cn/images/image061012012.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图12.&nbsp;BEA测试服务器中各种可用的服务。</em></p>
            <p>　　&nbsp;配置完所有的服务之后，路由节点已经被设置为调用正确的服务；服务总线包含的测试工具可用于代理服务的正确行为。<a href="http://e-docs.bea.com/alsb/docs21/tutorial/tutRoute.html#1054563"><u><font color=#0000ff>Routing&nbsp;a&nbsp;Loan&nbsp;Application&nbsp;tutorial</font></u></a>是一个完整的在线示例，它将逐步指导您注册、监控、管理和公开业务服务。</p>
            <p>　　&nbsp;那么，如何与AquaLogic&nbsp;Service&nbsp;Bus进行集成呢？使用服务总线配置和注册所有的Web&nbsp;service，然后配置其相关的代理服务，并将它们公开为Web&nbsp;service。AquaLogic&nbsp;Service&nbsp;Bus可以帮助进行配置和部署，它简化了跨SOA环境共享服务的管理工作。</p>
            <h3>通过AquaLogic&nbsp;BPM&nbsp;Suite组合所有的服务</h3>
            <p>　　使用AquaLogic&nbsp;BPM&nbsp;Studio可以与多个系统和子系统进行集成。本节的目标是与使用WebLogic&nbsp;Integration构建的JPD进行集成、与在服务总线中公开的Web&nbsp;service进行集成，并直接与来自BEA测试服务器的Web&nbsp;service进行集成。这将使示例集成场景变得完整。</p>
            <p>　　&nbsp;可以使用<a href="http://edocs.bea.com/albsi/docs55/index.html"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Studio</font></u></a>检查前面创建的JPD。Studio完成自检步骤之后，就可以直接从过程流调用流程。图13演示了创建的WebLogic&nbsp;Integration模块，以及必须调用AquaLogic&nbsp;BPM&nbsp;Suite才能与JPD进行交互的Web&nbsp;service。</p>
            <p align=center><img height=274 alt="使用BEA AquaLogic BPM Suite图-15" src="http://dev2dev.bea.com.cn/images/image061012013.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图13.&nbsp;检查WebLogic&nbsp;Integration流程的模块</em></p>
            <p>　　&nbsp;内省步骤完成之后，就可以实例化并直接从业务流程流调用JPD。图14显示了展开以后的流程节点和用于调用Java流程的代码。</p>
            <p align=center><img height=141 alt="使用BEA AquaLogic BPM Suite图-16" src="http://dev2dev.bea.com.cn/images/image061012014.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图14.&nbsp;用来与JPD进行交互的简单脚本</em></p>
            <p>　　&nbsp;对于AquaLogic&nbsp;Service&nbsp;Bus和天气服务，也可以直接采用相同的做法。图15演示了如何创建模块和添加代码，以便与每个服务进行交互。</p>
            <p align=center><img height=173 alt="使用BEA AquaLogic BPM Suite图-17" src="http://dev2dev.bea.com.cn/images/image061012015.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图15.&nbsp;与AquaLogic&nbsp;Service&nbsp;Bus对话的模块和一个简单的Web&nbsp;service</em></p>
            <p>　　&nbsp;至此，开发人员应该在环境中安装了所有的产品。所有相关组件都应该通过WebLogic&nbsp;Integration&nbsp;8.1.5和AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1配置完毕。</p>
            <p>　　&nbsp;如何对业务流程建模并将它们与AquaLogic&nbsp;BPM&nbsp;Studio进行集成呢？我们使用的方法是，列出所有的外部系统资源，定义每个入口点，使用AquaLogic&nbsp;BPM&nbsp;Studio工具检查它们，然后使用ALBPM内置引擎测试流。</p>
            <p>　　&nbsp;AquaLogic&nbsp;BPM&nbsp;Suite跳出了传统人力工作流和流程技术的限制。它提供了一套用于支持异构环境中的复杂协作式业务流程的软件。</p>
            <h3>通过Web浏览器访问&nbsp;AquaLogic&nbsp;BPM&nbsp;Suite</h3>
            <p>　　Web层表示了企业的业务用户初始化、管理、监控并与业务流程和其他用户协作的主要入口点。在本节中，我将演示BEA如何提供几个触点来介绍各种用例的Web层。</p>
            <p>　　&nbsp;AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;有三个主要的集成点：</p>
            <ul>
                <li>业务用户会发现AquaLogic&nbsp;BPM&nbsp;5.5&nbsp;HiPer&nbsp;Workspace是开箱即用的。用户还可以对这个前端进行定制，以满足不同环境和使用外部系统的需求。&nbsp;&nbsp;
                <li>第二个集成点是<a href="http://edocs.bea.com/alui/process/docs15/index.html"><u><font color=#0000ff>AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5</font></u></a>，借助它可以让业务流程管理满足企业级的协作要求。这种组合提供了一组非常强大的功能，以支持业务用户参与协作式的过程流。&nbsp;&nbsp;
                <li>第三个集成点是<a href="http://edocs.bea.com/albsi/docs55/index.html"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;5.5</font></u></a>中可用的JSR&nbsp;168&nbsp;portlet。它们可以放入任何与JSR&nbsp;168兼容的容器中，包括其他门户产品中的WebLogic&nbsp;Portal&nbsp;8.1。&nbsp;&nbsp; </li>
            </ul>
            <p>　　图16演示了如何从AquaLogic&nbsp;BPM&nbsp;HiPer&nbsp;Workspace直接与流程进行交互。在业务用户登录之后，他们将执行几个动作，比如初始化一个业务流程，参与过程流，查看不同流程的历史，通过相关附件进行浏览，等等。</p>
            <p align=center><img height=157 alt="使用BEA AquaLogic BPM Suite图-18" src="http://dev2dev.bea.com.cn/images/image061012016.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图16.&nbsp;AquaLogic&nbsp;BPM&nbsp;HiPer&nbsp;Workspace</em></p>
            <p>　　&nbsp;AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5提供的工具可以交付复合应用程序，可以使用这些应用程序跨业务流程协调用户行为和系统集成。企业可以很容易地创建和部署包含业务流程的新应用程序。图17显示了协作式环境中AquaLogic&nbsp;Interaction&nbsp;Process与AquaLogic&nbsp;BPM&nbsp;Suite之间的集成。</p>
            <p align=center><img height=218 alt="使用BEA AquaLogic BPM Suite图-19" src="http://dev2dev.bea.com.cn/images/image061012017.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图17.&nbsp;AquaLogic&nbsp;Integration&nbsp;Process&nbsp;1.5</em></p>
            <p>　　&nbsp;关于部署协作式过程流的更多文档，可以参阅<a href="http://edocs.bea.com/alui/process/docs15/index.html"><u><font color=#0000ff>AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5&nbsp;文档</font></u></a>。</p>
            <p>　　&nbsp;WebLogic&nbsp;Portal和其他与JSR&nbsp;168兼容的门户可以调用包含在AquaLogic&nbsp;BPM&nbsp;Suite&nbsp;5.5中的BPM&nbsp;portlet，以便与不同的业务流程进行交互。图&nbsp;18显示了WebLogic&nbsp;Portal&nbsp;8.1安装使用的JSR&nbsp;168&nbsp;portlet。</p>
            <p align=center><img height=105 alt="使用BEA AquaLogic BPM Suite图-20" src="http://dev2dev.bea.com.cn/images/image061012018.jpg" width=450 border=0></p>
            <p>　　&nbsp;<em>图18.&nbsp;运行BPM&nbsp;portle的tWebLogic&nbsp;Portal&nbsp;8.1&nbsp;</em></p>
            <p>　　&nbsp;从Web层支持流程交互有多种方式。可以使用内置的AquaLogic&nbsp;BPM&nbsp;HiPer&nbsp;Workspace的所有流程管理功能。业务分析师可以使用AquaLogic&nbsp;Interaction流程参与流程协作。最后，使用门户软件的客户可以利用portlet与现有应用程序和流程交互进行集成。</p>
            <h3>下载</h3>
            <p>　　下载本文附带的示例应用程序：</p>
            <ul>
                <li><a href="http://dev2dev.bea.com/2006/09/Download.zip"><u><font color=#0000ff>Download.zip</font></u></a>&nbsp;&nbsp; </li>
            </ul>
            <h3>结束语</h3>
            <p>　　现在，业务分析师和IT部门的成员可以开始使用AquaLogic&nbsp;BPM&nbsp;Suite和其他BEA产品，比如WebLogic&nbsp;Integration&nbsp;8.1.5、AquaLogic&nbsp;Service&nbsp;Bus&nbsp;2.1或更高版本、AquaLogic&nbsp;Interaction&nbsp;Process&nbsp;1.5和&nbsp;WebLogic&nbsp;Portal&nbsp;8.1.5。</p>
            <p>　　&nbsp;请将您的反馈和需求与AquaLogic&nbsp;BPM&nbsp;团队共同分享。在Dev2Dev网站上可以查看<a href="http://forums.bea.com/bea/category.jspa?categoryID=600000008"><u><font color=#0000ff>AquaLogic&nbsp;BPM&nbsp;Newsgroup</font></u></a>页面。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/113362.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-04-24 23:12 <a href="http://www.blogjava.net/chenleiyu/archive/2007/04/24/113362.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)使用AquaLogic Service Bus保护服务</title><link>http://www.blogjava.net/chenleiyu/archive/2007/04/24/113359.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 24 Apr 2007 15:08:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/04/24/113359.html</guid><description><![CDATA[<h3>摘要</h3>
<p>　　服务总线支持以一种统一的方式来定义服务的非功能性方面，比如服务安全性。服务总线允许从服务实现中分离出安全性考虑因素。因此，无需将安全性策略编写到单个服务中。这将产生可重用性更好的更具灵活的系统，而这对于SOA环境中的安全性来说是至关重要的。本教程演示了一个使用BEA的AquaLogic Service Bus 2.0将安全性策略集中式地应用到服务的例子。例子展示了如何将基于WS-Security的消息级安全性应用到SOAP Web服务。教程使用了一个指定Web服务客户端必须签名SOAP请求并提供受信任的证书的安全性策略。例子展示了可以应用到ALSB代理的Web服务的许多基于WS-Security的策略中的一种，并说明了在ALSB以及底层的WebLogic Server中为这些Web服务配置安全性的步骤。教程假设读者对Java、J2EE和Web服务有很好的理解，并具有使用BEA WebLogic Server和AquaLogic Service Bus产品的经验。</p>
<h3>简介</h3>
<p>　　AquaLogic Service Bus (ALSB)是用于在面向服务架构(SOA)环境中管理和代理服务和发送服务消息的企业服务总线(ESB)产品。主机环境总是包含有远程Web服务和更为传统的基于消息的联网系统。ALSB充当一个中间层，它接收消息，并对其进行处理以确定接下来将消息发送到何处，以及是否和如何转换消息内容。ALSB通过一种传输协议接收消息，比如HTTP(S)、JMS、File或FTP，然后再通过同一种或另一种传输协议将消息发送出去。ALSB用于封装现有的&#8220;业务服务&#8221;，并为之提供统一的外观，即，一组&#8220;代理服务&#8221;。通过提供这种外观，许多服务特征都可以被抽象出来并在一个地方应用，比如安全性策略、服务位置透明性、数据格式、传输协议和消息传递模型（异步、同步）。然后就有可能在版本控制、日志记录、监控、报告、审计、错误处理和客户端应用程序访问等方面集中式地管理这些服务。该架构可以帮助公司最大限度地对现有服务进行控制和重用，并提供一个用于随时间逐步增加新服务的高效模型。</p>
<p>　　ALSB可以用于对它所代理的服务应用安全性策略。这些安全性策略可以满足针对Web服务机密性、完整性、身份验证和访问控制的任何安全性需求组合。ALSB支持传输层安全性（如SSL）和消息层安全性（如WS-Security），甚至需要的话，还支持对同一服务实例的两种安全性的组合。WS-Security是一组由OASIS管理的规范，它指定了如何对Web服务消息内容（例如，SOAP头部和/或主体）进行加密和签名，以及服务消费者如何对服务提供者进行身份验证（如：通过SAML、X.509）。通过采用消息层安全性策略而不是传输层安全性策略，SOA中的Web服务中间层（比如，ALSB之类的企业服务总线）就可以代理和发送消息而不必对流经它的消息进行解密和重加密。WS-Policy是另一个由OASIS管理的规范，它支持对Web服务指定通用属性和断言。WS-Security规范采用WS-Policy规范作为其语法以支持为Web服务指定安全性特征。</p>
<h3>关于本教程</h3>
<p>　　在本教程中，为了演示如何使用ALSB保护Web服务，例子使用了一个简单的Echo代理服务。当被调用时，该Echo服务复制请求的主体文本，并将该文本发送回响应的主体。因此，该代理服务实际上并没有转到一个&#8220;后端&#8221;业务服务。这种设计思路使得可以尽可能简单地将WS-Security结合到ALSB中。在现实用例中，代理服务总是从一个&#8220;后端&#8221;业务服务接收消息并将消息发送给它。此外，在此教程中，我们使用的是一个自签名的证书而不是由著名证书授权方签名的证书，以及使用单个的WebLogic管理服务器而不是托管服务器集群。</p>
<p>　　例子创建并使用了一个定制的WS-Policy文件，而不是使用WebLogic Server用于WS-Security的三个开箱即用的WS-Policy文件。Web服务的WSDL和WS-Policy文件指定由客户端对服务请求但不对服务响应进行签名。具体的示例策略文件并没有说明加密应该用于请求或响应。在教程的结尾部分，包括有一组可选步骤，描述了在调用Web服务时，如何基于由客户端应用程序所传递的证书的细节为代理Web服务设置访问控制。图1显示了教程例子的基本结构：</p>
<p align=center><a href="http://dev2dev.bea.com/images/2006/04/maindiagram.png" target=_blank><img height=190 alt=本教程中所使用的例子的架构 src="http://dev2dev.bea.com.cn/images/image060605002.jpg" width=449 vspace=4 border=0></a><br>图1. 本教程中所使用的例子的架构（单击图像查看大图）</p>
<p>　　下面几节描述了配置ALSB以及创建和调用受保护的代理服务所需的步骤。</p>
<h3>初始ALSB配置</h3>
<p>　　首先，需要安装AquaLogic Service Bus及其主机WebLogic Server实例，并配置一个域。</p>
<ol>
    <li>使用默认的安装设置安装ALSB 2.0（包括WebLogic Server 9.0）。
    <li>使用Domain Configuration Wizard (config.sh)创建一个新域（base_domain），它被配置为自动支持AquaLogic Services Bus。 </li>
</ol>
<h3>创建密钥和密钥库</h3>
<p>　　WS-Security依赖于PKI来支持消息加密、签名，通常还有身份验证。在这个例子中，客户端应用程序使用了一个来自其identity keystore的私钥来签名一个消息，而ALSB服务器使用其trust keystore来帮助其确定消息是否已经被更改了，以及提供的证书是否可信。因此，私钥-公钥对以及客户端应用程序关联的证书需要在一个新的identity keystore中创建，而且证书必须被添加到一个ALSB可用的新的trust keystore中。</p>
<ol>
    <li>使用包含在WLS/ALSB附带的JDK中的Java &#8220;keytool&#8221;实用工具，在域的根目录下新的Identity keystore中为示例用户Bob创建一个新的私钥-公钥对。下面是具体的代码：
    <pre>&gt; keytool -genkey
    -keyalg rsa -keystore wsidentity.jks -alias bob -keysize 1024
    -keypass weblogic -storepass weblogic -validity 3650
    What is your first and last name?
    [Unknown]:  bob
    What is the name of your organizational unit?
    [Unknown]:  IT
    What is the name of your organization?
    [Unknown]:  BEA
    What is the name of your City or Locality?
    [Unknown]:  LONDON
    What is the name of your State or Province?
    [Unknown]:  LONDON
    What is the two-letter country code for this unit?
    [Unknown]:  UK
    Is CN=bob, OU=IT, O=BEA, L=LONDON, ST=LONDON,
    C=UK correct?
    [no]:  yes
    </pre>
    <li>将这个自签名的证书导出到一个base-64编码的文件bob.pem中：
    <pre>&gt; keytool -export -alias bob -file bob.pem -keystore
    wsidentity.jks -storepass weblogic -rfc
    </pre>
    <li>导出Bob的自签名证书到一个新的trust keystore中，WebLogic Server将使用该密钥库确定对WS-Security和/或SSL客户端的信任： </li>
</ol>
<pre>&gt; keytool -import -alias bob -file bob.pem -keystore
trust.jks-storepass weblogic
</pre>
<h3>配置服务器密钥库</h3>
<p>　　一旦创建了密钥和密钥库，就必须使用这些密钥库来配置服务器。</p>
<ol>
    <li>从域目录下启动ALSB/WLS服务器（例如，运行.startWebLogic.sh）。
    <li>从一个浏览器运行WebLogic Admin Console（例如http://localhost:7001/console），并配置WebLogic Server使用新的证书trust keystore而不是默认的demo trust keystore（选择服务器的Keystores选项卡，并输入密钥库设置）。注意：WebLogic Server不允许服务器仍然使用demo identity store，因此，在本例中，也指定了新的identity store，即使服务总线或应用服务器并没有直接将其用于Web服务消息层安全性。图2所示的屏幕快照显示了示例设置（&#8220;passphrase&#8221;项是&#8220;weblogic&#8221;）：
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/wlstrustsetup.png" target=_blank><img height=357 alt=WebLogic密钥库配置 src="http://dev2dev.bea.com.cn/images/image060605004.gif" width=449 vspace=4 border=0></a><br>图2. WebLogic密钥库配置（单击图像查看大图）</p>
    <li>使用WebLogic Admin Console，对于默认的安全性领域(myrealm)，选择添加一个新的Provider，然后通过选择图3中所示的New按钮，选择添加一个新的Credential Provider：
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/credmapfirst.png" target=_blank><img height=204 alt=凭证映射提供者列表 src="http://dev2dev.bea.com.cn/images/image060605006.gif" width=449 vspace=4 border=0></a><br>图3. 凭证映射提供者列表（单击图像查看大图）</p>
    <p>　　例如，将名称设置为WSPKICredentialMapper，并确保将类型设置为PKICredentialMapper，如图4所示：</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/credmapscnd.png" target=_blank><img height=282 alt=创建新的凭证映射提供者 src="http://dev2dev.bea.com.cn/images/image060605008.gif" width=449 vspace=4 border=0></a><br>图4. 创建新的凭证映射提供者（单击图像查看大图）</p>
    <p>　　保存了之后，选择编辑特定于提供者的设置来指定将定制的identity keystore作为该凭证映射方的密钥库，如图5所示。注意：在该例子中，&#8220;passphrase&#8221;项是&#8220;weblogic&#8221;。</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/credmapthird.png" target=_blank><img height=288 alt=提供者配置 src="http://dev2dev.bea.com.cn/images/image060605010.gif" width=449 vspace=4 border=0></a><br>图5. 提供者配置（单击图像查看大图）</p>
    <li>保存并激活更改之后，重启WebLogic Server以启用新的密钥库设置。 </li>
</ol>
<p>　　注意：严格地说，如果ALSB/WebLogic Server不必签名或加密Web服务响应的话（正如本例中的情况），就不需要指定PKI凭证映射方。但是，我们提供了这些额外步骤，以便可以在日后提供Web服务响应签名/加密功能。</p>
<h3>创建ALSB安全性代理服务</h3>
<p>　　在ALSB以及底层的WebLogic Server中正确配置了密钥库之后，就可以在ALSB中创建代理服务以及关联的安全性策略。</p>
<ol>
    <li>从浏览器运行ALSB Admin Console（例如http://localhost:7001/sbconsole），并创建一个新项目（例如demo）。
    <li>使用ALSB Admin Console创建一个新的代理服务提供者（例如SecureProxyServiceProvider）来保护代理服务，如图6的屏幕快照所示：
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/proyserviceprovider.png" target=_blank><img height=202 alt=代理服务提供者定义 src="http://dev2dev.bea.com.cn/images/image060605012.gif" width=449 vspace=4 border=0></a><br>图6.代理服务提供者定义（单击图像查看大图）</p>
    <li>使用ALSB Admin Console创建一个新的资源类型为&#8220;Proxy Service Provider&#8221;的安全性配置凭证，它定义了先前在WebLogic Server identity keystore中所设置的密钥对的别名。该密钥库资源随后可以被任何需要对客户端应用程序的SOAP响应进行加密或签名的ALSB代理服务使用（本例并非如此）。如图7所示，选择资源类型：
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/proxyproviderfirst.png" target=_blank><img height=199 alt=代理服务提供者配置，第1部分 src="http://dev2dev.bea.com.cn/images/image060605014.gif" width=449 vspace=4 border=0></a><br>图7.代理服务提供者配置，第1部分（单击图像查看大图）</p>
    <p>　　指定提供者目的，如图8所示：</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/proxyprovidersecond.png" target=_blank><img height=164 alt=代理服务提供者配置，第2部分 src="http://dev2dev.bea.com.cn/images/image060605016.gif" width=449 vspace=4 border=0></a><br>图8.代理服务提供者配置，第2部分（单击图像查看大图）</p>
    <p>　　指定提供者类型，如图9所示：</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/proxyproviderthird.png" target=_blank><img height=170 alt=代理服务提供者配置，第3部分 src="http://dev2dev.bea.com.cn/images/image060605018.gif" width=449 vspace=4 border=0></a><br>图9.代理服务提供者配置，第3部分（单击图像查看大图）</p>
    <p>　　检查提供者设置，并按下Finish按钮，如图10所示：</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/proxyprovidrfourth.png" target=_blank><img height=219 alt=代理服务提供者配置，第4部分 src="http://dev2dev.bea.com.cn/images/image060605020.gif" width=449 vspace=4 border=0></a><br>图10.代理服务提供者配置，第4部分（单击图像查看大图）</p>
    <li>使用ALSB Admin Console添加下面的示例定制WS-Policy文件（SigningPolicy.xml)）。该策略文件指定了消息的主体、特定于WLS的头部，而时间戳头部应该由消息的发送方签名。该策略还声明，客户端应该在消息中包含一个期限设为300秒的时间戳头部：
    <pre>&lt;?xml version="1.0"?&gt;
    &lt;wsp:Policy
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wssp="http://www.bea.com/wls90/security/policy"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wls="http://www.bea.com/wls90/security/policy/wsee#part"
    wsu:Id="signMessage"&gt;
    &lt;wssp:Integrity&gt;
    &lt;wssp:SignatureAlgorithm
    URI="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/&gt;
    &lt;wssp:CanonicalizationAlgorithm
    URI="http://www.w3.org/2001/10/xml-exc-c14n#"/&gt;
    &lt;wssp:Target&gt;
    &lt;wssp:DigestAlgorithm
    URI="http://www.w3.org/2000/09/xmldsig#sha1" /&gt;
    &lt;wssp:MessageParts
    Dialect="http://www.bea.com/wls90/security/policy/wsee#part"&gt;
    wls:SystemHeaders()
    &lt;/wssp:MessageParts&gt;
    &lt;/wssp:Target&gt;
    &lt;wssp:Target&gt;
    &lt;wssp:DigestAlgorithm
    URI="http://www.w3.org/2000/09/xmldsig#sha1" /&gt;
    &lt;wssp:MessageParts
    Dialect="http://www.bea.com/wls90/security/policy/wsee#part"&gt;
    wls:SecurityHeader(wsu:Timestamp)
    &lt;/wssp:MessageParts&gt;
    &lt;/wssp:Target&gt;
    &lt;wssp:Target&gt;
    &lt;wssp:DigestAlgorithm
    URI="http://www.w3.org/2000/09/xmldsig#sha1" /&gt;
    &lt;wssp:MessageParts
    Dialect="http://schemas.xmlsoap.org/2002/12/wsse#part"&gt;
    wsp:Body()
    &lt;/wssp:MessageParts&gt;
    &lt;/wssp:Target&gt;
    &lt;/wssp:Integrity&gt;
    &lt;wssp:MessageAge Age="300"/&gt;
    &lt;/wsp:Policy&gt;</pre>
    <p>　　该策略文件可以用于将一个Web服务策略应用到一个或多个代理服务。如果对同一组服务支持许多不同的安全性约束，那么完全可以定义多个不同的策略文件。但是，对于要对所有服务统一应用一个安全性策略的情况，就可以使用该安全性策略定义。如果需要的话，该策略还可以包括加密和身份验证实施元素。</p>
    <li>使用ALSB Admin Console，为一个假想的&#8220;Echo&#8221;Web服务添加下面的示例WSDL文件(EchoServiceSecure.wsdl)，并在保存后选择Edit References for the WSDL，关联其策略文件依赖性到前一步骤所添加的策略文件中。WSDL文件定义了一个Echo Web服务，并声明WS-Policy文件只应该被应用于服务输入消息：
    <pre>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;wsdl:definitions targetNamespace="http://MyNamespace"
    xmlns="http://schemas.xmlsoap.org/wsdl/"
    xmlns:impl="http://MyNamespace"
    xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"
    xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    &gt;
    &lt;wsp:UsingPolicy wsdl:Required="true"
    xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/&gt;
    &lt;wsdl:message name="EchoRequest"&gt;
    &lt;wsdl:part name="in0" type="xsd:string"/&gt;
    &lt;/wsdl:message&gt;
    &lt;wsdl:message name="EchoResponse"&gt;
    &lt;wsdl:part name="out0" type="xsd:string"/&gt;
    &lt;/wsdl:message&gt;
    &lt;wsdl:portType name="Echo"&gt;
    &lt;wsdl:operation name="DoEcho" parameterOrder="in0"&gt;
    &lt;wsdl:input name="EchoRequest" message="impl:EchoRequest"/&gt;
    &lt;wsdl:output name="EchoResponse" message="impl:EchoResponse"/&gt;
    &lt;/wsdl:operation&gt;
    &lt;/wsdl:portType&gt;
    &lt;wsdl:binding name="EchoSoapBinding" type="impl:Echo"&gt;
    &lt;wsdlsoap:binding style="document"
    transport="http://schemas.xmlsoap.org/soap/http"/&gt;
    &lt;wsdl:operation name="DoEcho"&gt;
    &lt;wsdlsoap:operation soapAction=""/&gt;
    &lt;wsdl:input name="EchoRequest"&gt;
    &lt;wsp:Policy&gt;
    &lt;wsp:PolicyReference
    URI="file://SigningPolicy.xml"/&gt;
    &lt;/wsp:Policy&gt;
    &lt;wsdlsoap:body use="literal"
    namespace="http://MyNamespace"/&gt;
    &lt;/wsdl:input&gt;
    &lt;wsdl:output name="EchoResponse"&gt;
    &lt;wsdlsoap:body use="literal"
    namespace="http://MyNamespace"/&gt;
    &lt;/wsdl:output&gt;
    &lt;/wsdl:operation&gt;
    &lt;/wsdl:binding&gt;
    &lt;wsdl:service name="EchoService"&gt;
    &lt;wsdl:port name="Echo" binding="impl:EchoSoapBinding"&gt;
    &lt;wsdlsoap:address
    location="http://localhost/services/MyEchoService"/&gt;
    &lt;/wsdl:port&gt;
    &lt;/wsdl:service&gt;
    &lt;/wsdl:definitions&gt;
    </pre>
    <p>　　注意：在代理服务被用于转到一个现实业务服务的情况中，该WSDL文件总是源自来自现实业务服务的WSDL文件，从后者生成该代理服务的接口。</p>
    <li>使用ALSB Admin Console，基于所添加的WSDL文件的WSDL端口创建一个代理服务（例如EchoProxyService），并引用先前所创建的代理服务提供者。确保选中了Process WS-Security Header复选框，如图11所示：
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/createproxyfirst.png" target=_blank><img height=412 alt=代理WS-Security头部配置 src="http://dev2dev.bea.com.cn/images/image060605002.gif" width=449 vspace=4 border=0></a><br>图11. 代理WS-Security头部配置（单击图像查看大图）</p>
    <p>　　保留该代理的默认Echo管道，以便允许该服务回送直接复制自请求的响应。图12显示了代理服务示例的设置详情：</p>
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/createproxysecond.png" target=_blank><img height=354 alt=代理设置详情 src="http://dev2dev.bea.com.cn/images/image060605004_0000.gif" width=449 vspace=4 border=0></a><br>图12. 代理设置详情（单击图像查看大图）</p>
    <p>　　注意：对于这个特定的代理，实际上不需要定义代理服务提供者，因为服务器不需要对其发送回客户端应用程序的响应消息进行签名或加密（如WS-Policy文件所声明的）。要确认签名的Web服务请求是可信的，ALSB只能参考先前的步骤中所配置的WebLogic Server的trust keystore。</p>
    <li>从一个浏览器输入新的ALSB代理服务的WSDL文件的URL（例如http://localhost:7001/EchoProxyService?WSDL），确保WSDL文件包括WS-Policy设置，以向客户端应用程序指明SOAP请求必须被签名。 </li>
</ol>
<h3>创建示例客户端应用程序</h3>
<p>　　现在既然创建了ALSB代理Web服务，就需要创建一个示例客户端应用程序，并运行它来测试该服务。对于本例，使用了WebLogic Server用于生成Web服务客户端的工具包。但是，任何兼容WS-I和WS-Security的Web服务工具包都可以使用。</p>
<ol>
    <li>创建一个Ant build文件（例如，build.xml），它基于远程Web服务的WSDL调用WebLogic Server的&#8220;clientgen&#8221; Ant任务来生成SOAP存根。例如，build文件中包括了下面的内容：
    <pre>&lt;taskdef name="clientgen"
    classpathref="CLASSPATH"
    classname="weblogic.wsee.tools.anttasks.ClientGenTask" /&gt;
    &lt;clientgen wsdl="http://localhost:7001/EchoProxyService?WSDL"
    destDir="src" packageName="test" classpathref="CLASSPATH"
    generateAsyncMethods="false"/&gt;
    </pre>
    <li>使用一个文本编辑器或IDE，创建一个带有main方法的简单Java类，它使用WebLogic Server的JAX-RPC实现来调用ALSB Echo代理Web服务，使用前面步骤中所生成的存根类。然后该文件将被编译。由于JAX-RPC标准还未覆盖WS-Security元素，一些用于创建客户端应用程序的API是特定于供应商的。下面是一个可以使用的示例测试客户端源代码：
    <pre>package test;
    import java.util.*;
    import java.security.cert.*;
    import javax.xml.rpc.*;
    import weblogic.security.SSL.*;
    import weblogic.xml.crypto.wss.*;
    import weblogic.xml.crypto.wss.provider.*;
    import weblogic.wsee.security.bst.*;
    import weblogic.wsee.security.unt.*;
    public class EchoServiceClient {
    public static void main(String[] args) {
    try {
    // Point to the private/public key-pair identity keystore
    // that will be used by the client for signing
    List<credentialprovider> credProviders =
    new ArrayList<credentialprovider>();
    CredentialProvider cp = new ClientBSTCredentialProvider(
    "/opt/bea/domains/base_domain/wsidentity.jks",
    "weblogic", "bob", "weblogic");
    credProviders.add(cp);
    // Get a handle on the Web service stub
    EchoService echoService = new EchoService_Impl(
    "http://localhost:7001/EchoProxyService?WSDL");
    Echo echoStub = echoService.getEcho();
    // Associate the key pair credentials with the Web
    // service stub
    Stub baseStub = (Stub)echoStub;
    baseStub._setProperty(
    WSSecurityContext.CREDENTIAL_PROVIDER_LIST,credProviders);
    baseStub._setProperty(
    WSSecurityContext.TRUST_MANAGER, new TrustManager() {
    public boolean certificateCallback(X509Certificate[] chain,
    int validateErr) {
    return true;
    } });
    // Call the Web service and display the result
    String result =
    echoStub.doEcho("Hello from the client application");
    System.out.println("Service result is: " + result);
    } catch (Exception e) {
    System.err.println("Unable to invoke service: " +
    e.getMessage());
    e.printStackTrace();
    }
    }
    }
    </pre>
    <li>从命令行运行test.EchoServiceClient Java应用程序以使用签名的消息调用ALSB Echo服务，并显示服务响应。如果成功的话，客户端应用程序会向控制台打印下面的消息： </li>
</ol>
<pre>Service result is: Hello from the client application</pre>
<p>　　注意，客户端应用程序需要在其类路径中包括WebLogic Server的webserviceclient.jar。</p>
<h3>已完成的工作</h3>
<p>　　到目前为止，我们已创建了所需的PKI密钥、证书、密钥库，已经使用这些PKI工件将WebLogic Server和ALSB配置为支持WS-Security：定义了一个WS-Security策略文件，随后它可以被应用于一个或多个服务；使用该安全性策略文件创建了一个代理Web服务。最后，为该代理服务创建并调用了一个测试Web服务客户端，它对发送到ALSB的SOAP请求进行签名，还包括了客户端的证书。</p>
<p>　　这些配置任务中的大部分只需对整个环境执行一次。要使用相同的安全性策略保护更多被代理的业务服务，每个附加的代理服务只需将其WSDL定义修改为引用现有的WS-Security策略文件。</p>
<h3>访问控制配置（可选）</h3>
<p>　　下面的步骤只有在需要向ALSB代理服务应用访问控制时才需要执行。我们将创建一个用于附加用户的密钥对(Alice)，帮助测试访问控制设置是否配置正确。在本例中，访问控制将被指定为许可Bob访问该服务而阻止Alice访问服务。ALSB Access Control设置将基于包含在由客户端应用程序所提供的证书中的识别名(distinguished name，DN)元素。</p>
<ol>
    <li>在域的根目录中的现有identity keystore中为附加的示例用户Alice创建一个新的私钥-公钥对：
    <pre>&gt; keytool -genkey
    -keyalg rsa -keystore wsidentity.jks -alias alice -keysize 1024
    -keypass weblogic -storepass weblogic -validity 3650
    What is your first and last name?
    [Unknown]:  alice
    What is the name of your organizational unit?
    [Unknown]:  IT
    What is the name of your organization?
    [Unknown]:  BEA
    What is the name of your City or Locality?
    [Unknown]:  LONDON
    What is the name of your State or Province?
    [Unknown]:  LONDON
    What is the two-letter country code for this unit?
    [Unknown]:  UK
    Is CN=alice, OU=IT, O=BEA, L=LONDON, ST=LONDON,
    C=UK correct?
    [no]: yes
    </pre>
    <li>导出该密钥对的自签名证书到一个base-64编码的文件alice.pem：
    <pre>&gt; keytool -export -alias alice -file alice.pem -keystore
    wsidentity.jks -storepass weblogic -rfc
    </pre>
    <li>导出Alice的自签名证书到一个现有的trust keystore：
    <pre>&gt; keytool -import -alias alice -file alice.pem -keystore
    trust.jks-storepass weblogic
    </pre>
    <li>使用WebLogic Admin Console，导航到域配置页面，选择WebService Security选项卡，然后选择__SERVICE_BUS_INBOUND_WEB_SERVICE_SECURITY_MBEAN__配置，然后选择Token Handler选项卡。从token handlers列表中，选择default_x509_handler项。在页面的底部，选择&#8220;UseX509ForIdentity&#8221;作为token handler属性，然后将其置改为true（参见图13的屏幕快照）。设置该属性将指示WebLogic Server的WS-Security实现尝试使用x509口令来识别客户端，使用由客户端应用程序所传递的口令。
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/x509identity.png" target=_blank><img height=219 alt=代理设置详情 src="http://dev2dev.bea.com.cn/images/image060605006_0000.gif" width=449 vspace=4 border=0></a><br>图13. 代理设置详情（单击图像查看大图）</p>
    <li>使用WebLogic Admin Console，导航到&#8220;myrealm&#8221;Security Realms页面，选择Providers | Authentication，然后选择DefaultIdentityAsserter项。选择该项的Provider Specific选项卡，并设置下述字段值：Default User Name Mapper Attribute Type = CN，Active Types = Authenticated User &amp; X.509，以及User Default User Name Mapper = true（参见图14中的屏幕快照）。这将指示WebLogic Server映射证书的识别名(distinguished name，DN)中客户端应用程序的公用名(common name，CN)到WebLogic Server的Security Realm（例如，&#8220;bob&#8221;、&#8220;alice&#8221;）中一个已知的用户名。
    <p align=center><a href="http://dev2dev.bea.com/images/2006/04/idmapper.png" target=_blank><img height=449 alt=代理设置详情 src="http://dev2dev.bea.com.cn/images/image060605008_0000.gif" width=369 vspace=4 border=0></a><br>图14. 代理设置详情（单击图像查看大图）</p>
    <li>重启WebLogic Server，支持加入新的安全性设置。重启之后，再次检查Admin Console中的Active Types设置以确保其包含值&#8220;X.509&#8221;（检查上述屏幕快照中所显示的页面）。
    <li>使用ALSB Admin Console，选择Security Configuration部分，创建两个新的用户，&#8220;bob&#8221;和&#8220;alice&#8221;。这些用户旨在与先前所创建的密钥对的CN相符合。
    <li>使用ALSB Admin Console，选择Security Configuration部分，然后选择Access Control。对于代理服务(EchoProxyService)，对Transport Authorization Policy选择View Policies，并添加一个新条件&#8220;Allow access to everyone&#8221;，然后对Service Authorization Policy选择View Policies，并添加一个新条件&#8220;User bob&#8221;。该配置指定任何人都可以使用HTTP/HTTPS连接到代理服务URL（可用于支持WSDL，让任何人查看服务），但是只有用户&#8220;bob&#8221;（而不是&#8220;alice&#8221;）可以运行该Web服务的操作。
    <li>要测试访问控制是如何运行的，再次运行测试客户端。使用&#8220;bob&#8221;的证书应该可以成功调用服务，客户端应用程序应该会向控制台打印下述消息：
    <pre>Service result is: Hello from the client application</pre>
    <li>在测试客户端的源代码中，将密钥对的别名从&#8220;bob&#8221;改为&#8220;alice&#8221;，重新编译客户端，并再次运行。这时对ALSB代理服务的调用应该会产生一个SOAP故障，该故障被客户端应用程序接受，它说明了访问控制失败。应该会显示类似于下面的错误消息： </li>
</ol>
<pre>Unable to invoke service: SOAPFaultException FaultCode
http://schemas.xmlsoap.org/soap/envelope/}Server] FaultString
[BEA-386000: com.bea.wli.sb.security.AccessNotAllowedException:
access not allowed for subject Subject:
Principal = class weblogic.security.principal.WLSUserImpl("alice")
</pre>
<h3>结束语</h3>
<p>　　本教程展示了如何保护Web服务来强制客户端应用程序签名Web服务请求并提供受信证书。只需通过修改在服务的WSDL文件中指定的安全性策略，就可以轻松地修改服务的安全性，使其对Web服务请求也实施消息加密，对响应实施消息签名和加密。在企业服务总线中而不是在每个&#8220;后端&#8221;业务服务消息生产者中应用这类安全性，将带来以下好处：</p>
<ul>
    <li>可以以同样的方式保护所有的业务服务，即使某些用于创建和提供其中的一些Web服务的技术实际上不支持WS-Security（或者甚至是更基本的安全性机制或协议）。
    <li>可以使用各种安全性策略和协议（例如，使用HTTP、HTTPS/SSL、WS-Security进行基本的身份验证）公开同一个业务服务，以支持多种不同类型的客户端。此类客户端应用程序可能只具有处理一种类型的安全性协议的技术。此外，还可能会出现这种需求：对于同一组业务服务，要对不同类型的消息消费者应用不同的安全性策略（例如，同一局域网中相交互的另一部门，或者公司中通过Internet、B2B和电子商务交互的远程部分）。对于单一的业务服务，可以通过为每个策略定义不同的ALSB服务代理来定义多个安全性策略，以支持不同的客户端应用程序，并将所有的代理服务转到同一个&#8220;后端&#8221;业务服务。
    <li>与基于传输的安全性不同，WS-Security支持一个消息调度程序，它通过探查某些或全部未加密的SOAP消息头部，从而无需解密整个消息就可以做出Web服务路由决策。 </li>
</ul>
<p>　　服务总线为机构提供了一种集中式地声明和实施其服务安全性策略的强大方式，而无需要求单个开发人员以一种一致的方式在所有已开发的Web服务和子系统中硬编码安全性策略逻辑。</p>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/113359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-04-24 23:08 <a href="http://www.blogjava.net/chenleiyu/archive/2007/04/24/113359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)程序员的希波克拉底誓言 </title><link>http://www.blogjava.net/chenleiyu/archive/2007/02/15/99985.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Thu, 15 Feb 2007 12:07:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/02/15/99985.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/99985.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2007/02/15/99985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/99985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/99985.html</trackback:ping><description><![CDATA[
		<font size="4">
				<span style="FONT-STYLE: italic">作为一个程序员，我为自己的工作和技术能够养活自己，并为他人提供帮助而感到自豪。为了让程序员这个职业获得应有的尊重和荣誉，我发誓做到一下几点：</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">1，    我会让自己创造的软件对别人的生活有帮助，不会在软件中提供威胁他人计算机及个人信息安全的功能；</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">2，    我会在自己能力范围内为用户提供帮助，与他们交流想法，满足他们的要求，不会将责任推卸给对计算机知识陌生的用户；</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">3，    我会在开发工作结束时，将源代码、文档交予同事，不会让项目因我的离开而无法继续；即使遭到不公正待遇，我也不会出卖原有公司和其所服务用户的源代码、技术资料、文档，以及其他形式秘密；</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">4，    我不会将可能威胁他人计算机及个人信息安全的代码交予他人，不在技术社区和其他场合讨论相关技术；</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">5，    我会为我开发的软件终身负责，当他们处于运行中时，我将尽力维护；当他们失去商业价值后，我愿意将其中技术共享给他人；</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">6，    我不会因为商业利益和其他目的破解他人软件、入侵他人网站，如果只是为了技术研究的目的，我会在破解之后将漏洞通知其所有者，并且无条件帮助起所有者修复该漏洞。</span>
				<br style="FONT-STYLE: italic" />
				<span style="FONT-STYLE: italic">以一个普通程序员的荣誉，谨立此誓。</span>
		</font>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/99985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-02-15 20:07 <a href="http://www.blogjava.net/chenleiyu/archive/2007/02/15/99985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>买面茶</title><link>http://www.blogjava.net/chenleiyu/archive/2007/01/06/92136.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 05 Jan 2007 16:49:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/01/06/92136.html</guid><description><![CDATA[
		<object height="372" width="450">
				<param name="wmode" value="transparent" />
				<param name="movie" value="http://player.yoqoo.com/player.php?sid=4341/" />
				<embed src="http://player.yoqoo.com/player.php?sid=4341" wmode="transparent" type="application/x-shockwave-flash" width="450" height="372">
				</embed>
		</object>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/92136.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-01-06 00:49 <a href="http://www.blogjava.net/chenleiyu/archive/2007/01/06/92136.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.02OE-B安装教程</title><link>http://www.blogjava.net/chenleiyu/archive/2007/01/02/91434.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 02 Jan 2007 10:09:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/01/02/91434.html</guid><description><![CDATA[
		<a href="http://www.cngba.com/attachment.php?aid=775771" target="_blank">
				<font color="blue">
						<strong>3.02OE-B原版下载</strong>
				</font>
		</a>
		<br />
		<br />
		<strong>3.02OE-B安装教程：<br />解压附件，可以得到OEB_UPDATE 和 popstation 2个文件夹 及psx_readme.txt Readme.txt及2个txt文件，需要用到的是2个文件夹<br /><br />此次你原来的3.02OE-A系统使用的是什么版本核心模式(150 or 320 kernel)，请把 OEB_UPDATE这个文件夹放置在PSP/GAME150下<font color="red">(如无GAME150的请自行建立，同时请确保在ms0:\PSP\下有GAME和GAME150文件夹)</font><br /><br />文件夹放置完毕，请在XMB的game下运行<img height="40" alt="" src="http://www.cngba.com/attachments/month_0612/302m_diVr3bikjwst.jpg" width="72" border="0" />3.02 OE-B Update<br />升级只需短短几秒即可完成，哈，再次迎来崭新的3.02 OE-B世界。<br />----------------------------------------------------------------------------------------------------------------------------------------------------------------<br />3.02OE-B更新内容<br />增加了在PS模拟器游戏中使用自定义插件的功能。<br />方法：<br />请在记忆棒根目录建立<font color="red">seplugins</font>文件夹，同时在此文件夹中建立一个<font color="red">pops.txt</font>的文本文件。<br />然后在放置seplugins中放入你所需要的自定义插件*.prx（*号为此插件文件的文件名），同时在pops.txt中<br /><br />编辑ms0:/seplugins/*.prx即可安装完成<br />如要使用的话，请关机后按R键开机，在菜单中选择seplugins进入，然后把你所需要开启的插件开启enable即可。<br />-----------------------------------------------------------------------------------------------------------------------------------------------------------------<br />PS ISO 转换成官方pbp文件教程<br /><br />首先有一个说明，欧版的PS游戏，由于是PAL制式（电视显示格式）由于其特殊的算法过于复杂，因此可能出现的视频不兼容问题（即对PS iso的转换）的可能性比较大。而日版和美版的游戏，由于其电视显示的制式是ntsc，那么转换起来就要方便的多。因此推荐，如要转换PS iso为PSP可用的pbp文件，请优先使用日版和美版的游戏。<br /><br />转换教程：<br />1、请先准备一个官方发布PSP可模拟的PS游戏，推荐（Dark_Alex推荐 大众高尔夫2 那就毋庸置疑咯）且必须包含Key（DOCUMENT.DAT和KEYS.BIN）文件。<br /></strong>
		<p align="center">
				<font color="green">
						<strong>【大众高尔夫2】</strong>
				</font>
		</p>
		<p align="center">
				<a href="http://www.cngba.com/viewthread.php?tid=16495402" target="_blank">
						<b>
								<font color="blue">BT下載</font>
						</b>
				</a>
		</p>
		<p align="center">
				<a href="http://www.cngba.com/viewthread.php?tid=16497658" target="_blank">
						<b>
								<font color="blue">FTP下載</font>
						</b>
				</a>
		</p>
		<br />
		<br />
		<a href="http://www.cngba.com/viewthread.php?tid=16184105&amp;page=1#pid7637001" target="_blank">
				<font color="red">
						<b>
								<p align="center">其他PS游戏下载索引</p>
						</b>
				</font>
		</a>
		<br />
		<br />
		<strong>2、请准备你想转换的PS游戏的ISO文件（推荐使用美版或者日版的游戏）<br /><br />3、请把这个PS游戏（大众高尔夫2）EBOOT.PBP命名为base.PBP<br /><br />4、请把先前解压附件得到的popstation放至在你计算机的D盘根目录（由于此转换程序，涉及命令行操作因此建议放在你电脑磁盘的根目录方便操作。此教程是以D盘为例）<br /><br />5、请下载附件cygwin1.rar并解压得到cygwin1.dll，然后把这个cygwin1.dll放置入popstation文件夹中<br /></strong>
		<a href="http://www.cngba.com/attachment.php?aid=775772" target="_blank">
				<font color="blue">
						<p align="center">cygwin1.rar下载在此</p>
				</font>
		</a>
		<br />
		<br />6、把先前已经重命名的大众高尔夫2 base.PBP文件，你要转换的PSP游戏的ISO文件也同样一起放置入popstation文件夹中<br /><br />7、请确认在你电脑D:\下有如下5个文件 popstation.exe base.PBP cygwin1.dll XX.ISO(即为你需要转换的PS ISO的文件名 XX可以为任意） readme.txt<br /><font color="red">(在此插入一个转换的简易程序，使用后可以直接看教程第10步)</font><br /><br /><a href="http://www.cngba.com/thread-16503975-1-1.html" target="_blank"><font color="blue">===PS遊戲轉換器 V3(修正閃一下問題)===圖形化操作介面,轉換更 EASY!!</font></a><br /><br />8、点击计算机左下方开始-运行-输入CMD命令，命令如下:<br />请先输入cd\+回车<br />这时系统会显示C:\_<br />请再输入C:\D:<br />这时系统会跳转到D:\_<br />然后输入D:\popstation&gt;popstation XX.iso+回车<br /><br />9、随后请耐心等待，此时计算机会显示：done时，即表示转换完成。请查看你的D:\popstation\下应该已经有6个文件，多出一个eboot.PBP(即为已经转换完毕的PS ISO的PSP可模拟文件）<br /><br />10、请在你的记忆棒ms0:\PSP\GAME\下建立XX文件夹（XX即为你已经转换完毕的PS游戏名），然后请把转换好的eboot.PBP和先前大众高尔夫2的KEY（KEYS.BIN）文件一同放入这个XX文件夹中。<br /><br />11、还等什么，请立即在XMB的GAME下选取你的PS游戏，华丽的开始吧。。。<br />-------------------------------------------------------------------------------------------------------------------------------------------------------------<br /><br /><div class="msgheader">QUOTE:</div><div class="msgborder"><font color="#b0000">来自官方的Q&amp;A<br />1.Q:我的游戏（PS游戏）转换后与原来官方发布的PSP可用PS游戏要大很多？而且还无法运行是怎么回事？<br />  A:首先你提供的PS游戏一种经过压缩的ISO。此ISO文件由于使用了压缩算法上与标准的ISO 存在差异，而这个转换程序即popstation.exe还不支持，所以造成此现象。<br /><br />2.Q:我手头的PS游戏镜像文件是bin+cue形式，而非iso文件，该怎么办？<br />  A:此转换程序popstation.exe支持bin格式的PS游戏镜像文件，请直接把后缀名bin改成iso即可。<br /><br />3.Q:我手头的PS游戏镜像文件是img+ccd形式，而非iso文件，该怎么办？<br />  A:此转换程序popstation.exe支持img格式的PS游戏镜像文件，请直接把后缀名img改成iso即可。<br /><br />4.Q:为什么我发现我在记忆棒中的PS游戏（非大众高尔夫2游戏）的图标竟然是大众高尔夫2？？？<br />  A:这是正常现象（使用了大众高尔夫2游戏的base.PBP所致），请放心使用。</font><br /><font color="red">(如你想使用自己想要的图标，请在PS iso转换前，准备ICON0.PNG[144*80，24位色]，PIC0.PNG[310*180,256色],PIC1.PNG[480*272,24位色]这3个图标背景文件，并一同放入popstation文件夹中，这样转换出的PS游戏就会显示你想要的图标和背景了)</font></div><br /><br /><br /><div class="msgheader">QUOTE:</div><div class="msgborder"><b>附录教程：<br /><font color="brown">1、欧版的PS游戏镜像即PAL制式的转换成NTSC制式的相关办法。</font><br /><br />请先下载附件 <a href="http://www.cngba.com/attachment.php?aid=776125" target="_blank"><font color="blue">点击下载</font></a><br />解压后得到pal4u2K.exe和p4upatch.exe2个文件<br />然后准备好你的ISO，强烈建议备份一下此ISO(因为pal4u2k会在光盘中抽取出一些文件，恢复不能)<br />点击pal4u2K.exe<br />出现如下图<br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.megagames.com/psx/idiots_guide_n2p/p4u2_s.gif');}" alt="" src="http://www.megagames.com/psx/idiots_guide_n2p/p4u2_s.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br />请先点击一下上面绿色的2个圆箭头选择PAL→NTSC<br /><br />然后按下Choose a file，选择你想转换的欧版PS游戏ISO(注意备份)<br /><br />点击Find SEQs<br />随后点击跳出的对话框确定后，出现如下画面<br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.megagames.com/psx/idiots_guide_n2p/ecc3_s.gif');}" alt="" src="http://www.megagames.com/psx/idiots_guide_n2p/ecc3_s.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br />点击Create P4U file<br />这时会生成一个与你ISO文件名同名的p4u file文件，关闭pal4u2K<br /><br />随后，打开p4upatch.exe，出现如下画面：<br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.megagames.com/psx/idiots_guide_n2p/p4up2_s.gif');}" alt="" src="http://www.megagames.com/psx/idiots_guide_n2p/p4up2_s.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br />点击Choose P4U file并且选择你先前生成的p4u文件 <br />点击Choose BIN/EXE并且选择你的ISO文件<br /><br />点击右下角GO FOR PATCH<br /><br />当出现如下画面，表示转换成功。这下你可以进一步参照上面的教程转换你的ISO了<br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.megagames.com/psx/idiots_guide_n2p/p4up3_s.gif');}" alt="" src="http://www.megagames.com/psx/idiots_guide_n2p/p4up3_s.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br /><br /><font color="brown">2、关于各别是bin文件的PS镜像仍然转换失败的解决办法。</font><br />请使用UltraISO Premium 8.0转换成ISO，即可顺利转换 <br /><br /><a href="http://www.cngba.com/attachment.php?aid=776054" target="_blank"><font color="blue">点击下载UltraISO 8.0中文版</font><br /><br /></a><br /><img onmousewheel="return imgzoom(this);" onmouseover="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.style.cursor='hand'; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" onclick="if(!this.resized) {return true;} else {window.open('http://www.megagames.com/psx/idiots_guide_n2p/bin.gif');}" alt="" src="http://www.megagames.com/psx/idiots_guide_n2p/bin.gif" onload="if(this.width&gt;screen.width*0.7) {this.resized=true; this.width=screen.width*0.7; this.alt='Click here to open new window\nCTRL+Mouse wheel to zoom in/out';}" border="0" /><br /><br />下载附件，并安装。运行UltraISO.点击菜单栏中工具<br />[attach]776252[/attach]<br />选择 格式转换... 在跳出的窗口框中选择你要转换的bin文件<br />[attach]776253[/attach]<br />设置好，转换好ISO的路径，文件名<br />在输出格式中选择 标准 ISO(*.ISO)，最后点击转换即可。<br /></b></div><br /><br /><br /><div class="msgheader">QUOTE:</div><div class="msgborder"><b>引自论坛tym331 的关于PSP模拟PS游戏的心得<br /><br />1、个人认为PS模拟器最好是调用金手指将运行CPU速度降低一些，可以节省电能！<br />我觉得部分游戏222可以运行，像沉默爆破手这样的3D作品最好是266差不多了，生化危机我是在222下运行流畅的！<br /><br />2、其次因为是高尔夫转来的，存档名称好像都是固定的，<br />我在想如果是两款高尔夫原文件转过来的不同游戏的话，存档可能冲突！<br /><br />3、玩PS模拟器，别把画面调节最大，个人认为2D模拟器画面两倍大已经不错了，<br />3D画面的两倍大就不好看了最好是原始的大小~<br /><br />4、对PS模拟器运行的按键操作不舒服的，可以将摇杆替代为十字键（对于足球游戏什么的最好）<br />设定方法是：按HOME 在按键方案选择第4种~！</b></div><img src ="http://www.blogjava.net/chenleiyu/aggbug/91434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-01-02 18:09 <a href="http://www.blogjava.net/chenleiyu/archive/2007/01/02/91434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3.02OE-A的中文readme</title><link>http://www.blogjava.net/chenleiyu/archive/2007/01/02/91433.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 02 Jan 2007 10:08:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2007/01/02/91433.html</guid><description><![CDATA[
		<strong>
				<font color="#ff0000">想要使用此软件，请先确认你的PSP系统版本为1.5或者是2.71SE系列（T082只要系统版本符合也可以刷）<br /><br /></font>安装方法与原先2.71SE类似<br />解压附件，可以得到 302oeflasher 302oeflasher％及oeupdmaker oeupdmaker% 和flasher for recovery<br /><br />目前需要用到的是302oeflasher 302oeflasher％及oeupdmaker oeupdmaker%这四个文件夹<br /><br />如果你是2.71SE系统使用的是1.5核心模式启动请把oeupdmaker 和 oeupdmaker% （其实这是一个1.5的自制程序）这2个文件夹放置在PSP/GAME文件夹下<br /><font color="blue">（如果你的PSP系统版本为1.5，即原生1.5，也请按照这样方式的放置文件夹）</font><br /><br />如果你是2.71SE系统使用的是2.71核心模式，请把oeupdmaker 和 oeupdmaker% （其实这是一个1.5的自制程序）这2个文件夹放置在PSP/GAME150下<br /><br />同时准备好1.5和3.02的官方升级文件，并把文件名分别命名为“150.PBP和302.PBP”后，放置入oeupdmaker文件夹中<br /><br />放完文件后，在XMB的Game下运行，<img height="40" alt="" src="http://www.cngba.com/attachments/month_0612/302m_diVr3bikjwst.jpg" width="72" border="0" />3.02 OE-A Update Maker<br />这个程序不会写固件，它会在oeupdmaker文件夹中产生一个DATA.DXAR文件<br />DATA.DXAR文件校验码，<font color="red">（请确保文件的正确）</font><br />SHA1 of DXAR: BB43B06852826F446CCA933927C3D54C50E151B1<br />MD5 of DXAR: 5BD5DE55204BB8A407C0187C3DA1040C<br /><br />接下来，进行刷机操作<br />复制302oeflasher 302oeflasher％文件夹至记忆棒的PSP/GAME（或GAME150，原因看前述）文件夹中，<font color="red">并把先前得到那个DATA.DXAR文件放置在302oeflasher文件夹中</font><br />在XMB的GAME下运行<img height="40" alt="" src="http://www.cngba.com/attachments/month_0612/3.02ins_olTgQEhiOWCR.jpg" width="72" border="0" />3.02 OE-A Firmware Install<br />如果你的psp电量低于75％，程序将会自动退出（之前会看到有红色75％字样，这个并不是刷机进度，只是电量不足的提示罢了）<br /><br />如果你的电量足够，那么程序将会显示出一个免责协议。同时要你按X键接受，按下X后就开始刷机。<font color="red">（注意，此时严禁关闭电源拔出记忆棒以及剧烈晃动PSP！！)</font><br /><br />此时屏幕会出现一些跳动的数字，并在显示百分比。<br /><br />请耐心等待，等屏幕出现<font color="red">DONE RESTART THE PSP MANUALLY后，请手动关闭PSP电源</font><br /><br />再次手动启动你的PSP<font color="blue">（可能有的机器会出现那个经典蓝屏，正常现象，请按O确认，一般会自动再次重启，也可能需要再次手动重启，都是正常现象，勿怕^_^）</font><br /><br />。。。成功，你将迎来全新的3.02OE时代。。。<br /><br />----------------------------------------------------------------------------------------------------------------------------------------------------<br />3.02OE使用手册<br /><br />这次同样提供了R键开机的恢复模式<br /><br />同时，在恢复模式的configured中也同样加入了可以让玩家自己选择1.50/3.02核心模式启动的功能<br /><br />3.02这次可以运行3.02的自制程序（ir shell for 3.02版？猜测），请把3.02的自制程序放入/PSP/GAME302/下（非设置3.02核心模式，如选择的是相应的3.02核心模式，请直接放入PSP/GAME/即可）<br /><br />3.02OE可以运行99%的1.5自制程序，兼容性与目前2.71SEC一致（那么运行pmpavcmod当然没有问题），同样请把1.5的自制程序放置在PSP/GAME150/下（非设置1.50核心模式，如选择的是相应的1.50核心模式，请直接放入PSP/GAME/即可）<br /><br />同样，模拟UMD游戏的模式与2.71SE形式相同（就是可以直接玩ISO罗），玩家可以直接在XMB的游戏下选取<br />遗憾的是，这次仍然只有支持ISO和CSO的类型，还是没有加入DAX和JSO的游戏镜像类型<br /><br />另外，如果在开机状态下，如果直接在ISO文件夹中拷入或者删除ISO镜像文件对目录做出更改的话，那么在3.02OE系统XMB下再次进GAME菜单时，将会有一个小小的延迟（其实是忽略不计的）<br /><br /><br />关于recovery菜单的设置（即在PSP关机状态下按着R键再开机）<font color="blue">新功能来罗，请看蓝字的设置说明</font><br />进入设置菜单你会看到<br /><br />-Toggle USB 允许在未进入或者进不去XMB的情况下，直接使用USB模式在记忆棒中添加，删除，和改动文件<br /><br />-Configuration（详细设置菜单）<br />所有设置默认都为关闭（即Disable）            <br /><br />* Skip SCE logo. 打开此项enable时可以一定程度加快启动速度，当然你将不能看到启动画面，同时也使PSP在放入UMD的情况下，UMD不会自动启动（3.02不是本身就带有关闭UMD开机自动启动的功能么？）<br /><br />* Hide corrupt icons 自动隐藏破损文件，如果你对放入GAME下的文件夹为做过任何隐破损处理（这里其实针对1.5的自制软件）即name和name%形式的文件夹，它会在XMB的GAME下自动隐藏破损，但是在XMB GAME下显示出图标的时候将会有一定时间的延迟。<br />                  <br />* Game folder homebrew 这个选项，就是让你选择你用什么核心模式启动1.5或3.02，同样更改这个选项将会影响到PSP/GAME/下自制程序的是否运行（默认的是以3.02核心模式启动PSP）原因也可以参看上述安装时的文件夹的摆放<br /><br />* Autorun program at /PSP/GAME/BOOT/EBOOT.PBP 这个设置允许你自定义开机会自动运行的程序（比如devhook等），但是，必须你在上面那个设定中，设置1.5为核心模式启动。<br /><br /></strong>
		<strong>
				<font color="blue">* Fake region 允许设置你的PSP机器版本，可以选择日版，美版，欧版还有韩版<br /><br />* Free UMD Region. 可以把你的UMD Video设定为全区模式（去掉UMD的区域限制，可以尝试下demo盘中的视频能否观看了）</font>
				<br />
				<br />- Loading plugins from the ms（自定义插件的使用，这个是免刷机的）<br /><br />在记忆棒根目录中建立seplugins文件夹 即ms0:/seplugins，同时设置2个文本文件，命名为game.txt和vsh.txt。这2个文件可以给于你要使用的插件放在记忆棒中位置的路径进行定义。同样，目前这个2个路径定义文件还是最多只支持5个自定义插件。<br />关于这2个文本文件中的内容可以按如下方式输入（同时，把你想要用的插件文件 *.prx放入seplugins文件夹中）<br />ms0:/seplugins/mymusicplugin.prx<br />ms0:/seplugins/mycheatplugin.prx<br />game.txt和vsh.txt创建之后，你就可以在recovery menu里面选择打开/关闭每个插件<br />另外，如果你自定义插件开启的数量太多，或者插件比较大的情况下，由于内存不足，反而会造成ISO游戏，或者自制程序无法启动的现象。只需关闭，即可解决。<br /><br /><font color="red">另外这版仍然未加入USB模式引导游戏方式，不过Dark_Alex说，已经考虑在改进版中推出，请期待。</font><br /><br />-Advanced.进阶设置菜单，不建议普通玩家使用（以下涉及刷机的叙述就不翻了）<br /><br />*Advanced configuration高级设定<br /><br />**Plain modules in UMD/ISO 通过读取UMD或者ISO中模块来引导游戏（中文版的中原霸者运行就需要这个选项打开），默认为关闭，因为大多数游戏可以直接引导，当引导ISO不成功出现error 0x8002012D，可以尝试打开。<br />**Execute boot.bin in UMD/ISO 同样是通过读取并执行UMD或者ISO中的boot.bin文件来引导游戏。另外这个选项如要开启，请先开启上面那个选项<br /><br />-Run program at /PSP/GAME/RECOVERY/EBOOT.PBP.<font color="red">（此为此3.02OE系统最重要的恢复选项，可以用它来回到1.50系）</font>。请把先前解压附件中得到那个 flasher for recovery文件夹中RCCOVERY文件夹放入PSP/GAME/下，<font color="red">（注意：无论你设置是何种核心模式启动，这个RECOVERY文件夹都是这样放的，切记！），同时，把你的1.5官方升级程序eboot.pbp改名为UPDATE.PBP后放入RECOVERY文件夹，这样1.5恢复包制作完毕</font><br /><br /></strong>
		<strong>
				<font color="blue">- Registry hacks  3.02OE附加功能选项！<br /><br />*Button assign 确定键位设定，允许你自由切换美版(X为确定)或者日版(O键为确定)键位模式<br />*Activate WMA.   WMA激活设定，无需多说，你可以不必通过wifi方式来激活啦<br />*Activate Flash Player. .Flash激活设定，无需多说，你可以不必通过wifi方式来激活啦</font>
				<br />
				<br />关于CPU频率的设定<br />仍然没有在SE系统中加入（3.02OE？），因为在使用中发现有多多少少的兼容性问题存在。或许在将来的3.02OE改进版中推出。当然你可以选择使用自定义固件的方式来加入这个CPU频率调节固件。(遗憾)<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />关于devhook的使用<br />使用方法与原先一样（请先确认你的devhook的对应固件使用版本for 1.5的还是for2.71的，关于文件夹的放置请参看前面）<br /><br /></strong>
		<strong>
				<font color="red">但有一点必须注意：就是在进入devhook后的设置菜单中，关于固件选择，请勿选择1.5(flash）或者271(flash)<br />另外也请勿使用dh0.46，dh0.51的刷机功能！</font>
				<br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br /><br />关于1.5的兼容性<br />大多数99％的1.5自制程序完全兼容（自制软件ereader等，模拟器，小游戏等完全兼容）<br /><br />但有些各别自制程序，诸如 umd emulator 和daxziso（um8c 和Daxiso）等有能自动回到XMB的类似的引导程序可能会有兼容性问题（DA本人还未作测试）。<br />解决方法，使用这类软件可以采用direct load的类似的实模式来启动(请仍然等待进一步的测试)。<br /><br /></strong>
		<strong>
				<font color="red">同样，诸如xflash（可以自定义桌面功能）, pspset（可以刷壁纸启动程序等）, sxt version changer（版本欺骗程序）等刷机自制程序仍然强烈不建议使用。<br />另外Filer1.9 ，Filer1.9＋， Filer v2.0 ，FileAssistant0.04，Ereader1.59等涉及可以访问固件的程序仍然建议谨慎使用</font>
				<br />
				<br />另外（来点专业的^_^）<br />3.02OE对所具有的1.5核心也进行了改进，可以支持一些原先1.5系统无法支持的东西，比如载入loadexecuting  prx's，载入模块，支持1.0程序的直接读取等。<br /><br />关于wifi，由于1.5核心并不支持WPA的无线AP（无线路由）加密方式，所以当你的无线AP（无线路由）使用的是WPA的加密方式时，有些1.5的会使用到wifi的自制程序将无法连入网络，因此，请仍然使用WEB方式加密，或者不要加密你的无线网络。<br /><br />－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />3.02OE与2.71SE的特性比较：<br />※免UMD模式的兼容性似乎有些下降（还等待进一步测试）<br />※3.02的自制程序elf's模式（类似HenD的引导自制程序的运行方式）仍然未被支持，这个应该不是问题（大多数自制程序都是先有1.5版，再有for 2.71或者2.80版的），如遇到无法运行，请尝试用1.50核心模式下启动试试。<br />※由于2.80系统对与破解的限制，能调用3.02核心模式的自制程序还没有出现，当然也无法使用。<br />※由于3.02的内核模式的prx无法再使用系统user mode 的syscall，所以象 psplink for 2.71 和 irshell for 2.71这类程序在3.02核心启动下无法使用，同时期待原作者能够更新</strong>
		<a href="http://www.cngba.com/viewthread.php?tid=16206500&amp;highlight=" target="_blank">
				<font color="green">
						<strong>（ir shell3.1发布点击查看详情）</strong>
				</font>
		</a>
		<br />
		<strong>※由于Flash0空间的不足，所以韩文字体与loacation free player（这个功能没有，多少觉得有些遗憾）无法使用。<br /><br />目前已知的问题：<br />-这版的3.02OE仍然无法运行官方升级文件 ，如果强行运行会出现(DADADA）的错误代码，当然，我们也不建议你们这么做。<font color="red">（切勿运行就是了)</font><br /><br />-同样，这版也仍然没有提供中文和韩文系统菜单（当然也是因为1.5核心的问题，遗憾～)如果你要强行设定，将会得到一个98765432的错误代码（怎么不是7456气死我了？^_^）<br /><br />-同样，<font color="red">你的记忆棒中PSP/目录下，需要一个GAME文件夹不管你是否会放入文件，此文件夹GAME必须存在。如果没有，那么在XMB下，GAME下将会显示“There is no games”信息。</font></strong>
		<br />
<img src ="http://www.blogjava.net/chenleiyu/aggbug/91433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2007-01-02 18:08 <a href="http://www.blogjava.net/chenleiyu/archive/2007/01/02/91433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无题</title><link>http://www.blogjava.net/chenleiyu/archive/2006/12/30/91056.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Sat, 30 Dec 2006 12:26:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/12/30/91056.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/91056.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/12/30/91056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/91056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/91056.html</trackback:ping><description><![CDATA[终于在今年的最后一天 2号线的延长线开通了 .........<br /><img src ="http://www.blogjava.net/chenleiyu/aggbug/91056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-12-30 20:26 <a href="http://www.blogjava.net/chenleiyu/archive/2006/12/30/91056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不知不觉</title><link>http://www.blogjava.net/chenleiyu/archive/2006/12/10/86732.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Sun, 10 Dec 2006 10:47:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/12/10/86732.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/86732.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/12/10/86732.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/86732.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/86732.html</trackback:ping><description><![CDATA[
		<object height="395" width="480">
				<param name="allowScriptAccess" value="sameDomain" />
				<param name="movie" value="http://tv.mofile.com/cn/xplayer.swf" />
				<param name="FlashVars" value="v=MXNW33G9&amp;p=http://cache.mofile.com/tv/static/picture/u7/Disk1/cnc/2006/8/10/MX/NW/MXNW33G9.jpg&amp;autoplay=0" />
				<param name="wmode" value="transparent" />
				<embed src="http://tv.mofile.com/cn/xplayer.swf" flashvars="v=MXNW33G9&amp;p=http://cache.mofile.com/tv/static/picture/u7/Disk1/cnc/2006/8/10/MX/NW/MXNW33G9.jpg&amp;autoplay=0" allowscriptaccess="sameDomain" wmode="transparent" type="application/x-shockwave-flash" height="395" width="480">
				</embed>
		</object>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/86732.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-12-10 18:47 <a href="http://www.blogjava.net/chenleiyu/archive/2006/12/10/86732.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>LDAP 查询基本知识</title><link>http://www.blogjava.net/chenleiyu/archive/2006/11/19/82016.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Sun, 19 Nov 2006 03:58:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/11/19/82016.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/82016.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/11/19/82016.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/82016.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/82016.html</trackback:ping><description><![CDATA[
		<div id="BasicLDAPSyntax">
				<a name="E3B">
				</a>
				<h2>基本 LDAP 语法</h2>
				<table cellspacing="0" cellpadding="0" border="0">
						<tbody>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>
														<b>=（等于）</b>
												</p>
												<p>此 LDAP 参数表明某个属性等于某个值的条件得到满足。例如，如果希望查找“名“属性为“John”的所有对象，可以使用：</p>
												<p>
														<span class="codeSample">(givenName=John)</span>
												</p>
												<p>这会返回“名”属性为“John”的所有对象。圆括号是必需的，以便强调 LDAP 语句的开始和结束。</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>
														<b>&amp;（逻辑与）</b>
												</p>
												<p>如果具有多个条件并且希望全部条件都得到满足，则可使用此语法。例如，如果希望查找居住在 Dallas 并且“名”为“John”的所有人员，可以使用：</p>
												<p>
														<span class="codeSample">(&amp;(givenName=John)(l=Dallas))</span>
												</p>
												<p>请注意，每个参数都被属于其自己的圆括号括起来。整个 LDAP 语句必须包括在一对主圆括号中。操作符 &amp; 表明，只有每个参数都为真，才会将此筛选条件应用到要查询的对象。</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>
														<b>!（逻辑非）</b>
												</p>
												<p>此操作符用来排除具有特定属性的对象。假定您需要查找“名”为“John”的对象以外的所有对象。则应使用如下语句：</p>
												<p>
														<span class="codeSample">(!givenName=John)</span>
												</p>
												<p>此语句将查找“名”不为“John”的所有对象。请注意：<span class="codeSample">!</span> 操作符紧邻参数的前面，并且位于参数的圆括号内。由于本语句只有一个参数，因此使用圆括号将其括起以示说明。</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>
														<b>*（通配符）</b>
												</p>
												<p>可使用通配符表示值可以等于任何值。使用它的情况可能是：您希望查找具有职务头衔的所有对象。为此，可以使用：</p>
												<p>
														<span class="codeSample">(title=*)</span>
												</p>
												<p>这会返回“title”属性包含内容的所有对象。另一个例子是：您知道某个对象的“名”属性的开头两个字母是“Jo”。那么，可以使用如下语法进行查找：</p>
												<p>
														<span class="codeSample">(givenName=Jo*)</span>
												</p>
												<p>这会返回“名”以“Jo”开头的所有对象。</p>
										</td>
								</tr>
								<tr>
										<td class="listBullet" valign="top">•</td>
										<td class="listItem">
												<p>以下是 LDAP 语法的高级使用示例：</p>
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td class="listBullet" valign="top">•</td>
																		<td class="listItem">
																				<p>您需要一个筛选条件，用来查找居住在 Dallas 或 Austin，并且名为“John”的所有对象。使用的语法应当是：</p>
																				<p>
																						<span class="codeSample">(&amp;(givenName=John)(|(l=Dallas)(l=Austin)))</span>
																				</p>
																		</td>
																</tr>
																<tr>
																		<td class="listBullet" valign="top">•</td>
																		<td class="listItem">
																				<p>您发现应用程序日志中有 9,548 个事件，因此需要查找导致这些日志事件的所有对象。在此情况下，您需要查找所有被禁用的用户 (<b>msExchUserAccountControl</b>=2)，这些用户的 <b>msExchMasterAccountSID</b> 没有值。使用的语法应当是：</p>
																				<p>
																						<span class="codeSample">(&amp;(msExchUserAccountControl=2)(!msExchMasterAccountSID=*))</span>
																				</p>
																		</td>
																</tr>
														</tbody>
												</table>
												<div class="alertType">
														<img height="10" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/note.gif" width="10" border="0" />  注意：</div>
												<p>! 操作符与通配符的结合使用可查找属性未设置为任何值的对象。</p>
										</td>
								</tr>
						</tbody>
				</table>
		</div>
		<div id="WhereCanWeUseLDAPQueries">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/technet/prodtechnol/exchange/2003/insider/ldapquery.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/technet/prodtechnol/exchange/2003/insider/ldapquery.mspx#top">返回页首</a>
				</div>
				<a name="E4D">
				</a>
				<h2>何时使用 LDAP 查询？</h2>
				<p>在使用 Exchange Server 时，您遇到了使用 LDAP 字符串的情况。例如，当您设置收件人或邮箱管理策略或地址列表过滤器时，或者，当您搜索 Active Directory 目录服务时，Exchange Server 都会使用 LDAP。在下面的部分中，我们将介绍一些 LDAP 语句的使用方式。</p>
				<div id="DoingASearchUsingADUC">
						<h3>使用“Active Directory 用户和计算机”进行搜索</h3>
						<p>下例描述了如何“Active Directory 用户和计算机”执行搜索：</p>
						<table class="numberedList" cellspacing="0" cellpadding="0" border="0">
								<tbody>
										<tr valign="top">
												<td class="listNumber" nowrap="" align="right">
														<p>1.</p>
												</td>
												<td>
														<p>打开“Active Directory用户和计算机”。</p>
												</td>
										</tr>
										<tr valign="top">
												<td class="listNumber" nowrap="" align="right">
														<p>2.</p>
												</td>
												<td>
														<p>右击域对象并选择<b>查找</b>。</p>
														<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/2f779541-ae57-4be9-a2d4-10378092e603.gif" border="0" />
												</td>
										</tr>
										<tr valign="top">
												<td class="listNumber" nowrap="" align="right">
														<p>3.</p>
												</td>
												<td>
														<p>单击<b>查找</b>旁边的下拉列表，然后选择<b>自定义搜索</b>。</p>
												</td>
										</tr>
										<tr valign="top">
												<td class="listNumber" nowrap="" align="right">
														<p>4.</p>
												</td>
												<td>
														<p>从下一屏幕中，选择<b>高级</b>选项卡。</p>
												</td>
										</tr>
										<tr valign="top">
												<td class="listNumber" nowrap="" align="right">
														<p>5.</p>
												</td>
												<td>
														<p>在<b>输入 LDAP 查询</b>下，输入相应的 LDAP 语句。</p>
														<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/42d946fc-6827-43ae-b85e-0bb8be4b051e.gif" border="0" />
												</td>
										</tr>
								</tbody>
						</table>
						<p>本示例尝试查找职务为 <i>prez</i> 或姓名以 <i>test</i> 开头的所有对象。如果您单击<b>立即查找</b>，应该能够看到相应的输出，如以下屏幕截图所示。</p>
						<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/9e9364e5-54b9-479e-92fd-40bbfb1502df.gif" border="0" />
				</div>
				<div id="DoingASearchUsingLDP">
						<h3>使用 LDP 进行搜索</h3>
						<p>您还可以使用 LDP 执行搜索，该工具已包括在 Microsoft Windows Server 2003 和 Windows 2000 Server 支持工具之中。该工具不仅为您赋予了搜索域容器的能力，而且允许您搜索<b>配置</b>容器。首先，您应打开 LDP 并连接到有效的域控制器。然后，您需要使用相应凭证进行绑定。请选择<b>视图</b>，然后选择<b>树视图</b>。保留<b>基位置 DN</b> 字段为空，然后单击<b>确定</b>。导航到要搜索的容器，右击该容器，然后选择<b>搜索</b>。</p>
						<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/e7c4bdd5-5c25-4cdd-9c56-989193446aba.gif" border="0" />
						<p>将出现一个对话框，其中的<b>基位置 DN</b> 字段包含了正确的值。输入进行筛选所依据的 LDAP 语句，将出现类似如下的内容。</p>
						<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/829e620d-dc18-4103-a6be-e1f64e5cbd9b.gif" border="0" />
						<p>如果希望搜索当前级别以下的所有容器，请确信选择了<b>子树</b>单选按钮。单击<b>运行</b>，然后开始查找所有匹配项。</p>
						<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/a29ac81e-4dd6-434e-9344-e8a92a56e927.gif" border="0" />
				</div>
				<div id="DoingASearchUsingLDIFE">
						<h3>使用 LDIFDE 执行搜索</h3>
						<p>您可能经常需要搜索一组满足特定条件的对象并且希望建立这些用户的列表。LDIFDE 是一个可以用来建立此列表的命令行工具。假定您希望查找并保存 mailNickName 以 Jeff 开头的所有用户的列表。那么，您可能会运行如下命令。</p>
						<p>
								<span class="codeSample">C:\&gt;ldifde -d "DC=witaylorroot,DC=com" -f c:\output.txt -r "(&amp;(objectClass=user)(mailNickName=jeff*))</span>
						</p>
						<p>在本例中，您将查找三个对象并将他们的所有属性导出到指定的 .txt 输出文件中。但是，如果您打算导出数千用户的查找结果，导出文件将过于庞大。为此，我们可以使用其他选项。您可以使用 <span class="codeSample">¨Cl</span>（小写的 L）开关指定导出哪些属性。可分辨名称将总是被导出，但是如果希望仅导出该名称，可以在字符串中添加 <span class="codeSample">¨Cl</span><span class="codeSample">nothing</span>，以简化输出结果。以下命令便是这样的一个例子。</p>
						<p>
								<span class="codeSample">C:\&gt;ldifde -d "DC=witaylorroot,DC=com" -f c:\output.txt -l nothing -r "(&amp;(objectClass=user)(mailNickName=jeff*))</span>
						</p>
						<p>请考虑这样一种情况，您希望使用先前引用的 LDIFDE 导出结果，但是只想在输出中包括 <b>homeMDB</b> 属性。为此，必须使用以下命令。</p>
						<p>
								<span class="codeSample">C:\&gt;ldifde -d "DC=witaylorroot,DC=com" -f c:\output.txt -l "homeMDB" -r "(&amp;(objectClass=user)(mailNickName=jeff*))</span>
						</p>
						<p>
						</p>
						<p>
								<span class="codeSample">dn:CN=jeff,OU=55Users,DC=witaylorroot,DC=com changetype:add homeMDB:CN=Private Information Store (WITAYLORNT4EX55),CN=First Storage Group,CN=InformationStore,CN=WITAYLORNT4EX55,CN=Servers,CN=WITAYLORMIXEDSITE,CN=Administrative Groups,CN=WITAYLORORG,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=witaylorroot,DC=com</span>
						</p>
						<p>
						</p>
						<p>
								<span class="codeSample">dn:CN=jeff2,CN=Users,DC=witaylorroot,DC=com changetype:add homeMDB:CN=Private Information Store (WITAYLORNT4EX55),CN=First Storage Group,CN=InformationStore,CN=WITAYLORNT4EX55,CN=Servers,CN=WITAYLORMIXEDSITE,CN=Administrative Groups,CN=WITAYLORORG,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=witaylorroot,DC=com</span>
						</p>
						<p>
						</p>
						<p>
								<span class="codeSample">dn:CN=jeff3,CN=Users,DC=witaylorroot,DC=com changetype:add homeMDB:CN=Private Information Store (WITAYLORNT4EX55),CN=First Storage Group,CN=InformationStore,CN=WITAYLORNT4EX55,CN=Servers,CN=WITAYLORMIXEDSITE,CN=Administrative Groups,CN=WITAYLORORG,CN=Microsoft Exchange,CN=Services,CN=Configuration,DC=witaylorroot,DC=com</span>
						</p>
						<p>如果您正在进行导出，并且没有限制导出哪些属性，可能需要使用 <span class="codeSample">¨Cn</span> 开关来排除正常情况下会包括在内的任何值。这有助于防止导出文件的体积变得过于庞大。</p>
				</div>
		</div>
		<div id="UsingLDAPQuieriesInADModify">
				<div style="MARGIN-TOP: 3px; MARGIN-BOTTOM: 10px">
						<a href="http://www.microsoft.com/china/technet/prodtechnol/exchange/2003/insider/ldapquery.mspx#top">
								<img height="9" alt="返回页首" src="http://www.microsoft.com/library/gallery/templates/MNP2.Common/images/arrow_px_up.gif" width="7" border="0" />
						</a>
						<a class="topOfPage" href="http://www.microsoft.com/china/technet/prodtechnol/exchange/2003/insider/ldapquery.mspx#top">返回页首</a>
				</div>
				<a name="EDAAC">
				</a>
				<h2>在 ADModify 中使用 LDAP 查询</h2>
				<p>若要获得 ADModify 工具，请联系微软产品支持服务。有关如何联系微软产品支持服务的更多信息，请参见<a href="http://go.microsoft.com/fwlink/?LinkId=41364" target="_blank">微软支持和帮助网站</a>。</p>
				<p>若要通过第三方网站获得 ADModify 工具，请访问以下 GotDotNet 网站：<a href="http://workspaces.gotdotnet.com/ADModify" target="_blank">ADModify.NET：Workspace 主页</a>.</p>
				<p>ADModify 是微软产品支持服务部门的日常使用工具。对于大型 Active Directory 环境，将可能包含数千用户的整个组织单位 (OU) 添加到右侧列表的工作并对他们进行分析以找出所需更改的用户，这个过程可能并不那么轻松。因此，我们可以使用其他方法实现这个目的。在第一个屏幕上，选择<b>修改现有用户属性</b>并单击<b>下一步</b>。在<b>修改 Active Directory 用户</b>屏幕上，有一个<b>高级</b>按钮。</p>
				<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/ea1873c7-1788-4944-b98d-5c58ba92f20a.gif" border="0" />
				<p>如果单击<b>高级</b>按钮，将出现<b>自定义 LDAP 筛选条件</b>对话框。在该对话框中，可输入要使用的 LDAP 筛选条件。在本例中，您只想列出启用了邮件的组。筛选条件看起来如下所示。</p>
				<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/677989cc-e781-469a-86bf-d1a05135f7da.gif" border="0" />
				<p>然后，单击<b>确定</b>。选择希望 ADModify 进行搜索的 OU 或域。如果您希望它搜索所选容器的下级容器，请确信选择了<b>枚举用户时遍历子容器</b>。单击<b>添加到列表</b>，<b></b>然后在接到需花费较长时间的警告时单击<b>是</b>。满足所指定条件的对象现在将显示在右侧窗格中。</p>
				<img alt="" src="http://www.microsoft.com/library/media/1033/technet/images/prodtechnol/exchange/2003/insider/4a9d4478-2af1-4083-9c5f-000d53784034.gif" border="0" />
				<p>在这里，可突出显示要修改的对象，然后继续向导的后续步骤。</p>
		</div>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/82016.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-11-19 11:58 <a href="http://www.blogjava.net/chenleiyu/archive/2006/11/19/82016.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)使用 Google Web Toolkit 开发 Ajax</title><link>http://www.blogjava.net/chenleiyu/archive/2006/07/05/56752.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 05 Jul 2006 06:47:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/07/05/56752.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/56752.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/07/05/56752.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/56752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/56752.html</trackback:ping><description><![CDATA[
		<p>2006 年 7 月 03 日</p>
		<p>Ajax技术是当前开发web应用的非常热门的技术，也是Web 2.0的一个重要的组成部分。然而如果用传统的方式Javascript进行Ajax开发的话，就会使得应用程序非常难以进行调试，从而降低了生产效率。Google最近推出的GWT有望为我们解决这个难题，GWT是一个开发Ajax应用的框架，它使程序员用Java同时开发客户端和服务器端的代码。GWT的编译器会把用于开发客户端的Java代码转化成Javascript和Html，而程序员不用关心这一转换过程。这样程序员就可以在自己喜欢的Java IDE里面开发自己的Ajax应用程序。</p>
		<p>本文主要从以下几个方面进行介绍：</p>
		<p>1、 GWT特性简介</p>
		<p>2、 用GWT进行UI开发</p>
		<p>3、 用Javascript开发Ajax应用简介</p>
		<p>4、 用GWT进行Ajax开发</p>
		<p>
				<a name="N10080">
						<span class="atitle">
								<strong>
										<font size="4">GWT特性简介</font>
								</strong>
						</span>
				</a>
		</p>
		<p>1．动态，可重用的UI组件</p>
		<p>GWT提供的组件库使用户可以很容易的开发出漂亮的UI, 每个组件对应于GWT的一个类。在本文的第二部分会比较详细的介绍GWT对UI的支持。</p>
		<p>2．简单的RPC调用</p>
		<p>使用GWT，可以方便的实现客户端和服务器端的通信，特别是使得异步通信变的非常简单。在本文的后面部分将对利用GWT进行RPC调用进行详细介绍。</p>
		<p>3．更加方便的调试</p>
		<p>由于在开发阶段不需要生成HTML截面，用户开发的代码实际上是在JVM上运行的，这样用户就可以用传统的调试Java代码的方法对程序进行调试，从而加快了调试的速度，减少了软件开发的时间。</p>
		<p>4．浏览器兼容性</p>
		<p>在大多数情况下，用GWT开发出来的程序会支持IE、Firefox、Mozilla、Safari和Opera，用户在开发的时候不必担心浏览器的兼容性问题。而浏览器的兼容性问题也是用直接用Javascript进行Ajax应用开发所面临的一个另程序员棘手问题。</p>
		<p>5．可扩展性</p>
		<p>如果你觉得GWT提供的API不能满足需求，你可以利用JSNI将Javascript语句直接嵌入至Java代码中。 </p>
		<p>
				<a name="N100A4">
						<span class="atitle">
								<strong>
										<font size="4">用GWT进行UI开发</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在本文的这一部分，我们将探讨一下GWT对UI开发的支持。在GWT中，包含我们进行Web开发所需要的大部分组件，比如按纽(Button)，文本框（Text box）等。图一显示了部分GWT所支持的UI组件。从图片的显示效果来看，利用GWT可以做出非常漂亮的UI。</p>
		<p>
				<br />
				<a name="N100AF">
						<strong>图一：GWT支持的部分UI组件</strong>
				</a>
				<br />
				<img height="435" alt="图一：GWT支持的部分UI组件" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image002.jpg" width="554" border="0" />
				<br />
		</p>
		<p>值得一提的是，在每个UI组件是必须放在一个称之为面板（Panel）的控件里面。而面板具有不同的风格，这也决定了UI的风格。图二显示了GWT所支持的部分面板。</p>
		<p>
				<br />
				<a name="N100C4">
						<strong>图二：GWT支持的部分面板</strong>
				</a>
				<br />
				<img height="399" alt="图二：GWT支持的部分面板" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image004.jpg" width="553" border="0" />
				<br />
		</p>
		<p>在看过这些组件之后，我们接下来用一个实验来讲述怎样把UI组件添加到页面上。这个实验的最终结果是一个登录框界面。</p>
		<p>在开始我们的实验之前，我们需要准备一下GWT环境，首先要到<a href="http://code.google.com/webtoolkit/download.html" target="_blank"><font color="#5c81a7">Google的网站</font></a>上去下载一个Windows版本的GWT，目前的版本号是1.0.21。然后要在机器上配置好JDK环境，具体的配置方法网络上有大量文档，这里就不再详细介绍。由于我们这个实验是在Eclipse开发环境下进行的，所以你还需要一个Eclipse的环境，可以到<a href="http://www.eclipse.org/" target="_blank"><font color="#5c81a7">Eclipse的官方网站</font></a>下载Eclipse的开发环境。接下来我们详细介绍试验过程。</p>
		<p>1． 创建Eclipse工程</p>
		<p>我们可以利用GWT自带的一个批处理文件projectCreator.cmd来创建Eclipse的工程。如图三所示，我们创建了一个名字为myProject的工程，存放在当前目录的myProject子目录下面，关于批处理文件projectCreator.cmd的详细用法，请参见Google关于<a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.Fundamentals.CommandLineTools.projectCreator.html" target="_blank"><font color="#5c81a7">GWT的帮助文档</font></a>。</p>
		<p>
				<br />
				<a name="N100EE">
						<strong>图三：用GWT创建Eclipse工程</strong>
				</a>
				<br />
				<img height="181" alt="图三：用GWT创建Eclipse工程" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image006.jpg" width="553" border="0" />
				<br />
		</p>
		<p>2． 创建GWT应用程序</p>
		<p>在创建完Eclipse工程myProject之后，我们利用GWT自带的另外一个批处理文件applicationCreator.cmd来创建一个GWT应用程序。图四显示了创建一个GWT应用的过程。大家注意到这个批处理文件接受一个名为 -eclipse 的参数，这个参数正是指定了一个Eclipse的工程，我们的例子中指定为我们刚创建好的Eclipse工程myProject。</p>
		<p>
				<br />
				<a name="N10106">
						<strong>图四：创建GWT应用程序</strong>
				</a>
				<br />
				<img height="225" alt="图四：创建GWT应用程序" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image008.jpg" width="554" border="0" />
				<br />
		</p>
		<p>3． 导入Eclipse工程</p>
		<p>在创建完Eclipse工程和GWT应用程序框架后，我们接着将Eclipse工程导入到Eclipse开发环境当中以进行进一步的开发，具体的导入过程不再详细介绍。导入后的工程结构如图五所示。</p>
		<p>
				<br />
				<a name="N1011E">
						<strong>图五：导入Eclipse工程</strong>
				</a>
				<br />
				<img height="322" alt="图五：导入Eclipse工程" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image009.jpg" width="550" border="0" />
				<br />
		</p>
		<p>6．添加UI组件</p>
		<p>在导入工程后，我们会发现工程里面有一个名字为DemoClient的Java文件。这个文件是在运行applicationCreator.cmd批处理文件时创建的，我们现在需要做的工作就是在这个Java文件上加入自己需要的UI组件。我们在这个文件中加入了五个组件，分别是：两个Label，一个Button，一个TextBox和一个PasswordTextBox。代码列表Listing 1中列出了本程序的所有代码。</p>
		<p>
				<br />
				<a name="N10134">
						<strong>Listing 1：Sample GWT Application</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    package com.sample.myProject.client;

2    import com.google.gwt.core.client.EntryPoint;
3    import com.google.gwt.user.client.ui.Button;
4    import com.google.gwt.user.client.ui.HorizontalPanel;
5    import com.google.gwt.user.client.ui.Label;
6    import com.google.gwt.user.client.ui.PasswordTextBox;
7    import com.google.gwt.user.client.ui.RootPanel;
8    import com.google.gwt.user.client.ui.TextBox;

/**
 * This class is used to demostrate how to add widget onto the Web page
 */
9    public class DemoClient implements EntryPoint {
  /**
   * This is the entry point method, when the module is load, this method
   * will be automatically invoked.
   */
10	  public void onModuleLoad() {
11		    Label labelName = new Label();
12		    Label labelPassword = new Label();		    
13		    TextBox tbName = new TextBox();
14	PasswordTextBox tbPassword = new PasswordTextBox();
15	Button button = new Button();
16		    
17		    labelName.setText("Name:        ");
18		    labelPassword.setText("Password: ");
19		    button.setText("submit");
20		    
21		    HorizontalPanel hPanel = new HorizontalPanel();
22		    HorizontalPanel hPanel2 = new HorizontalPanel();
23		    
24		    hPanel.add(labelName);
25		    hPanel.add(tbName);
26		    hPanel2.add(labelPassword);
27		    hPanel2.add(tbPassword);
		    
28		    RootPanel.get().add(hPanel);
29		    RootPanel.get().add(hPanel2);
30		    RootPanel.get().add(button);
31		  }
32   }
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>接下来我们分析一下这些程序代码，注意到类DemoClient继承自EntryPoint，所有需要最终被翻译成HTML页面的类都必须继承自EntryPoint，并且需要重写onModuleLoad方法，这个方法会在模块被装载的时候自动调用。因此我们也就需要把我们的添加组件的代码放到这个函数里面。</p>
		<p>程序的11至15行分别创建了5个组件的实例。分别是两个Label，一个Button，一个TextBox和一个PasswordTextBox。然后程序的17到19行分别设置了两个Label组件以及一个Button组件的显示内容。程序的21行和22行穿件两个Panel对象，这两个Panel对象的类型都是水平Panel对象。也就是说放在这种Panel里面的组件是被水平排列的。程序的24行到27行分别向这两个Panel对象中加入TextBox组件和Label组件。在程序的最后，将刚才创建好的两个Panel对象以及一个Button对象加到最外层的Panel当中。</p>
		<p>7．编译应用程序</p>
		<p>在代码开发完成后，我们可以双击工程里面的DemoClient-compile.cmd批处理文件来将我们开发出来Java文件编译成Javascript和HTML。编译后的文件将存放在工程的根目录下面的www子目录中。</p>
		<p>8．运行程序</p>
		<p>编译好程序后，我们会发现生成了一个名字为DemoClient.html的HTML文件，双击这个文件，程序的运行结果如图六所示：</p>
		<p>
				<br />
				<a name="N10152">
						<strong>图六：程序运行结果</strong>
				</a>
				<br />
				<img height="451" alt="图六：程序运行结果" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image010.jpg" width="464" border="0" />
				<br />
		</p>
		<p>在这一部分，我们主要讨论了如何将UI组件添加到Web页面中，而这些组件如何与远程服务器进行异步的交互将在下面的章节中进行讨论。</p>
		<p>
				<a name="N10165">
						<span class="atitle">
								<strong>
										<font size="4">用Javascript开发Ajax应用</font>
								</strong>
						</span>
				</a>
		</p>
		<p>为了使用户能更清楚地理解用GWT开发Ajax应用与用传统的Javascript开发Ajax应用的不同，文章的这一部分将简要介绍如何利用Javascript对象进行Ajax应用的开发。</p>
		<p>大家都知道Ajax技术中的一个核心对象是XMLHttpRequest对象，这个对象支持异步请求，所谓异步请求既是当客户端发送一个请求到服务器的时候，客户端不必一直等待服务器的响应。这样就不会造成整个页面的刷新，给用户带来更好的体验。而当服务器端响应返回时，客户端利用一个Javascript函数对返回值进行处理，以更新页面上的部分元素的值。</p>
		<p>由于在IE和其他浏览器上声称XMLHttpRequest对象的方法不一样，所以我们用Javascript创建XMLHttpRequest对象的时候必须区分不同的浏览器。创建一个XMLHttpRequest对象的方法如清单2 中的代码所示。</p>
		<p>
				<br />
				<a name="N10174">
						<strong>清单2：创建XMLHttpRequest对象</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    function createObject(){
2     try {
3		  xmlHttpRequest = new ActiveXObject("Msxml2.XMLHTTP");
4	  } catch (e1) {
5		  try {
6		    xmlHttpRequest = new ActiveXObject("Microsoft.XMLHTTP");
7		  } catch (e2) {
8		    xmlHttpRequest = false;
9		  }
10	  }
11  if (!xmlHttpRequest) {
12		 xmlHttpRequest = new XMLHttpRequest();
13	  }
14	  return xmlHttpRequest;      
16  }
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在创建好XMLHttpRequest对象之后，来看一下如何与server端进行异步的交互。清单3中列出了与服务器段进行交互的代码</p>
		<p>
				<br />
				<a name="N10187">
						<strong>清单3：与服务器端进行交互</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    function ajaxSample() {
2        var xmlHttpRequest = createObject();
3        var url = "/sampleServlet?userName=Jason";
4        xmlHttpRequest.open("GET", url, true);
5        xmlHttpRequest.onreadystatechange = updatePage;
6        xmlHttpRequest.send(null);
7    }
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>这段代码演示了如何与服务器端进行交互的过程。程序的第2行首先获得一个XMLHttpRequest对象，程序的第三行指定了服务器端响应客户端的请求的地址。程序的第4行利用XMLHttpRequest对象打开一个连接，第一个参数指定用GET方法传递参数，第二个参数指定了接受请求的URL，在我们的例子中是一个Servlet，最后一个参数设置成true意味着将要发出的请求是一个异步的请求。程序的第5行指定了回调函数，也就是当服务器端返回结果后执行哪个Javascript函数。</p>
		<p>这一部分对如何利用Javascript进行Ajax开发作了一个简要的介绍，下面我们将详细介绍如何利用GWT进行Ajax应用的开发。</p>
		<p>
				<a name="N1019D">
						<span class="atitle">
								<strong>
										<font size="4">用GWT进行Ajax开发</font>
								</strong>
						</span>
				</a>
		</p>
		<p>在文章的第二部分我们已经掌握了如何利用GWT创建一个工程并在工程里添加一个GWT应用程序，同样我们这一部分也需要创建一个GWT的工程，并添加一个GWT应用程序，由于默认创建的GWT程序不含有Server端的示例代码，我们必须手工加进去。我们创建好的工程GWTSample如图七所示。我们将要介绍的实例主要功能是采用异步通信的方式从服务器端取出一个字符串显示在HTML页面上。这个例子虽然简单，但却包含了如何利用GWT进行Ajax开发的主要流程。</p>
		<p>
				<br />
				<a name="N101A8">
						<strong>图七：GWTSample工程结构</strong>
				</a>
				<br />
				<img height="296" alt="图七：GWTSample工程结构" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image011.jpg" width="543" border="0" />
				<br />
		</p>
		<p>大家注意到我们这个工程里面有个com.sample.myProject.server包，这个包里面包含有运行在服务器端的代码。我们从客户端发送的请求也是发送到这个包里面的一个Servlet上去的。</p>
		<p>为了进行异步调用，在Client端必须定义一个继承自接口RemoteService的接口，在我们的这个例子中，我们定义了接口SampleService，SampleService的代码如清单4所示。</p>
		<p>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    package com.sample.myProject.client;

2    import com.google.gwt.user.client.rpc.RemoteService;

3    public interface SampleService extends RemoteService{
4    //The implementation of this method is used to return a string
5    String getString();
6    }
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>大家注意到这个接口继承自RemoteService，并且声明了一个方法getString();，这个方法会在服务器端的代码中实现。当然，大家可能现在已经意识到，这里声明的方法就是我们采用异步调用方式所能够调用的方法。</p>
		<p>在声明完这个接口之后，我们还必须声明另外一个异步调用接口，在我们的例子中是接口SampleServiceAsync，这个接口里声明的方法名称必须与SampleService里面的相同，但是多个一个类型为AsyncCallback的参数，接口SampleServiceAsync的代码清单如清单5所示：</p>
		<p>
				<br />
				<a name="N101CD">
						<strong>清单5：SampleServiceAsync代码清单</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    package com.sample.myProject.client;

2    import com.google.gwt.user.client.rpc.AsyncCallback;

3    public interface SampleServiceAsync {
	
4    void getString(AsyncCallback callback);
5	}
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>在客户端定义完接口之后，我们必须在服务器端实现这个接口，在我们的例子中，类SampleServiceImpl实现了接口SampleService，同时你也会注意到SampleServiceImpl也继承了类RemoteServiceServlet，而RemoteServiceServlet是HttpServlet的一个子类，这样我们的客户端的请求就可以提交到Servlet SampleServiceImpl上面。类SampleServiceImpl的代码清单如清单6所示：</p>
		<p>
				<br />
				<a name="N101DA">
						<strong>清单6：SampleServiceImpl代码清单</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    package com.sample.myProject.server;

2    import com.google.gwt.user.server.rpc.RemoteServiceServlet;
3    import com.sample.myProject.client.SampleService;

4	public class SampleServiceImpl extends RemoteServiceServlet implements 
5	 SampleService {
6          public String getString() {
7         return "This string is from server";
8          }
9	}
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>最后我们来看一下类DemoClient，这个类和我们在第二部分创建的工程myProject中的类DemoClient是同一个类型的。只不过在我们这个工程中我们使用它来进行向server端的异步调用。清单7列出了类DemoClient的代码。</p>
		<p>
				<br />
				<a name="N101E7">
						<strong>清单7：DemoClient代码清单</strong>
				</a>
				<br />
		</p>
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#eeeeee" border="1">
				<tbody>
						<tr>
								<td>
										<code>
												<pre class="section">1    package com.sample.myProject.client;

2    import com.google.gwt.core.client.EntryPoint;
3    import com.google.gwt.core.client.GWT;
4    import com.google.gwt.user.client.rpc.AsyncCallback;
5    import com.google.gwt.user.client.rpc.ServiceDefTarget;
6    import com.google.gwt.user.client.ui.Button;
7    import com.google.gwt.user.client.ui.ClickListener;
8    import com.google.gwt.user.client.ui.Label;
9    import com.google.gwt.user.client.ui.RootPanel;
10   import com.google.gwt.user.client.ui.Widget;

/**
 * This class is used to demostrate hwo to 
 * interact with the server client in asynchronized
 * way
 */
11   public class DemoClient implements EntryPoint {

12       public void onModuleLoad() {
13	final SampleServiceAsync sampleService = (SampleServiceAsync) 
14	 GWT.create(SampleService.class);
15        ServiceDefTarget target = (ServiceDefTarget)sampleService;
16        String staticResponseURL = GWT.getModuleBaseURL();
17        staticResponseURL += "/getStringService";
18        target.setServiceEntryPoint(staticResponseURL);
19        
20        final Label label = new Label();
21        final Button button = new Button("Get String");
        
22        button.addClickListener(new ClickListener() {
23            public void onClick(Widget sender) {
24                sampleService.getString(new AsyncCallback() {
25                    public void onSuccess(Object result) {
26                        label.setText((String) result);
27                    }
28                    public void onFailure(Throwable caught) {
29                        label.setText(caught.getMessage());
30                    }
31                });
32            }
33        });

34        RootPanel.get("1").add(button);
35        RootPanel.get("2").add(label);
36    }
37}
</pre>
										</code>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>代码的第13行得到了一个实现了接口SampleServiceAsync的类的实例。第15行创建了一个ServiceDefTarget对象的一个实例，通过这个对象可以设置请求的目的地。程序的第18行设置了请求的目的地的URL，在我们的例子中是"/getStringService"，这个URL会在web.xml文件中被mapping到servlet SampleServiceImpl上。程序的22行到33行为我们添加的button设置了单击响应事件。在单击响应事件中调用sampleService的getString(AsyncCallback callback);方法。这个方法是用来进行异步的远程过程调用的(RPC).并且在实现接口AsyncCallback的代码中指定了回调函数，当远程过程调用成功后就执行onSuccess(Object result)函数，其中result中存放有从服务器端返回的结果.。在远程工程调用失败后就执行onFailure(Throwable caught)函数。程序的最后把Button组件和Label组件加到panel中。</p>
		<p>现在我们已经完成了程序的开发，图八显示了我们程序的运行结果，在点击Button后，右边回打出一句话来，重要的是这句话是以异步的方式从服务器端取得的，不需要进行页面的刷新，怎么样，现在是不是也想用GWT进行Ajax应用开发了呢？</p>
		<p>
				<br />
				<a name="N101F9">
						<strong>图八：RPC调用示例</strong>
				</a>
				<br />
				<img height="448" alt="图八：RPC调用示例" src="http://www-128.ibm.com/developerworks/cn/java/j-lo-gwt-dev/images/image012.jpg" width="451" border="0" />
		</p>
		<p>
				<a name="N10209">
						<span class="atitle">
								<strong>
										<font size="4">总结</font>
								</strong>
						</span>
				</a>
		</p>
		<p>本文主要对用 GWT 进行 Ajax 开发进行了比较详细的介绍，并通过与传统的Ajax开发方式进行比较，使读者能更清楚地理解它们之间的区别，最后我们可以看出用GWT进行Ajax开发可以使得程序员免受调试Javascript之苦，并且GWT自动处理了浏览器之间的兼容性问题，这些都会使得开发更加容易，快捷。因此，用GWT进行Ajax开发是一种比较好的方式。希望本文能为读者学习GWT进行Ajax的开发有所帮助。</p>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/56752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-07-05 14:47 <a href="http://www.blogjava.net/chenleiyu/archive/2006/07/05/56752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)生命里最深沉的淡漠时光－－－最游记</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/28/55505.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 28 Jun 2006 03:42:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/28/55505.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/55505.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/28/55505.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/55505.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/55505.html</trackback:ping><description><![CDATA[
		<p>同样的人物再次出场，华丽的背景在天地见妖娆的蔓延，如向日葵般的绽放，肆无忌惮，花瓣飞扬。一切都以上帝的名义，在浑浊的世界里独自清醒，唇边淡淡的冷笑，诱惑着你我的心。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>三藏，三藏。我躲在阴暗的角落声音嘶哑悲凉，你的名字是我唯一的阳光，紫色的眼瞳深沉寞落，右手的左轮手枪瞬间爆发，无与伦比的速度如同闪电般耀眼，精确如斯的力量，连神灵也为之颤恐。肩膀上镂刻着的古老经文，似乎是封印着某个单薄的咒语。眉心的血色光斑，仿佛是火焰般的盛世莲花正开的无比灿烂。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>生命里最温馨的时刻，初次相遇，那只淘气的猴子，闪动着金色的双眸，金蝉，还依稀记得你的名字，河里飘来的孤独弃儿，你的生命注定从此怒放，傲视群雄。悟空，你的前世今生，究竟是什么让你选择了遗忘终生，不过幸好，那个重要的人，依旧如此温柔，虽然棱角分明。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>我一直怀疑，那么强大的力量，究竟是如何压迫，小小的妖力制御装置。八戒轻轻的微笑着，绿色的潭水，深沉的闪动着，点点的光斑，蕴涵着无法言明的痛楚和凄凉。我们永远无法知道，在八戒优雅的风度下面，是真心的快乐，还是低沉的泪水。然而——又是然而——被禁忌之子悟净，残忍的拯救，那个红发如火的顽劣孩童，夹带着主人嘲弄的表情，升向茫茫未知。颓废的生活为你而改，绝望的心情为你破灭。烟雾袅绕，隐隐闪现的，是四个男人的友情。倔强的命运之线，已经在我们的掌纹烙下印记，注定永不分离。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>流浪的步伐未曾驻留，你的手腕扣着我的手指，命运的红线带着轻盈的色泽，牵引着我寂寞的心的人，只有你。一切都带着冠冕堂皇的纯净梦魇，一切都伴随着理所当然的虚伪字眼，请以祈祷般虔诚的心情猜测，有关未来的轻微预测。这是多么的可笑，向着天籁进发的无敌组合，只相信自己的淡漠生灵，却曾来未曾说起未来。你我最终的归宿，是花喃温柔的怀抱，还是观音深沉的唇角。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>最游记。这是一部足以流传千古的漫画，对于生命的叩问，对于使命的思考，以及——对于神灵力量的探索。夹杂着的血腥暴力屠杀，以绝对的优势优雅胜出。却让我有不寒而栗的颤抖心情，想要拼命逃离却一次次的被他们的人格魅力吸引，即使是这样的痛楚，即使我的咽喉已经渗出了鲜血斑斑，声音嘶哑但并不迷茫，信念的坚定让我们拥有无与伦比的真诚信仰，我们依然喊着你们的名字，即使明知希望渺茫也不会放弃，因为总有一天，你会回头向我微笑。带着五百年的寂静轮回所遗留下的点点泪斑。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>狭小的阴暗阁楼，松动的木质地板只可以放进一本薄薄的最游记。永远是黑色的沉默封面，字迹印刻着古老的色泽，故事永远生动血肉丰满。没有王子公主的温馨童话，也没有花前月下的海誓山盟，却让我感动如斯，颤抖的手指不由自主的抚摩你俊美的脸颊，带着微微浅薄的幼稚心理，想象着你是为我如何披上婚纱。眼眸深处正涌动着一生一世的寂寞温柔。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>他们藕断丝连的暧昧关系，被定义为四个男人的友情，可是，那只猴子——喊着三藏我肚子饿了的小猴子，他真的可以算做一个——男人？Q版里的人物，让我有了拥抱的欲望，他的皮肤，一定像世界上最柔软的糖果枕一样柔软温暖。然而，就是这样一个有着大大金色眼瞳的小小可爱，却承担着队伍里最重的任务——与红孩儿战斗。即使是解除妖力制御装置后他会拥有绝对的优势，却以放弃自己为代价。我始终无法可想，这样矛盾的表现，凄惨的前世悲凉的今生，却没能在你的身上，烙下痛苦的痕迹。还是，只要有最重要的人的关怀，虽然棱角分明却也不会让你痛苦？ <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>我不得不提起红孩儿，这个沉默的让我心疼的孩子，几乎无敌的华丽招式足以与三藏匹敌，心里明明记得却无法准确描述的人格魅力，他绝非等闲。这样的结语出口我就觉得好笑，最游记的主角们，会有谁是等闲之辈？小小的配角，也让我记忆犹新。为了母亲听从玉面的指挥，与原本想成为朋友的人为敌，出手的瞬间，我猜你一定在犹豫仓皇。否则强大如你，怎么可能会失败？即使是最后你顿时醒悟，原来他们拥有着，你所缺少的东西。不过所幸，他们依旧了解你内心的真正渴望。为自己战斗。不再听从他人的恣意指挥。任何的否定，都不会再次听见。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>八百单。你的名字从何而来，西游记的历史，没有出现过你的名字。永远忘不了，你的第一次出场，温柔的寂寞神情，“我多么的希望……”，然而他却依旧清醒，不得不面对的战斗，无法忘怀的初次相遇，被红孩儿大人解救的苦命女生，信仰坚定。即使是在少爷丧失了自我意识之后，也可以微笑着听从。是怎样的心情啊，强忍着快要落出的眼泪，向他轻盈的点头。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>我用了大篇的文章字符来介绍人物，却只字不提情节。是怕再次回忆那样惊心动魄的场面，在华丽的街景之上战斗着的寂寞人群。地面上怒放的血色红莲，是他们向着苍天问路，归途依旧遥遥无期。而不约而同拥有的崎岖伤疤，竟然是让我们相遇的重要契机。面对着这样的辛酸历程，我想所有的人都会黯然神伤。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>这是一个关于命运的故事吧。一切都似乎是注定，一切都容不得反抗。玉面公主残酷的神情，让世界疯狂堕落的最终理由竟然是为了与爱人的再次相遇，惊心动魄的理由，却是这么的理所当然，冰冷彻骨中的隐隐温情，比花前月下的对酒当歌更让我感动，桃源乡妖怪们疯狂的寂寞神情，被操纵了的心灵，神灵们在云翳之间绽开冷漠的笑靥。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>没有泪水并不代表没有令人动容的黯然神伤；没有表白并不代表没有温馨弥漫的真情流露。初次相遇的时候，悟空手手指拉着三藏的长发，告诉他说你像太阳王子一样漂亮，于是一切都烟消云散，那一定是他生命里最温暖的时刻，虽然没有诉说，可是我们却不约而同的相信，三藏的一生，即使丧失了所有的记忆，也还是会记起，悟空清朗的声音。如同阴翳里的眩目光芒，为他的生活镀上了只属于他的特殊印记。单纯的明亮着。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>八戒温和的笑着，如同深不见底的古老潭水，沉积着千年的悲哀与抑郁。花喃的失去让他疯狂，生命里第一个爱人是自己的亲生姐姐，不该发生的故事，最好永远也不要发生。不该出现的人群，也最好永远不会出现，不该拥有的誓言，却被一次次的渴望，虽然明知结果只能注定悲哀。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>赎罪。屠杀。血腥。温情。在三个阴暗的词语之后添加的快乐字眼，突兀的如同阴森森的惨白骨头，刺破了黑色的天空。锣鼓喧嚣中的幽幽琴声，也会如此的神宇轩昂吧。孤独却不寂寞的声音，是否代表着你我的友情，如同清纯的泉水， 流淌在萧索的人间。瞬间洪流滚滚，淹没被弥漫着灰尘的土地。重生，然后再次相遇。依旧不会有任何束缚，依旧是强大的力量。所不同的，再也没有冷冰的过去，红莲依旧璀璨。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>“我们的心细小得连空隙都没有了，已经容不下更多的人来牵挂了” <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>应该是个温暖的结局吧，当这样的台词出现的时候，已经忘记了是谁的声音，却依旧记得，那种未知的感动，突然间涌出的泪水，是不是太阳的点点光斑？我听到了一首无言的歌，正如晨花般的照耀春天。 <br /></p>
		<p>
		</p>
		<p>
		</p>
		<p>
		</p>
		<p>四个人的世界，已经容不下太多了。没有足够的空间可以奢华的挥霍，也没有太多的时间分享。<br /></p>
		<p> </p>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/55505.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-28 11:42 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/28/55505.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>盗火线</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/26/55118.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Mon, 26 Jun 2006 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/26/55118.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/55118.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/26/55118.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/55118.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/55118.html</trackback:ping><description><![CDATA[A guy once told me, "Do not have any attachments, do not have anything in your life you are not willing to walk out on in 30 seconds flat.<img src ="http://www.blogjava.net/chenleiyu/aggbug/55118.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-26 13:12 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/26/55118.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>prototype源码（转）</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54741.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 23 Jun 2006 09:26:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54741.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/54741.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/54741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/54741.html</trackback:ping><description><![CDATA[
		<p>
				<br />/** <br /> * 定义一个全局对象, 属性 Version 在发布的时候会替换为当前版本号 <br /> */ <br />var Prototype = { <br />  Version: '@@VERSION@@' <br />} <br /><br />/** <br /> * 创建一种类型，注意其属性 create 是一个方法，返回一个构造函数。 <br /> * 一般使用如下  <br /> *     var X = Class.create();  返回一个类型，类似于 java 的一个Class实例。 <br /> * 要使用 X 类型，需继续用 new X()来获取一个实例，如同 java 的 Class.newInstance()方法。 <br /> * <br /> * 返回的构造函数会执行名为 initialize 的方法， initialize 是 Ruby 对象的构造器方法名字。 <br /> * 此时initialize方法还没有定义，其后的代码中创建新类型时会建立相应的同名方法。 <br /> * <br /> * 如果一定要从java上去理解。你可以理解为用Class.create()创建一个继承java.lang.Class类的类。当然java不允许这样做，因为Class类是final的 <br /> * <br /> */ <br />var Class = { <br />  create: function() { <br />    return function() { <br />      this.initialize.apply(this, arguments); <br />    } <br />  } <br />} <br /><br />/** <br /> * 创建一个对象，从变量名来思考，本意也许是定义一个抽象类，以后创建新对象都 extend 它。 <br /> * 但从其后代码的应用来看， Abstract 更多是为了保持命名空间清晰的考虑。 <br /> * 也就是说，我们可以给 Abstract 这个对象实例添加新的对象定义。 <br /> * <br /> * 从java去理解，就是动态给一个对象创建内部类。 <br /> */ <br />var Abstract = new Object(); <br /><br />/** <br /> * 获取参数对象的所有属性和方法，有点象多重继承。但是这种继承是动态获得的。 <br /> * 如： <br /> *     var a = new ObjectA(), b = new ObjectB(); <br /> *     var c = a.extend(b); <br /> * 此时 c 对象同时拥有 a 和 b 对象的属性和方法。但是与多重继承不同的是，c instanceof ObjectB 将返回false。 <br /> */ <br />Object.prototype.extend = function(object) { <br />  for (property in object) { <br />    this[property] = object[property]; <br />  } <br />  return this; <br />} <br /><br />/** <br /> * 这个方法很有趣，它封装一个javascript函数对象，返回一个新函数对象，新函数对象的主体和原对象相同，但是bind()方法参数将被用作当前对象的对象。 <br /> * 也就是说新函数中的 this 引用被改变为参数提供的对象。 <br /> * 比如： <br /> *     &lt;input type="text" id="aaa" value="aaa"&gt; <br /> *     &lt;input type="text" id="bbb" value="bbb"&gt; <br /> *     ................. <br /> *     &lt;script&gt; <br /> *         var aaa = document.getElementById("aaa"); <br /> *         var bbb = document.getElementById("bbb"); <br /> *         aaa.showValue = function() {alert(this.value);} <br /> *         aaa.showValue2 = aaa.showValue.bind(bbb); <br /> *     &lt;/script&gt; <br /> *  那么，调用aaa.showValue 将返回"aaa", 但调用aaa.showValue2 将返回"bbb"。 <br /> * <br /> * apply 是ie5.5后才出现的新方法(Netscape好像很早就支持了)。 <br /> * 该方法更多的资料参考MSDN http://msdn.microsoft.com/library/en-us/script56/html/js56jsmthApply.asp <br /> * 还有一个 call 方法，应用起来和 apply 类似。可以一起研究下。 <br /> */ <br />Function.prototype.bind = function(object) { <br />  var method = this; <br />  return function() { <br />    method.apply(object, arguments); <br />  } <br />} <br /><br />/** <br /> * 和bind一样，不过这个方法一般用做html控件对象的事件处理。所以要传递event对象 <br /> * 注意这时候，用到了 Function.call。它与 Function.apply 的不同好像仅仅是对参数形式的定义。 <br /> * 如同 java 两个过载的方法。 <br /> */ <br />Function.prototype.bindAsEventListener = function(object) { <br />  var method = this; <br />  return function(event) { <br />    method.call(object, event || window.event); <br />  } <br />} <br /><br />/** <br /> * 将整数形式RGB颜色值转换为HEX形式 <br /> */ <br />Number.prototype.toColorPart = function() { <br />  var digits = this.toString(16); <br />  if (this &lt; 16) return '0' + digits; <br />  return digits; <br />} <br /><br />/** <br /> * 典型 Ruby 风格的函数，将参数中的方法逐个调用，返回第一个成功执行的方法的返回值 <br /> */ <br />var Try = { <br />  these: function() { <br />    var returnValue; <br />    <br />    for (var i = 0; i &lt; arguments.length; i++) { <br />      var lambda = arguments[i]; <br />      try { <br />        returnValue = lambda(); <br />        break; <br />      } catch (e) {} <br />    } <br />    <br />    return returnValue; <br />  } <br />} <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * 一个设计精巧的定时执行器 <br /> * 首先由 Class.create() 创建一个 PeriodicalExecuter 类型， <br /> * 然后用对象直接量的语法形式设置原型。 <br /> * <br /> * 需要特别说明的是 rgisterCallback 方法，它调用上面定义的函数原型方法bind, 并传递自己为参数。 <br /> * 之所以这样做，是因为 setTimeout 默认总以 window 对象为当前对象，也就是说，如果 registerCallback 方法定义如下的话： <br /> *     registerCallback: function() { <br /> *         setTimeout(this.onTimerEvent, this.frequency * 1000); <br /> *     } <br /> * 那么，this.onTimeoutEvent 方法执行失败，因为它无法访问 this.currentlyExecuting 属性。 <br /> * 而使用了bind以后，该方法才能正确的找到this，也就是PeriodicalExecuter的当前实例。 <br /> */ <br />var PeriodicalExecuter = Class.create(); <br />PeriodicalExecuter.prototype = { <br />  initialize: function(callback, frequency) { <br />    this.callback = callback; <br />    this.frequency = frequency; <br />    this.currentlyExecuting = false; <br />    <br />    this.registerCallback(); <br />  }, <br />  <br />  registerCallback: function() { <br />    setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); <br />  }, <br />  <br />  onTimerEvent: function() { <br />    if (!this.currentlyExecuting) { <br />      try { <br />        this.currentlyExecuting = true; <br />        this.callback(); <br />      } finally { <br />        this.currentlyExecuting = false; <br />      } <br />    } <br />    <br />    this.registerCallback(); <br />  } <br />} <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * 这个函数就 Ruby 了。我觉得它的作用主要有两个 <br /> * 1.  大概是 document.getElementById(id) 的最简化调用。 <br /> * 比如：$("aaa") 将返回上 aaa 对象 <br /> * 2.  得到对象数组 <br /> * 比如: $("aaa","bbb") 返回一个包括id为"aaa"和"bbb"两个input控件对象的数组。 <br /> */ <br />function $() { <br />  var elements = new Array(); <br />  <br />  for (var i = 0; i &lt; arguments.length; i++) { <br />    var element = arguments[i]; <br />    if (typeof element == 'string') <br />      element = document.getElementById(element); <br /><br />    if (arguments.length == 1) <br />      return element; <br />      <br />    elements.push(element); <br />  } <br />  <br />  return elements; <br />} <br />** <br /> * 定义 Ajax 对象, 静态方法 getTransport 方法返回一个 XMLHttp 对象 <br /> */ <br />var Ajax = { <br />  getTransport: function() { <br />    return Try.these( <br />      function() {return new ActiveXObject('Msxml2.XMLHTTP')}, <br />      function() {return new ActiveXObject('Microsoft.XMLHTTP')}, <br />      function() {return new XMLHttpRequest()} <br />    ) || false; <br />  }, <br />  <br />  emptyFunction: function() {} <br />} <br /><br />/** <br /> * 我以为此时的Ajax对象起到命名空间的作用。 <br /> * Ajax.Base 声明为一个基础对象类型 <br /> * 注意 Ajax.Base 并没有使用 Class.create() 的方式来创建，我想是因为作者并不希望 Ajax.Base 被库使用者实例化。 <br /> * 作者在其他对象类型的声明中，将会继承于它。 <br /> * 就好像 java 中的私有抽象类 <br /> */ <br />Ajax.Base = function() {}; <br />Ajax.Base.prototype = { <br />  /** <br />   * extend (见prototype.js中的定义) 的用法真是让人耳目一新 <br />   * options 首先设置默认属性，然后再 extend 参数对象，那么参数对象中也有同名的属性，那么就覆盖默认属性值。 <br />   * 想想如果我写这样的实现，应该类似如下： <br />     setOptions: function(options) { <br />      this.options.methed = options.methed? options.methed : 'post'; <br />      .......... <br />     } <br />     我想很多时候，java 限制了 js 的创意。 <br />   */ <br />  setOptions: function(options) { <br />    this.options = { <br />      method:       'post', <br />      asynchronous: true, <br />      parameters:   '' <br />    }.extend(options || {}); <br />  } <br />} <br /><br /><br />/** <br /> * Ajax.Request 封装 XmlHttp <br /> */ <br />Ajax.Request = Class.create(); <br /><br />/** <br /> * 定义四种事件(状态)， 参考http://msdn.microsoft.com/workshop/author/dhtml/reference/properties/readystate_1.asp <br /> */ <br />Ajax.Request.Events = <br />  ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; <br /><br />/** <br /> * <br /> */ <br />Ajax.Request.prototype = (new Ajax.Base()).extend({ <br />  initialize: function(url, options) { <br />    this.transport = Ajax.getTransport(); <br />    this.setOptions(options); <br />  <br />    try { <br />      if (this.options.method == 'get') <br />        url += '?' + this.options.parameters + '&amp;_='; <br />    <br />     /** <br />      * 此处好像强制使用了异步方式，而不是依照 this.options.asynchronous 的值 <br />      */ <br />      this.transport.open(this.options.method, url, true); <br />      <br />     /** <br />      * 这里提供了 XmlHttp 传输过程中每个步骤的回调函数 <br />      */ <br />      if (this.options.asynchronous) { <br />        this.transport.onreadystatechange = this.onStateChange.bind(this); <br />        setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); <br />      } <br />              <br />      this.transport.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); <br />      this.transport.setRequestHeader('X-Prototype-Version', Prototype.Version); <br /><br />      if (this.options.method == 'post') { <br />        this.transport.setRequestHeader('Connection', 'close'); <br />        this.transport.setRequestHeader('Content-type', <br />          'application/x-www-form-urlencoded'); <br />      } <br />      <br />      this.transport.send(this.options.method == 'post' ? <br />        this.options.parameters + '&amp;_=' : null); <br />                      <br />    } catch (e) { <br />    }    <br />  }, <br />      <br />  onStateChange: function() { <br />    var readyState = this.transport.readyState; <br />   /** <br />    * 如果不是 Loading 状态，就调用回调函数 <br />     */ <br />    if (readyState != 1) <br />      this.respondToReadyState(this.transport.readyState); <br />  }, <br />  <br />  /** <br />   * 回调函数定义在 this.options 属性中，比如: <br />      var option = { <br />         onLoaded : function(req) {...}; <br />         ...... <br />      } <br />      new Ajax.Request(url, option); <br />   */ <br />  respondToReadyState: function(readyState) { <br />    var event = Ajax.Request.Events[readyState]; <br />    (this.options['on' + event] || Ajax.emptyFunction)(this.transport); <br />  } <br />}); <br /><br />/** <br /> * Ajax.Updater 用于绑定一个html元素与 XmlHttp调用的返回值。类似与 buffalo 的 bind。 <br /> * 如果 options 中有 insertion(from dom.js) 对象的话, insertion 能提供更多的插入控制。 <br /> */ <br />Ajax.Updater = Class.create(); <br />Ajax.Updater.prototype = (new Ajax.Base()).extend({ <br />  initialize: function(container, url, options) { <br />    this.container = $(container); <br />    this.setOptions(options); <br />  <br />    if (this.options.asynchronous) { <br />      this.onComplete = this.options.onComplete; <br />      this.options.onComplete = this.updateContent.bind(this); <br />    } <br />    <br />    this.request = new Ajax.Request(url, this.options); <br />    <br />    if (!this.options.asynchronous) <br />      this.updateContent(); <br />  }, <br />  <br />  updateContent: function() { <br />    if (this.options.insertion) { <br />      new this.options.insertion(this.container, <br />        this.request.transport.responseText); <br />    } else { <br />      this.container.innerHTML = this.request.transport.responseText; <br />    } <br /><br />    if (this.onComplete) { <br />      setTimeout((function() {this.onComplete(this.request)}).bind(this), 10); <br />    } <br />  } <br />}); <br />/** <br /> * 针对 页面元素对象 的工具类，提供一些简单静态方法 <br /> */ <br />var Field = { <br />  /** <br />   * 清除参数引用对象的值 <br />   */ <br />  clear: function() { <br />    for (var i = 0; i &lt; arguments.length; i++) <br />      $(arguments[i]).value = ''; <br />  }, <br /><br />  /** <br />   * 使参数引用对象获取焦点 <br />   */ <br />  focus: function(element) { <br />    $(element).focus(); <br />  }, <br />  <br />  /** <br />   * 判断参数引用对象值是否为空，如为空，返回false, 反之true <br />   */ <br />  present: function() { <br />    for (var i = 0; i &lt; arguments.length; i++) <br />      if ($(arguments[i]).value == '') return false; <br />    return true; <br />  }, <br />  <br />  /** <br />   * 使选中参数引用对象 <br />   */ <br />  select: function(element) { <br />    $(element).select(); <br />  }, <br /><br />  /** <br />   * 使参数引用对象处于可编辑状态 <br />   */ <br />  activate: function(element) { <br />    $(element).focus(); <br />    $(element).select(); <br />  } <br />} <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * 表单工具类 <br /> */ <br />var Form = { <br />  /** <br />   * 将表单元素序列化后的值组合成 QueryString 的形式 <br />   */ <br />  serialize: function(form) { <br />    var elements = Form.getElements($(form)); <br />    var queryComponents = new Array(); <br />    <br />    for (var i = 0; i &lt; elements.length; i++) { <br />      var queryComponent = Form.Element.serialize(elements[i]); <br />      if (queryComponent) <br />        queryComponents.push(queryComponent); <br />    } <br />    <br />    return queryComponents.join('&amp;'); <br />  }, <br />  <br />  /** <br />   * 得到表单的所有元素对象 <br />   */ <br />  getElements: function(form) { <br />    form = $(form); <br />    var elements = new Array(); <br /><br />    for (tagName in Form.Element.Serializers) { <br />      var tagElements = form.getElementsByTagName(tagName); <br />      for (var j = 0; j &lt; tagElements.length; j++) <br />        elements.push(tagElements[j]); <br />    } <br />    return elements; <br />  }, <br />  <br />  /** <br />   * 将指定表单的元素置于不可用状态 <br />   */ <br />  disable: function(form) { <br />    var elements = Form.getElements(form); <br />    for (var i = 0; i &lt; elements.length; i++) { <br />      var element = elements[i]; <br />      element.blur(); <br />      element.disable = 'true'; <br />    } <br />  }, <br /><br />  /** <br />   * 使表单的第一个非 hidden 类型而且处于可用状态的元素获得焦点 <br />   */ <br />  focusFirstElement: function(form) { <br />    form = $(form); <br />    var elements = Form.getElements(form); <br />    for (var i = 0; i &lt; elements.length; i++) { <br />      var element = elements[i]; <br />      if (element.type != 'hidden' &amp;&amp; !element.disabled) { <br />        Field.activate(element); <br />        break; <br />      } <br />    } <br />  }, <br /><br />  /* <br />   * 重置表单 <br />   */ <br />  reset: function(form) { <br />    $(form).reset(); <br />  } <br />} <br /><br />/** <br /> * 表单元素工具类 <br /> */ <br />Form.Element = { <br />  /** <br />   * 返回表单元素的值先序列化再进行 URL 编码后的值 <br />   */ <br />  serialize: function(element) { <br />    element = $(element); <br />    var method = element.tagName.toLowerCase(); <br />    var parameter = Form.Element.Serializers[method](element); <br />    <br />    if (parameter) <br />      return encodeURIComponent(parameter[0]) + '=' + <br />        encodeURIComponent(parameter[1]);                    <br />  }, <br />  <br />  /** <br />   *  返回表单元素序列化后的值 <br />   */ <br />  getValue: function(element) { <br />    element = $(element); <br />    var method = element.tagName.toLowerCase(); <br />    var parameter = Form.Element.Serializers[method](element); <br />    <br />    if (parameter) <br />      return parameter[1]; <br />  } <br />} <br /><br />/** <br /> * prototype 的所谓序列化其实就是将表单的名字和值组合成一个数组 <br /> */ <br />Form.Element.Serializers = { <br />  input: function(element) { <br />    switch (element.type.toLowerCase()) { <br />      case 'hidden': <br />      case 'password': <br />      case 'text': <br />        return Form.Element.Serializers.textarea(element); <br />      case 'checkbox':  <br />      case 'radio': <br />        return Form.Element.Serializers.inputSelector(element); <br />    } <br />    return false; <br />  }, <br />  <br />  inputSelector: function(element) { <br />    if (element.checked) <br />      return [element.name, element.value]; <br />  }, <br /><br />  textarea: function(element) { <br />    return [element.name, element.value]; <br />  }, <br /><br />  /** <br />   * 看样子，也不支持多选框(select-multiple) <br />   */ <br />  select: function(element) { <br />    var index = element.selectedIndex; <br />    var value = element.options[index].value || element.options[index].text; <br />    return [element.name, (index &gt;= 0) ? value : '']; <br />  } <br />} <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * Form.Element.getValue 也许会经常用到，所以做了一个快捷引用 <br /> */ <br />var $F = Form.Element.getValue; <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * Abstract.TimedObserver 也没有用 Class.create() 来创建，和Ajax.Base 意图应该一样 <br /> * Abstract.TimedObserver 顾名思义，是套用Observer设计模式来跟踪指定表单元素， <br /> * 当表单元素的值发生变化的时候，就执行回调函数 <br /> * <br /> * 我想　Observer 与注册onchange事件相似，不同点在于 onchange 事件是在元素失去焦点的时候才激发。 <br /> * 同样的与 onpropertychange 事件也相似，不过它只关注表单元素的值的变化，而且提供timeout的控制。 <br /> * <br /> * 除此之外，Observer 的好处大概就在与更面向对象，另外可以动态的更换回调函数，这就比注册事件要灵活一些。 <br /> * Observer 应该可以胜任动态数据校验，或者多个关联下拉选项列表的连动等等 <br /> * <br /> */ <br />Abstract.TimedObserver = function() {} <br /><br />/** <br /> * 这个设计和 PeriodicalExecuter 一样，bind 方法是实现的核心 <br /> */ <br />Abstract.TimedObserver.prototype = { <br />  initialize: function(element, frequency, callback) { <br />    this.frequency = frequency; <br />    this.element   = $(element); <br />    this.callback  = callback; <br />    <br />    this.lastValue = this.getValue(); <br />    this.registerCallback(); <br />  }, <br />  <br />  registerCallback: function() { <br />    setTimeout(this.onTimerEvent.bind(this), this.frequency * 1000); <br />  }, <br />  <br />  onTimerEvent: function() { <br />    var value = this.getValue(); <br />    if (this.lastValue != value) { <br />      this.callback(this.element, value); <br />      this.lastValue = value; <br />    } <br />    <br />    this.registerCallback(); <br />  } <br />} <br /><br />/** <br /> * Form.Element.Observer 和 Form.Observer 其实是一样的 <br /> * 注意 Form.Observer 并不是用来跟踪整个表单的，我想大概只是为了减少书写(这是Ruby的一个设计原则) <br /> */ <br />Form.Element.Observer = Class.create(); <br />Form.Element.Observer.prototype = (new Abstract.TimedObserver()).extend({ <br />  getValue: function() { <br />    return Form.Element.getValue(this.element); <br />  } <br />}); <br /><br />Form.Observer = Class.create(); <br />Form.Observer.prototype = (new Abstract.TimedObserver()).extend({ <br />  getValue: function() { <br />    return Form.serialize(this.element); <br />  } <br />}); <br />/** <br /> * 根据 class attribute 的名字得到对象数组，支持 multiple class <br /> * <br /> */ <br />document.getElementsByClassName = function(className) { <br />  var children = document.getElementsByTagName('*') || document.all; <br />  var elements = new Array(); <br />  <br />  for (var i = 0; i &lt; children.length; i++) { <br />    var child = children[i]; <br />    var classNames = child.className.split(' '); <br />    for (var j = 0; j &lt; classNames.length; j++) { <br />      if (classNames[j] == className) { <br />        elements.push(child); <br />        break; <br />      } <br />    } <br />  } <br />  <br />  return elements; <br />} <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * Element 就象一个 java 的工具类，主要用来 隐藏/显示/销除 对象，以及获取对象的简单属性。 <br /> * <br /> */ <br />var Element = { <br />  toggle: function() { <br />    for (var i = 0; i &lt; arguments.length; i++) { <br />      var element = $(arguments[i]); <br />      element.style.display = <br />        (element.style.display == 'none' ? '' : 'none'); <br />    } <br />  }, <br /><br />  hide: function() { <br />    for (var i = 0; i &lt; arguments.length; i++) { <br />      var element = $(arguments[i]); <br />      element.style.display = 'none'; <br />    } <br />  }, <br /><br />  show: function() { <br />    for (var i = 0; i &lt; arguments.length; i++) { <br />      var element = $(arguments[i]); <br />      element.style.display = ''; <br />    } <br />  }, <br /><br />  remove: function(element) { <br />    element = $(element); <br />    element.parentNode.removeChild(element); <br />  }, <br />    <br />  getHeight: function(element) { <br />    element = $(element); <br />    return element.offsetHeight; <br />  } <br />} <br /><br />/** <br /> * 为 Element.toggle 做了一个符号连接，大概是兼容性的考虑 <br /> */ <br />var Toggle = new Object(); <br />Toggle.display = Element.toggle; <br /><br />/*--------------------------------------------------------------------------*/ <br /><br />/** <br /> * 动态插入内容的实现，MS的Jscript实现中对象有一个 insertAdjacentHTML 方法(http://msdn.microsoft.com/workshop/author/dhtml/reference/methods/insertadjacenthtml.asp) <br /> * 这里算是一个对象形式的封装。 <br /> */ <br />Abstract.Insertion = function(adjacency) { <br />  this.adjacency = adjacency; <br />} <br /><br />Abstract.Insertion.prototype = { <br />  initialize: function(element, content) { <br />    this.element = $(element); <br />    this.content = content; <br />    <br />    if (this.adjacency &amp;&amp; this.element.insertAdjacentHTML) { <br />      this.element.insertAdjacentHTML(this.adjacency, this.content); <br />    } else { <br />     /** <br />      * gecko 不支持 insertAdjacentHTML 方法，但可以用如下代码代替 <br />      */ <br />      this.range = this.element.ownerDocument.createRange(); <br />     /** <br />      * 如果定义了 initializeRange 方法，则实行，这里相当与定义了一个抽象的 initializeRange 方法 <br />      */ <br />      if (this.initializeRange) this.initializeRange(); <br />      this.fragment = this.range.createContextualFragment(this.content); <br /><br />     /** <br />      * insertContent 也是一个抽象方法，子类必须实现 <br />      */ <br />      this.insertContent(); <br />    } <br />  } <br />} <br /><br />/** <br /> * prototype 加深了我的体会，就是写js 如何去遵循　Don’t Repeat Yourself (DRY) 原则 <br /> * 上文中 Abstract.Insertion 算是一个抽象类，定义了名为　initializeRange 的一个抽象方法 <br /> * var Insertion = new Object()　建立一个命名空间 <br /> * Insertion.Before|Top|Bottom|After 就象是四个java中的四个静态内部类，而它们分别继承于Abstract.Insertion，并实现了initializeRange方法。 <br /> */ <br />var Insertion = new Object(); <br /><br />Insertion.Before = Class.create(); <br />Insertion.Before.prototype = (new Abstract.Insertion('beforeBegin')).extend({ <br />  initializeRange: function() { <br />    this.range.setStartBefore(this.element); <br />  }, <br />  <br />  /** <br />   * 将内容插入到指定节点的前面, 与指定节点同级 <br />   */ <br />  insertContent: function() { <br />    this.element.parentNode.insertBefore(this.fragment, this.element); <br />  } <br />}); <br /><br />Insertion.Top = Class.create(); <br />Insertion.Top.prototype = (new Abstract.Insertion('afterBegin')).extend({ <br />  initializeRange: function() { <br />    this.range.selectNodeContents(this.element); <br />    this.range.collapse(true); <br />  }, <br />  <br />  /** <br />   * 将内容插入到指定节点的第一个子节点前，于是内容变为该节点的第一个子节点 <br />   */ <br />  insertContent: function() {  <br />    this.element.insertBefore(this.fragment, this.element.firstChild); <br />  } <br />}); <br /><br />Insertion.Bottom = Class.create(); <br />Insertion.Bottom.prototype = (new Abstract.Insertion('beforeEnd')).extend({ <br />  initializeRange: function() { <br />    this.range.selectNodeContents(this.element); <br />    this.range.collapse(this.element); <br />  }, <br />  <br />  /** <br />   * 将内容插入到指定节点的最后，于是内容变为该节点的最后一个子节点 <br />   */ <br />  insertContent: function() { <br />    this.element.appendChild(this.fragment); <br />  } <br />}); <br /><br /><br />Insertion.After = Class.create(); <br />Insertion.After.prototype = (new Abstract.Insertion('afterEnd')).extend({ <br />  initializeRange: function() { <br />    this.range.setStartAfter(this.element); <br />  }, <br /><br />  /** <br />   * 将内容插入到指定节点的后面, 与指定节点同级 <br />   */ <br />  insertContent: function() { <br />    this.element.parentNode.insertBefore(this.fragment, <br />      this.element.nextSibling); <br />  } <br />}); <br /><span class="postbody">prototype 还有两个源码文件 effects.js compat.js 就不贴出来了。两者并不常用，effects.js 看example 做花哨的效果还不错，不过代码中没有太多新鲜的东西。 <br /><br />需要指出的就是 <br />compat.js 中 Funcation.prototype.apply 的实现有两个错误（应该是拼写错误）， 我分别贴出来，大家比较一下就清楚了。 <br /><br /></span></p>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>代码:</b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />/* 这是包含错误的原版本 <br />if (!Function.prototype.apply) { <br />// Based on code from http://www.youngpup.net/ <br />Function.prototype.apply = function(object, parameters) { <br />var parameterStrings = new Array(); <br />if (!object) object = window; <br />if (!parameters) parameters = new Array(); <br /><br />for (var i = 0; i &lt; parameters.length; i++) <br />parameterStrings[i] = 'x[' + i + ']'; //Error 1 <br /><br />object.__apply__ = this; <br />var result = eval('obj.__apply__(' + //Error 2 <br />parameterStrings[i].join(', ') + ')'); <br />object.__apply__ = null; <br /><br />return result; <br />} <br />} <br />*/ <br /><br />if (!Function.prototype.apply) { <br />  Function.prototype.apply = function(object, parameters) { <br />    var parameterStrings = new Array(); <br />    if (!object) object = window; <br />    if (!parameters) parameters = new Array(); <br /><br />    for (var i = 0; i &lt; parameters.length; i++) <br />      parameterStrings[i] = 'parameters[' + i + ']'; <br /><br />    object.__apply__ = this; <br />    var result = eval('object.__apply__(' + parameterStrings.join(', ') + ')'); <br />    object.__apply__ = null; <br /><br />    return result; <br />  } <br />} <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />接下来是我模仿着编写的一个 Effect 的一个子类，用来实现闪烁的效果。 <br /><br /></span>
		<table cellspacing="1" cellpadding="3" width="90%" align="center" border="0">
				<tbody>
						<tr>
								<td>
										<span class="genmed">
												<b>代码:</b>
										</span>
								</td>
						</tr>
						<tr>
								<td class="code">
										<br />Effect.Blink = Class.create(); <br />Effect.Blink.prototype = { <br />  initialize: function(element, frequency) { <br />    this.element = $(element); <br />    this.frequency = frequency?frequency:1000; <br />    this.element.effect_blink = this; <br />    this.blink(); <br />  }, <br /><br />  blink: function() { <br />    if (this.timer) clearTimeout(this.timer); <br />    try { <br />      this.element.style.visibility = this.element.style.visibility == 'hidden'?'visible':'hidden'; <br />    } catch (e) {} <br />    this.timer = setTimeout(this.blink.bind(this), this.frequency); <br />   } <br />}; <br /></td>
						</tr>
				</tbody>
		</table>
		<span class="postbody">
				<br />
				<br />使用也很简单， 调用 new Effect.Blink(elementId) 就好了。 <br /><br />通过对 prototype 源码的研究，我想我对javascript又有了一点新的体会，而最大的体会就是 <a class="postlink" href="http://www.adaptivepath.com/publications/essays/archives/000385.php" target="_blank"><font color="#002c99">《Ajax : A New Approach to Web Applications》</font></a>文章最后作者对设计人员的建议：　to forget what we think we know about the limitations of the Web, and begin to imagine a wider, richer range of possibilities.</span>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/54741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-23 17:26 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/23/54741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype.js学习(转)</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54711.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 23 Jun 2006 08:34:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54711.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/54711.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54711.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/54711.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/54711.html</trackback:ping><description><![CDATA[
		<div style="CLEAR: right">Prototype.js作为javascript的成功的开源框架，封装了很多好用的功能，虽然官方没提供什么文档，不过在google上一搜，好多相关的文档，不过在学习使用的过程中还是碰到了一些问题，希望熟悉的朋友能多加指点，对于prototype.js学习我关注这么几点，同时针对每点也讲讲学习的结果和碰到的问题，^_^<br />1、类的创建<br />      prototype.js已经封装好了，这个很简单。<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> Person</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Class.create();</span></div>      这样就创建了一个Person类，这个Person类必须提供initialize方法的实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Person.prototype</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_17_84_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_17_84_Open_Text"><span style="COLOR: #000000">{<br />                 initialize:</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_57_76_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_57_76_Open_Text"><span style="COLOR: #000000">{<br />                 }</span></span><span style="COLOR: #000000"><br />      }</span></span><span style="COLOR: #000000">;</span></div>      对比java，Class.create相当于Class.forName()，initialize相当于构造器，和java的构造器一样，可以自定义为带参数性质的。<br />      可以看到在使用这样的方式定义class后，它和javascript原来的通过function方式来定义一个类就有明确的区分了，在这种情况下我们就可以用Class.create来定义类，用function来直接定义函数。<br />      类通常还涉及静态成员(static性质的)和实例成员(需要实例化才可调用)的定义。<br />      在javascript中这点也非常容易:<br />      静态成员：   
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> Person</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_11_102_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_11_102_Open_Text"><span style="COLOR: #000000">{<br />                name:'person',<br />                getName:</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_78_94_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_78_94_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> 'person'}</span></span><span style="COLOR: #000000"><br />      }</span></span><span style="COLOR: #000000">;</span></div>      实例成员：     
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Person.prototype</span><span style="COLOR: #000000">=</span><span id="Codehighlighter1_17_89_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_17_89_Open_Text"><span style="COLOR: #000000">{<br />               childname:'child',<br />               eat:</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()<br />      }</span></span></div>      上面的Person.getName是可以直接这么调用的，但eat方法则需通过var person=new Person();person.eat();的方式来调用。<br />2、类的继承<br />      类的继承其实javascript本身就支持的，不过prototype提供了一种另外的方法。<br />      按照javascript的支持的实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> Student</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Class.create();<br />      Student.prototype</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Person();</span></div>      这样就实现了Student继承至Person。<br />      在使用prototype的情况下可以这么实现：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> Student</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Class.create();<br />      Object.extend(Student.prototype,Person.prototype);</span></div>      子类要增加方法时可使用  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Student.prototype.study</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_34_35_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_34_35_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;</span></div>      或  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Object.extend(Student.prototype,</span><span id="Codehighlighter1_32_178_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_32_178_Open_Text"><span style="COLOR: #000000">{<br />           study:</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_117_118_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_117_118_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000"><br /> }</span></span><span style="COLOR: #000000">);</span></div>3、事件机制(对类方法执行的监听和观察)<br />      在事件机制上则碰到了一些疑惑，作为事件机制主要需要提供事件的定义，对于事件的监听以及对于事件的观察。<br />      在javascript中事件需要以on开头，也就是作为事件就需要采用onclick这样类似的命名：<br />      对上面的Student增加一个对外的事件，如：     
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Student.prototype.study</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_34_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_34_71_Open_Text"><span style="COLOR: #000000">{<br />             </span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.onstudy();<br />      }</span></span><span style="COLOR: #000000"><br />      Student.prototype.onstudy</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000">()</span><span id="Codehighlighter1_115_116_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_115_116_Open_Text"><span style="COLOR: #000000">{}</span></span><span style="COLOR: #000000">;</span></div>      这个onstudy就是交给相应的实例去实现的，例如实例采用这样的方式：  
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">      </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> studyThis()</span><span id="Codehighlighter1_26_65_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_26_65_Open_Text"><span style="COLOR: #000000">{<br />          alert(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">study this</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />      }</span></span><span style="COLOR: #000000"><br /><img src="http://www.crackj2ee.com/Article/UploadFiles/200603/20060316140129143.gif" align="top" />      </span><span style="COLOR: #0000ff">var</span><span style="COLOR: #000000"> student</span><span style="COLOR: #000000">=</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Student();<br /><img src="http://www.crackj2ee.com/Article/UploadFiles/200603/20060316140129143.gif" align="top" />      student.onstudy</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">studyThis();</span></div>      对于事件通常都希望进行监听和观察，根据prototype提供的bindAsEventListener以及Observe，这么进行了尝试：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.crackj2ee.com/Article/UploadFiles/200603/20060316140129143.gif" align="top" /><span style="COLOR: #000000">study.onstudy</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">watchStudy.bindAsEventListener(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">);<br />      </span><span style="COLOR: #0000ff">function</span><span style="COLOR: #000000"> watchStudy(event)</span><span id="Codehighlighter1_84_126_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"></span><span id="Codehighlighter1_84_126_Open_Text"><span style="COLOR: #000000">{<br />            alert(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">watch study</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />      }</span></span></div>      <font color="#ff0000">按照事件机制来说，在执行study的时候应该可以看到study this和watch study两个提示，但最后执行后只能看到watch study的提示，这是为什么呢？按照listener的概念的话，不应该覆盖原有方法的，不过我看了一下prototype.js的源代码，按照上面的编写方式确实会照成覆盖原方法。<br />      Observe是这么尝试的：<br />      Event.observe(study,'study',watchStudy,false);<br />      按照观察机制来说，应该在执行study的时候会看到两个提示，但最后执行后这行根本就没起到任何作用。<br />      这是为什么呢？</font><center></center></div>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/54711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-23 16:34 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/23/54711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Prototype(转)</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54706.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 23 Jun 2006 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54706.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/54706.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54706.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/54706.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/54706.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1. Prototype是什么?																																						或许你还没有用过它， prototype.js 是一个由Sam Stephenson写的JavaScript包。这个构思奇妙编写良好的一段兼容标准的一段代码将承担创造胖客户端， 高交互性WEB应用程序的重担。轻松加入Web 2.0特性。								如果你最近体...&nbsp;&nbsp;<a href='http://www.blogjava.net/chenleiyu/archive/2006/06/23/54706.html'>阅读全文</a><img src ="http://www.blogjava.net/chenleiyu/aggbug/54706.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-23 16:20 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/23/54706.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>眼睛想旅行 </title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54695.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 23 Jun 2006 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54695.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/54695.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/23/54695.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/54695.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/54695.html</trackback:ping><description><![CDATA[整天在写字楼里呆着 除了代码还是代码 人都要憋坏了
<embed id="MediaPlayer139" src="http://ok.haomtv.com/mtv0329mtv/0039.swf" width="480" height="360" type="video/x-ms-wmv" autostart="true" loop="false"><p></p></embed><img src ="http://www.blogjava.net/chenleiyu/aggbug/54695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-23 15:47 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/23/54695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>给你点感动!!!!!!!!!!!!</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/20/53959.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 20 Jun 2006 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/20/53959.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/53959.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/20/53959.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/53959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/53959.html</trackback:ping><description><![CDATA[
		<embed id="MediaPlayer139" src="http://www.91wan.cn/MTV_FILES/李延亮_如果我现在.wmv" width="480" height="360" type="video/x-ms-wmv" autostart="true" loop="false">
				<p>
				</p>
		</embed>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/53959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-20 13:03 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/20/53959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>周末买书去了</title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/19/53768.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Mon, 19 Jun 2006 05:58:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/19/53768.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/53768.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/19/53768.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/53768.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/53768.html</trackback:ping><description><![CDATA[&lt;&lt;Spring in Action&gt;&gt;<br />&lt;&lt;Core j2ee patterns&gt;&gt;<br />&lt;&lt;IT项目管理&gt;&gt;<br />&lt;&lt;UML与ROSE&gt;&gt;<br />不知道什么时间才能看完,呵呵 <br /><br />nano VS miniplayer<br />MD   除了NANO的价格比魅族贵点外 看不出那点还比Miniplayer强的<br />这个月还想买个数码相机玩玩 不能老是借同事的<br /><br />搬家~~~~搬家 吼吼 7月一号搬家 离现在这家公司更近了 站在阳台上就能看见 不过俺可是一直预谋着跳槽的 今天又有公司给我打电话了 推掉 又是让做工程师 TMD 怎么就没人发现我身上的管理才能那??呵呵<br />开玩笑了 等待机会中.........................<br /><br />OFFER少点也无所谓 给我一个转型的机会<br /><br />晚上下班了买零食去............<img src ="http://www.blogjava.net/chenleiyu/aggbug/53768.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-19 13:58 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/19/53768.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>感觉蛮失落的 </title><link>http://www.blogjava.net/chenleiyu/archive/2006/06/12/52212.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Mon, 12 Jun 2006 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/06/12/52212.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/52212.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/06/12/52212.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/52212.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/52212.html</trackback:ping><description><![CDATA[前几天去面试一家游戏公司的PM <br />等了几天 给我一句话:我太年轻 技术方面没问题 但是管理方法欠缺<br /><br />切 年龄能代表什么 再说了 我也不小了 <br />没眼光 发现不了我这块大金子<br />今天又在发烧 哎 倒霉到家了 现在身上还一阵阵地起鸡皮疙瘩 头象被锯开了一样<br /><br />感觉身子好虚 这就是几年程序做出来的结果 除了身体越来越差外 其他什么都没有<br />都说用青春在换金钱 MD 我怎么感觉我付出了青春也没得到金钱<br />程序员绝对是社会最低层  特别是做JAVA的 JAVA里特别是做WEB的<br />很不幸 偶就是里面的一员 不可否认的是我爱着我的JAVA  但现实可不容许你这样<br />没办法 !!!!!!!!!!!!!!!!<br /><img src ="http://www.blogjava.net/chenleiyu/aggbug/52212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-06-12 14:58 <a href="http://www.blogjava.net/chenleiyu/archive/2006/06/12/52212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>倔强</title><link>http://www.blogjava.net/chenleiyu/archive/2006/05/03/44438.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 03 May 2006 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/05/03/44438.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/44438.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/05/03/44438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/44438.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/44438.html</trackback:ping><description><![CDATA[你说被火烧过才能出现凤凰<br />我和我最后的倔强　握紧双手绝对不放<br />下一站是不是天堂　就算失望不能绝望<br /><img src ="http://www.blogjava.net/chenleiyu/aggbug/44438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-05-03 14:06 <a href="http://www.blogjava.net/chenleiyu/archive/2006/05/03/44438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>热血燃烧</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/27/43525.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Thu, 27 Apr 2006 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/27/43525.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/43525.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/27/43525.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/43525.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/43525.html</trackback:ping><description><![CDATA[这几天天天听这首歌曲，想起了以前上中学的时候，呵呵，就是这样子<br />整天打架斗殴，以为老子天下第一，以为凭自己的拳头就可以打出一片天来<br />害的老妈隔三差五就要到公安局领我，导致的结果是现在听见警车的声音就想跑，MD<br />头上 背上留下了永远的伤疤<br />现在回想那段荒唐的岁月，其实感觉那时候也蛮爽的，至少心灵是自由的<br />不知道以前的哥们现在都怎么样了，曾经也激烈地说道：不能同年同月生，但求同年同月死<br />喝的血酒 烧的黄纸，发誓一辈子一起闯天下，你们都还好吗？？快乐吗？？是否也象我一样在慢慢的麻木<br /><br /><bgsound src="http://ok.zly99.com/wmanihao/yingshi/guhuozai/0001/rxrs.wma" loop="3"></bgsound><img src ="http://www.blogjava.net/chenleiyu/aggbug/43525.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-27 12:46 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/27/43525.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转)真正爱你的男孩应该是这样的?还是...这样的?</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42812.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Mon, 24 Apr 2006 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42812.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/42812.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42812.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/42812.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/42812.html</trackback:ping><description><![CDATA[
		<font color="#000000">真正爱你的男孩，一下子说不出真正爱你的理由，只知道自己顾不上注意别人。<br /><br />真正爱你的男孩，其实总惹你生气，却发觉不了他到底做错了什么。<br /><br />真正爱你的男孩，很少当面赞美你，可是心里肯定你是他最棒的。<br /><br />真正爱你的男孩，会在你忘记回复他短信时狠狠地的说你一顿。<br /><br />真正爱你的男孩，只可能在你一个人的面前流眼泪，当你触摸到它们时，也触摸到了那颗只为你跳动的心。<br /><br />真正爱你的男孩，会默默地记住你不经意说过的话，在某时某刻重复它们。<br /><br />真正爱你的男孩，不会轻易做出承诺，因为他想让自己成为你心中说话最算话的男子汉，只想给你最可靠最安全的幸福。<br /><br />真正爱你的男孩，总告诉你不要胡思乱想，因为其实他在为你们谋划着最美丽真实的未来。同时让你无忧无虑地等待他要给你的惊喜。<br /><br />真正爱你的男孩，可能不像你一样清楚的记得某些纪念日，他觉得爱你是每时每刻的，并不是靠这几天简单的日子。<br /><br />真正爱你的男孩，不会轻易对你当面说“我爱你”，因为他为你做过的每件事都已经这么说了。除非在非常时刻，为了不让你无端地误解他。<br /><br />真正爱你的男孩，总觉得有些话只说一遍就够了，因为你已经了解他的心。说得多了，他会觉得不珍贵。<br /><br />真正爱你的男孩，如果他去机场接你，不会像你期望的那样捧着玫瑰大声叫“亲爱的”，只是自然的提过你的行李，然后想用眼睛抱紧你似的心疼地说，怎麽瘦得像豆芽菜了？<br /><br />真正爱你的男孩，当你发脾气时，只会不做声地听你把火发完，然后慢慢地说，你明天有课吗？早点睡吧。<br /><br />真正爱你的男孩，不懂当你生气挂掉电话后应该立即打来，过了若干小时后会发条短信问你消气了没有？如果你质问他为何这么久才打来，他会理直气壮地说，你生气时我的解释一定没有用，等你的火消了，我的解释才有效果。<br /><br />真正爱你的男孩，总是叫你小姑娘，可是每次他做什么重大的决定，却总想先听听你的建议。<br /><br />真正爱你的男孩，不喜欢玩具小毛熊，却一直把你送他的小熊放在床头。<br /><br />真正爱你的男孩，当和你发生争执时，总是控制不了地先妥协，先承认“我错了”，过后发来短信以“神经病”开头，以“宝贝”结尾。事实上你也清楚，这次是你有点无理取闹。<br /><br />真正爱你的男孩，很想很想你时，也会买玫瑰送你，傻傻地等着你，却不知道自己捧的是月季。没关系，他的心里送的是玫瑰。<br /><br />真正爱你的男孩，嘴巴都不甜，但是他的吻能传递他所有的热情。<br /><br />真正爱你的男孩，当听到你对他讲很“酸”的话时，他反而会装地很正经，其实心里很甜很甜。<br /><br />真正爱你的男孩，如果不能经常见到你，他会让自己忙碌起来，为了不去想你，因为他知道一想你将会一发不可收拾..........</font>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/42812.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-24 12:37 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/24/42812.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个人的天荒地老</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42777.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Mon, 24 Apr 2006 01:47:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42777.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/42777.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/24/42777.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/42777.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/42777.html</trackback:ping><description><![CDATA[我原以为我努力的对你好，尽量不提我们之间的敏感话题我们的关系就会稳定些。。。 最后，我才知道那都是我一相情愿的好，你最终认定的还是最开始的。我注
定不是你感情里的天使，我一个抱着酒想在一个人的夜里买醉。我听到，那晚，窗外的树落了一地的叶，就象我那晚的泪。也许从一开始我就选择了错误，我把幸
福当成了赌注，结果证明我输了，输的一踏糊涂。 就快到树叶落尽的时候了，我们的爱也要散了。回首走过的路，记忆里幸福的，痛苦的，该你的，该我的。到此
一笔勾销。原来牵着手走过的只有我一个人相信天荒地老<img src ="http://www.blogjava.net/chenleiyu/aggbug/42777.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-24 09:47 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/24/42777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>打击ED</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/22/42495.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Sat, 22 Apr 2006 07:46:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/22/42495.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/42495.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/22/42495.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/42495.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/42495.html</trackback:ping><description><![CDATA[好象是我错了？？？？？？？？？？呵呵<img src ="http://www.blogjava.net/chenleiyu/aggbug/42495.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-22 15:46 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/22/42495.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>她不知道</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/21/42311.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Fri, 21 Apr 2006 06:28:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/21/42311.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/42311.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/21/42311.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/42311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/42311.html</trackback:ping><description><![CDATA[她不知道，在我说分手的时候，脸色苍白的象我刚穿上的那件衬衣<br />她不知道，我不想她难受，不想她在夜里哭泣<br />她不知道，我能做的只有把自己的伤心埋在心里 微笑着对他说：以后我们还是好朋友<br />她不知道，在我跨出门口时有一滴泪水落了下来<br />她不知道，我回到家看到任何她留下的东西，总会让心里刀割一样难受<br />她不知道，我是让女孩宠着的，这一次我为她甚至放弃了自己的自尊<br />她不知道，我没在夜里两点前睡着过<br />她不知道，我现在每天要抽一包言<br />她不知道，她不知道，她不知道她已经耗尽了我所有的热情和勇气<br /><br /><br /><img src ="http://www.blogjava.net/chenleiyu/aggbug/42311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-21 14:28 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/21/42311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无题</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41980.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 19 Apr 2006 10:27:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41980.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/41980.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/41980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/41980.html</trackback:ping><description><![CDATA[
		<font face="Garamond" size="6">天堂向左 地狱向右<br />你选择了放弃 我选择了逃避<br />我们永远不会再有下一次交点</font>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/41980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-19 18:27 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/19/41980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>爱人好累</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41817.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 19 Apr 2006 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41817.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/41817.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41817.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/41817.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/41817.html</trackback:ping><description><![CDATA[
		<font size="5">
像迷路在荒野<br />星星也没有出现<br />夜太黑看不见明天<br /><br />你坚决想挥别<br />除了抱歉其他全省略<br />甚至我问理由都被拒绝<br /><br />我拉着你望着你欲哭无泪<br />你淡淡的冷冷的那么绝对<br />话越说越让自己显得狼狈<br />人何苦要爱到自尊都被摧毁<br />抬头看低头想欲哭无泪<br />你飘的心散的发在风中飞<br />我忽然间放开手再无所谓<br />跌坐在街头觉得爱人好累</font>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/41817.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-19 10:07 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/19/41817.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>梦呓</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41806.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Wed, 19 Apr 2006 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41806.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/41806.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/19/41806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/41806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/41806.html</trackback:ping><description><![CDATA[梦呓<img src ="http://www.blogjava.net/chenleiyu/aggbug/41806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-19 09:06 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/19/41806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>约定</title><link>http://www.blogjava.net/chenleiyu/archive/2006/04/18/41646.html</link><dc:creator>挚爱.NET 情人J2EE</dc:creator><author>挚爱.NET 情人J2EE</author><pubDate>Tue, 18 Apr 2006 06:35:00 GMT</pubDate><guid>http://www.blogjava.net/chenleiyu/archive/2006/04/18/41646.html</guid><wfw:comment>http://www.blogjava.net/chenleiyu/comments/41646.html</wfw:comment><comments>http://www.blogjava.net/chenleiyu/archive/2006/04/18/41646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenleiyu/comments/commentRss/41646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenleiyu/services/trackbacks/41646.html</trackback:ping><description><![CDATA[
		<embed id="MediaPlayer139" src="http://www.yangfan.org/mtv/yueding.rm" type="video/x-ms-wmv" loop="false" autostart="true" height="360" width="480">
				<p>
				</p>
		</embed>
<img src ="http://www.blogjava.net/chenleiyu/aggbug/41646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenleiyu/" target="_blank">挚爱.NET 情人J2EE</a> 2006-04-18 14:35 <a href="http://www.blogjava.net/chenleiyu/archive/2006/04/18/41646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>