<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>rocket</title>
    <description>欢快的走在敏捷的小道上
agile分享群：59765983    
敏捷项目实践经验分享
TDD，重构，迭代，结对 </description>
    <link>http://rocket.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>DEV2DEV TECHDAYS SOA 体会二</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/196303" style="color:red;">http://rocket.javaeye.com/blog/196303</a>&nbsp;
          发表时间: 2008年05月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="background-color: #cce8cf;">面向服务的8个原则<br />服务可复用 不管是否存在即时复用的机会，服务被设计为支持潜在可复用。<br />服务共享一个正式契约 为了与服务交互，只需要共享描述每个服务信息交换术语定义的正式契约。<br />服务是松散耦合的 服务被设计为无需紧密的、跨服务的依赖而交互。<br />服务是底层逻辑的抽象 只有经由服务契约所暴露的部分服务对于外部世界是可见的。契约之外所表达的底层逻辑是不可见的，且与服务请求者无关。<br />服务是可组合的 服务可能组合其他服务。这允许表示不同粒度的逻辑，并促进复用及抽象层的创建。<br />服务是自治的 逻辑由服务所控制，并位于一个清晰的边界内。服务已经在这个边界内被控制，并且不依赖于执行其控制的其他服务。<br />服务是无状态的 服务应当不需要管理状态信息，因此能够其维持松耦合性。服务应当尽可能设计成无状态的，即便这意味着要将状态管理移至别处。<br />服务是可发现的 服务应当允许其描述被发现，并被人工和可能会利用其逻辑的服务请求者所理解。<br />这个8个面向服务的原则乍看很像我们熟悉的OOP啊，不过如果你把一个服务抽象成一个对象来看的话也就不难理解了。<br />下面介绍一下依据这8个原则构建的SOA的各个服务层： <br />1、连通性服务层<br />所谓的连通性是指对于原有系统的数据连通，由于原有系统不能提供一个具有通用性的数据服务，所以在连通性服务层的主要任务就是负责把原来已有的JDBC的，EJB的，webService的各种数据服务，封装成具有统一标准的java pojo控件，然后其它的就可以方便，简单的实现对数据服务的调用。<br />连通性服务层：<br />服务对象：需要获得数据的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如业务层、表示层等<br />提供服务：可以操作原有系统的数据层&nbsp;&nbsp; 如对一个sap服务器进行操作、对一个DB服务器进行操作邓<br />调用资源：原有系统的数据服务接口&nbsp;&nbsp;&nbsp;&nbsp; 如EJB、Hibernate，JDBC等<br />图1：<img src="http://www.blogjava.net/images/blogjava_net/rocket/ConnectService.png" border="0" height="326" alt="" style="border: 0;" width="425" /><br />在这里值得一提的是bea在使用workshop对于连通性服务层创建，非常简单，完全图形化的方式，只需简单的鼠标拖曳，就可以实现服务控件的建立。<br />2、业务流程服务层<br />我们知道一般的业务系统都会有一些自由的业务流程的，那么如何让这些原有的业务流程来提供给SOA系统使用呢？<br />在bea专家给我们演示的demo中，我看到bea的做法是把每一个流程节点封装成了服务，这样，这些流程节点每个都可以成为一个向外提供服务的服务者了。<br />业务流程服务层：<br />服务对象：需要流程控制的对象&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如其他业务层，表示层等<br />提供服务：业务流程控制&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如从a入口进入后是应该去b节点还是应该去c节点<br />调用资源：通常是连通性服务层的服务&nbsp;&nbsp; <br />图2：<img src="http://www.blogjava.net/images/blogjava_net/rocket/BusinessBus.png" border="0" height="448" alt="" style="border: 0px;" width="597" /><br />在bea演示的时候对于业务流程服务层的构建依然采用的是图形化的方式，这里值得称道的是在使用图形化的过程中，bea的工具还可以支持对于服务的格式转换<br />3、服务中介层&nbsp;&nbsp; <br />上面已经介绍了两种服务层了，在soa中这两层的调用不是简单的上下层关系。在实际项目中，也许有的需求是需要流程控制的，但是也许有些需求是直接要求展示数据的，那么如何处理这两种的需求呢。这里就是在soa中最重要的一个层了，服务中介层。很多人应该听过soa中service bus这个概念。我之前一直理解为服务总线仅仅是为客户端提供服务的，其实是不对的，实际上服务总线是一个用了穿起来各个服务层的，就好比是一个糖葫芦，服务中介层就是中间的那根棍子。<br />图3：<img src="http://www.blogjava.net/images/blogjava_net/rocket/serviceBus.png" border="0" height="338" alt="" style="border: 0;" width="725" /><br />做为服务中介层来说，主要有两种服务，一种是应用服务；另外一个是代理服务，用来对应用服务进行代理封装的，是服务总线中向外暴露的服务。<br />4、表示层服务层<br />表示层服务主要和不同的客户端有关，bea在这里的讲述中由于时间紧张所以比较简单。重点还是在演示他们可视化得页面编辑。但是这里有点给我洗脑得就是，对于不同的客户端所提供的服务是直接可以使用的，比如判断一个用户名是否合法，表示层服务不是返回的true，false，而是直接返回，&ldquo;该用户名可用&rdquo;，&ldquo;该用户名已被占用&rdquo;这样的字符串。<br />关于表示层我就不再画图了，最后是一个整体的soa层次结构图：<br /><img src="http://www.blogjava.net/images/blogjava_net/rocket/SOA.jpg" border="0" height="600" alt="" style="border: 0;" width="594" /><br /></span></p>
<p><span style="background-color: #cce8cf;"><br /></span>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/196303#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 24 May 2008 09:28:40 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/196303</link>
        <guid>http://rocket.javaeye.com/blog/196303</guid>
      </item>
      <item>
        <title>DEV2DEV TECHDAYS SOA 体会一</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/195987" style="color:red;">http://rocket.javaeye.com/blog/195987</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          首先先说一些闲话：这次bea的dev2dev techDays依然是在讲现在bea公司的主攻领域soa，估计这也是oracle之所以收购bea的一个原因吧。<br />会议的地点依然是每次雷打不动的圣庭苑酒店，会议的主办方也组织的很好，为了能让参与者对bea的相关技术和产品感兴趣，bea也是准备了丰富的奖品，有笔，有T恤，还有5个workshop的licence，最引人注目就是最后抽奖的一个iphone，做为一个免费会议来说，这些东西却是很丰富了，但是要是考虑到bea主要是为了推它的SOA产品Workshop 10.2这个售价高达1000多美元的怪物来说，也就不觉得贵了：）。<br />1、SOA起源<br />这些年为了提高办公效率，企业和政府都在努力追求着一个看似很甜的棒棒糖：信息化。但是由于信息化的方式多种多样，这样就造成了在一个企业内部有多套信息化的系统。财务是买来的财务软件，行政使用免费的行政软件，销售是请人来研发的销售系统。然后各个部门发现，原来自己虽然信息化了，但是实际上只是一个信息孤井，自己的信息系统没有办法接受别的部门的信息，而自己的信息也没有办法传递到其他部门去。这样公司的领导就不高兴了，你们都要信息化，无纸办公，结果现在信息化的比优质办公还麻烦，都给我统统统一起来。开始的时候有人想到重做一套整体的信息系统，把所有部门都包含进去不就可以了，但是这方案代价太高了。于是呢就有人提出了这样的想法，其实每个系统都是为每个部门或者其他部门提供服务的，那么我们就把这些服务给抽象出来进行统一管理吧，然后让所有的部门都只面对这些抽取的服务，而不是单一的系统，这样soa的概念就渐渐浮出水面了。<br />2、服务的概念，以及SOA基本架构<br />SOA中最核心的就是服务了，所以我们首先应该明确一下服务这个概念。用毛主席最经典的一句话：为人民服务。这里我们可以看出，抽象的服务概念有两个基本的要素：1是服务对象，2是可以提供什么。超市收银员的服务对象是顾客，可以提供的是算钱收钱；公安局的服务对象是市民，可以提供的是解决你解决不了的难题。；你的心脏的服务对象是血液，可以提供的是给血液加养分；等等。所以来说任何一个对象都是一个服务提供者（当然任何一个对象也将是一个服务接受者，对于服务接受这里不再详细讨论）。<br />根据一个信息系统本身固有的几个层次为了让各个层次的职责更加清晰，而且也是为了在调用服务的时候更加统一SOA的一个基本架构是这样的：<br />      原有系统架构                                      SOA系统架构<br />企业原有业务系统的存储层   --〉    [把这层封装成SOA的连通服务层]                 <br />   <br />企业原有业务系统的业务层   --〉    [把这层封装成SOA的业务流程服务层]<br /><br />企业原有业务系统的应用层   --〉    [根据上层抽象出来的统一服务进行调用并在各种应用前台]<br /><br />然后专门隔离出来一个服务中介层，也就是一条服务总线来把所有的服务进行统一管理
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/195987#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 May 2008 12:23:08 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/195987</link>
        <guid>http://rocket.javaeye.com/blog/195987</guid>
      </item>
      <item>
        <title>求喜欢敏捷的java贤才</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/165224" style="color:red;">http://rocket.javaeye.com/blog/165224</a>&nbsp;
          发表时间: 2008年02月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近在人才网上面试的人都不是很理想，所以打算在各个技术社区淘淘高手<br /><br />我们公司是《深圳得实信息科技有限公司》，是一家制作网络教育相关软件的成长型公司。<br />我们可以提供别墅办公环境，让你远离高楼城市的喧嚣，当你写代码累了时，出了办公室的门就可以呼吸到南山的新鲜空气。<br />我们有舒适的开发气氛，团结的团队加上轻松的敏捷方法，让你感受到开发是一种乐趣而不会厌倦。<br />我们拥抱创新，我们最喜欢有新点子的程序员了，你的新点子就是我们最大的财富。<br />而且我们还将给开发人员提供培训学习的机会，我们认为只要每个人成长了才是团队的成长，公司的成长。<br />如果你喜欢敏捷，对敏捷开发有兴趣，但是现实中苦于实践比较困难，那么加入我们你将会和团队一起在敏捷的道路上成长。<br />薪资待遇上我们将提供业内具有竞争力的薪资，以及伴随公司发展的奖金等福利待遇。<br /><br /><br />Java程序员<br />1、大学本科及以上学历，计算机相关专业优先；　<br />2、具有3年以上的Java应用开发经验；具有2年以上Java应用的设计经验；具有3-5年OO环境开发经历；<br />3、精通Java语言，熟练掌握面向对象的开发方法。；<br />4、熟悉j2ee主流技术，以及各种主流开源框架，熟悉的技术越多将越有优势；<br />5、熟练掌握SQL Server、Oracle、DB2至少其中一种数据库，能独立书写相关的DDL和DML，以及存储过程和性能配置；<br />6、具有较强的学习、分析问题解决问题的能力；<br />7、具有良好的团队合作精神和与人沟通的能力；<br />8、具有良好的英语读写能力；<br />9、有大型项目开发经验者优先。<br />10、熟悉敏捷开发方法者优先。<br /><br /><br />软件架构设计师<br />1、精通 JAVA 语言，精通 J2EE 下的主流技术，有三年以上编程经验,负责系统设计，包括架构设计、详细设计及文档编写。<br />2、精通 UML、OOP、设计模式 和 软件架构 。<br />3、有两年以上 J2EE 应用系统的分析设计经验,核心代码编写并指导程序员编写代码。<br />4、有两年以上项目管理经验，具有3年以上分析、设计经验。<br />5、新技术及技术难点的攻关、研究,有三年以上大型项目开发和管理经验者优先。<br />6、有较强的沟通能力。乐于接受挑战，具有团队精神和领导能力。<br />7、具有良好的英语读写能力。<br />8、熟悉敏捷分析设计方法者优先。<br /><br />觉得适合要求的高手请发简历到：hr@dascom.cn，我们会尽快安排面试的时间
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/165224#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 26 Feb 2008 17:37:13 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/165224</link>
        <guid>http://rocket.javaeye.com/blog/165224</guid>
      </item>
      <item>
        <title>敏捷项目实践步骤</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/163772" style="color:red;">http://rocket.javaeye.com/blog/163772</a>&nbsp;
          发表时间: 2008年02月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">一、根据发布目标分析需求，把需求分析成独立的故事，初步的分析可以是粗略的，随着需求的不断深入刻意对故事进行整合或者切割。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">要注意的是分析出来的需求尽量在发布目标的范围之内，超出发布目标的需求应该尽量避免过深分析。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">所谓的发布目标是确定了这个版本可以让用户满意的条件。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">故事模式：做为（用户角色），我可以（做什么），以便（业务价值）。后面的业务价值在比较简单或者大家都比较明确的时候刻意不需要注明。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队实践推行方法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段<span>,</span>这个分析工作开始由<span>PM</span>进行收集，整理和分析。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段<span>,</span>当大家都为用户故事的方式接受以后，采用需求讨论的方式来明确和分析用户故事。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">二、对分析的故事进行相对估计，估计出来的故事点是对用户故事和复杂度的无单位估计值，使用的数值大小本身没有绝对意义，只有相对于其他故事规模的相对意义。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">比如，用户登录这个用户故事的估计值是<span>2</span>，那么做为同等开发规模的用户推出，这个用户故事的估计只也因该是<span>2</span>。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队实践推行方法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，这个估计的工作暂时由ｐｍ来负责完成，但是由于一个人的估计肯定会有偏差，所以在估计完成之后需要进行调查来进行修正</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，用估计扑克会议来统一的对用户故事进行估计，当主持人拿出一个新的用户故事之后，大家给出自己对这个故事使用扑克打分，然后取出平均值，对差异较大的估计值要给出解释，来消除对用户故事的错误理解。估计扑克会议的实践不超过１个小时。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">三、准备产品调查，对用户故事进行功能存在，和功能缺失性的产品调查，然后根据调查结果对用户故事进行划分，划分成３类，基本需求，线性需求，线性需求。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">此外还有反对的需求，存在疑问的需求，无所谓的需求３种类型的需求，这些需求将根据进一步的发展进行确认。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，由ｐｍ发出调查问卷在参与到项目的开发团队，测试团队，技术支持团队来进行调查，然后汇总答案根据存在问题和缺失问题的答案，对用户故事进行定性</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，由ｐｍ发出调查问卷扩展到相关的用户群体中进行调查，然后汇总答案根据存在问题和缺失问题的答案，对用户故事进行定性</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">四、确定发布规划，首先要确定的是迭代周期的长度，以周为单位，然后估计出每个迭代周期团队的速度。然后可以从用户故事池中选择出合适的用户故事来填充到第一次和第二次的迭代周期中。其余的暂时可以先不用填充，随着每次迭代周期的完成来对发布计划进行更新。最后根据估计的速度和需要开发的故事来确定需要几个迭代周期，并最终有几个迭代周期来确定需要开发的时间周期。发布计划可以以功能来驱动进行，也可以以日期来驱动进行。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">发布规划的特点，以月做为时间范围，规划对象是用户故事，估计的单位是故事点</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，使用<span>1</span>周做为迭代周期，开始时团队速度使用估计的方式做出简单估计，根据每个周期结束后的团队速度再进行发布计划的调成。迭代周期内用户故事的完成暂时以开发完成做为标准。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，使用<span>2</span>周做为迭代周期，可以使用原有的历史速度做为团队速度，多出的一周时间做为测试修复时间，迭代周期内用户故事的完成以测试完成，完整的功能提交做为标准，并在开发过程中熟练使用单元测试来进行确保功能的完整完成。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">五、确定迭代规划，根据填充到迭代周期内的用户故事来分解成工作任务，工作任务包括设计工作，不同层次的开发工作，调试工作和测试工作等等具体的任务，然后对任务进行估计，这时候估计的单位以理想工作小时做为单位。比如，设计需要两个人小时，开发持久层需要<span>1</span>个人小时，调试持久层需要半个人小时，开发业务层需要<span>2</span>个人小时，调试中间层需要<span>1</span>个小时等等。。。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">然后根据每个故事的人小时和这个迭代周期内参与的人数，以及每个人所能参与的实际有效时间（注意有效时间约为每天<span>6</span>小时，需要考虑到会议，讨论，头脑休息等非理想工作时间）来判断这个迭代周期的填充是否足够，如果不够则再加入一个用户故事，如果超出则移出一个用户故事到下一个迭代周期中。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代规划的特点，以周做为时间范围，规划对象是工作任务，估计的单位是理想小时</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，使用速度驱动的方法来进行迭代规划，即确定了本次迭代的速度，然后选择用户故事扩展成任务，对任务进行估计。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，使用承诺驱动的方法来进行迭代规划，即提出一个故事，把故事扩展成任务，对任务进行估计，让小组承诺是否可以完成这个故事，如果可以在迭代周期内完成则加入这个故事，如果不能完成则推迟到下一个迭代走起。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">六、迭代开始，在迭代开始时召开迭代启动会，分配迭代周期内的用户故事和工作任务到个人，每个工作任务必须精确到个人，同一个用户故事的不同工作任务可以根据情况适当分配给不同的人来完成。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，任务分配给个人，通常一个故事的任务分配给同一个人。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，任务分配给结对，通常一个故事的任务分配给同一个结对。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">七、迭代进行，每日早对昨日完成的工作任务和问题进行汇报，并且同时计划今天需要完成的工作任务，对于迭代过程中的进度和问题进行及时的观察和调整，要求每个人完成某个任务之后要及时的告知整个小组知道（<span>qq</span>群的方式最为快捷）。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，由<span>pm</span>及时地对当日工作进行询问。并负责把遇到的问题跑出来进行解决。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，小组成员主动地对已经完成的任务进行汇报，并及时把自己遇到的问题抛出来。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">八、迭代结束，确认本次迭代完成的用户故事，对于完成一部分的用户故事计算到下一次迭代中。并对本次迭代的过程资产进行总结，形成<span>FAQ</span>方式的文档进行规整。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">同时根据新的需求情况，资源情况，已完成功能的回馈，以及开发中遭遇的不确定性问题，对发布规划和迭代规划作出调整。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">当前团队的实践推行办法：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段，使用学习网站，或者博客等方式对经验进行记录。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段，使用完善的<span>skills</span>对经验进行记录，可以方便的组织成培训文档，并方便的进行搜索，查找。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">九、迭代测试，为了保证用户功能完整的提交，每个用户故事开发完成之后都要对该用户故事进行测试，然后在针对开发中出现的问题进行修复，以便完整的完成一个用户故事。</span></p><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第一阶段：测试迭代周期和开发迭代周期分开。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">每次迭代开始阶段由ｐｍ告知开发组需要开发的和修复的的用户故事，同时告知测试组本次迭代需要测试的故事，需要准备的故事，需要复测的故事。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">并在分配任务时，把修复故事的工作规划到本次迭代中来。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">每次开发完成的用户故事点算作本次迭代的速度</span></p><table class="MsoNormalTable" cellspacing="0" border="1" style="margin-left: 0.75pt; border-collapse: collapse; border: medium none" cellpadding="0"><tbody><tr><td valign="top" style="width: 37.1pt; border: windowtext 1pt solid; padding: 0.75pt" width="49"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 67.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="90"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代１</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 65.3pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="87"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代２</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 66.7pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="89"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代３</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 69.8pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="93"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 88.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="118"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代５</span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: windowtext 1pt solid; width: 37.1pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="49"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 67.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="90"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事１，２</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 65.3pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="87"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试故事１，２</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 66.7pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="89"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试故事３，４</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事５，６</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 69.8pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="93"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">复测故事１，２</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试故事５，６</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事７，８</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 88.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="118"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">复测故事３，４</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试故事７，８</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事９，１０</span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: windowtext 1pt solid; width: 37.1pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="49"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 67.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="90"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事１，２</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 65.3pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="87"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 66.7pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="89"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">修复故事１，２</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事５，６</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 69.8pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="93"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">修复故事３，４</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事７，８</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 88.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="118"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">修复故事５，６</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事９，１０</span></p></td></tr></tbody></table><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">第二阶段：测试迭代周期和开发迭代周期合并。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">每次迭代开始阶段由ｐｍ告知开发组需要开发的故事，同时这些故事也是测试组需要准备测试的故事。要求这些故事分解的工作任务中要包括测试工作和修复工作。</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">每次测试完成的用户故事点算作本次迭代的速度</span></p><table class="MsoNormalTable" cellspacing="0" border="1" style="margin-left: 0.75pt; border-collapse: collapse; border: medium none" cellpadding="0"><tbody><tr><td valign="top" style="width: 37.1pt; border: windowtext 1pt solid; padding: 0.75pt" width="49"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: windowtext 1pt solid; border-left: medium none; width: 319.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="426" colspan="3"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">迭代Ｘ</span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: windowtext 1pt solid; width: 37.1pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="49"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 109.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="146"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">准备故事１，２，３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 104.3pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="139"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">测试故事１，２，３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 105.7pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="141"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">复测故事１，２，３，４</span></p></td></tr><tr><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: windowtext 1pt solid; width: 37.1pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="49"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 109.5pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="146"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">开发故事１，２，３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 104.3pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="139"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">修复故事１，２，３，４</span></p></td><td valign="top" style="border-right: windowtext 1pt solid; border-top: medium none; border-left: medium none; width: 105.7pt; border-bottom: windowtext 1pt solid; padding: 0.75pt" width="141"><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">完成故事１，２，３，４</span></p></td></tr></tbody></table><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">&nbsp;</span> <p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">十、发布结束，对本次发布中完成的用户故事进行会议总结：</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">１确定最终完成的用户故事，以及花费的迭代周期</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">２通过计算得到一个团队的人平均速度，这个速度做为下次发布规划的参考</span></p><p class="MsoNormal" align="left" style="line-height: 150%; text-align: left"><span style="font-size: 9pt; color: black; line-height: 150%; font-family: 宋体">３分析哪些用户故事的估计出现了失误，以及出现失误的原因是什么。</span></p><p class="MsoNormal"><span style="font-size: 9pt; color: black; font-family: 宋体">４最初的发布版本在市场上有了初步反馈信息之后，可以延长１个迭代周期用来做为发布版本的反馈收尾。</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/163772#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Feb 2008 17:32:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/163772</link>
        <guid>http://rocket.javaeye.com/blog/163772</guid>
      </item>
      <item>
        <title>一个堆积木的算法题，比较有意思，欢迎大家讨论</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/128769" style="color:red;">http://rocket.javaeye.com/blog/128769</a>&nbsp;
          发表时间: 2007年10月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>问题的来源是帮一个朋友改数据库，要求是这样的，60个题目，总分是100分，正确答案的分值有2分的 1.5分，其中分值的排列关系是随机的，请问如何设置答对题目，使得答题总分刚好为一个数值，如82分<br />
我的解决办法是：<br />
用一个集合记录判断是正确的2分题，当发现期望总分和当前累加总分差值小于1.5时，因为最小单位是1.5，在2分集合中退出一个正确的2分，然后继续遍历下去<br />
虽然后来用上面办法解决了这个问题，但是我觉得这个问题的解法不够通用，有很多问题，对这个问题扩展了一下，大家一起讨论一下<br />
一维的：和上面的题目一样。用变量来描述一下这个问题<br />
有m个元素，其中每个元素有1个value值，o<value></value>,value的取值有x，y，z...,按照value值m个元素排列是随机的，问如何用一次遍历m，而得到n个元素，这n个元素的value总和是W<br />
二维的：其实就是俄罗斯方块了，大家想象我们玩的俄罗斯方块是不是这个道理<br />
有m个元素，其中每个元素有1个value值对，o,value的取值有x，y，z...，按照value值m个元素排列是随机的，问如何用一次遍历m，而得到n个元素，这n个元素的value中，v1<br />
的总和乘以v2的总和是W<br />
n维的：不知道用什么现实中的情况来描述了<br />
有m个元素，其中每个元素有1个value值对，o,value的取值有x，y，z...，按照value值m个元素排列是随机的，问如何用一次遍历m，而得到n个元素，这n个元素的value中，v1<br />
的总和乘以v2的总和乘以v3的总和...一直乘到vn的总和是W</p>
<p><br />
呵呵，也许是我孤陋寡闻，上面这个题可能早有算法了，希望知道的朋友能告诉我一声：）</p>
<img src="http://www.blogjava.net/rocket/aggbug/150172.html" height="1" alt="" width="1" /><br />
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/128769#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 02 Oct 2007 05:13:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/128769</link>
        <guid>http://rocket.javaeye.com/blog/128769</guid>
      </item>
      <item>
        <title>TDD:mock还是build</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/123440" style="color:red;">http://rocket.javaeye.com/blog/123440</a>&nbsp;
          发表时间: 2007年09月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">
<p>记得我以前写过一个文章是有关于4层web结构单元测试的，今天打算对TDD的环境问题重新讨论一下。<br />
</p>
<p>我当时的4层结构的单元测试时间上是从DAO到Service到Action再到JSP一种渐进测试，但是的想法是，先测DAO，那么Service对DAO的调用就有保证了，测试了Service，那么action调用service就有保证了。。。这样一层一层下来，我每层测试的目标也就达到了。这里其实我用了一个技巧，就是通过测试的顺序，来逐渐的构建了每层测试所需的外部环境。当然从这个角度来看，我当时使用的方法更贴近于集成测试了。</p>
&nbsp;
<p>一般做TDD的时候最大的问题就是如何处理外部环境，这一般包括本身业务逻辑环境和技术框架环境。</p>
&nbsp;
<p>在当前这个新项目中，我首先尝试对一个具体渲染器的测试方式就是用mock，这里用的是比较好用的easyMock。开始的时候觉得mock的方法很好用，但是当我发现我的待测方法中有多个需要mock的对象时（a.getX();b.getY();c.getZ()）或者一个mock对象要通过多次级联获取时（如 a.getB().getC().getD().getE()）就会发现mock的代价让你高到很不原意mock的地步。 </p>
&nbsp;
<p>而且当我们的框架却制造了一个让我无法逾越的障碍，就是我们对于manager（DAO）的调用都是用一个类的静态方法封装管理（比较奇怪为什么不用spring来进行管理呢）。这样静态方法就没法mock了，于是乎，要想测试就要采用build的方法了，就是你可以在你的testCase中事先通过已经实现好的DAO方法把需要使用到的业务对象真实的build出来，这样你就可以知道你的被测方法中通过dao调用到的数据究竟是什么了，于是就可以对你期望获得的结果和经过实际方法得到的结果进行对比验证了。<br />
&nbsp; 看起来好像也是比较方便，但是实际上当你待测对象的业务模型，依赖于3-4级以上的相关模型时，你就会感觉到，这样build是一个代价非常高的事情。这种代价通常会让开发者丧失对TDD的兴趣了。</p>
&nbsp;
<p>我发现其实在测试的时候我更加关注的是业务数据的build，而系统架构通常是服务于业务的。所以我就开始考虑，能否有个方法构建出最基本需要的业务模型数据呢。查阅了一些网上工具，发现没有能够满足我当前需求（kodo做持久层，还有我们自己研发的知识引擎），于是就自己简单做了一个InitialTestObject，想法很简单就是通过一个xml文件然后根据已知的业务模型结构定义好数据，然后根据固定的规则初始化好业务数据，并且存放到一个map中去（方法比较简单我就不列出源码了），然后再使用时把初始化放到setUp中去，这样在测试的时候就可以根据你的需要直接从map中获取到一个实际的业务对象用于测试的时候使用了，最后记得要在测试完成后要在tearDown中清除初始化的数据。这样处理后我发现在测试时就感觉到很方便了，用到什么直接从map中取就可以了。</p>
&nbsp;
<p>也许有人会说这样做不还是是集成测试了吗，你build的时候需要数据库、持久层啊什么的，这里我不想来争论究竟是属于单元测试还是集成测试，因为它属于什么对于我们的功能来说是没有意义。无论什么测试的最终目标就是让我们的功能可用。</p>
&nbsp;
<p>至于构建环境的实现我只是给出了一个对于我当前项目代价最小的方法，其实如果你的项目不是使用静态方法的话，可以考虑构建一个完全mock的环境这样就可以称之为单元测试了。<br />
&nbsp; 而且对于这个InitialTestObject我觉得可以做成一个开源的小工具，支持各种不同的持久层（jdo，hibernate），然后根据我们定义的持久层模型做为我们的业务规则，就不需要自己编写具体的初始化规则代码了，你只需要写xml数据并指定好对应的持久层模型，希望大家可以对这个想法对提提建议，也许已经有人做了，那我就不做重复功了。</p>
&nbsp;
<p>下篇预告：think in refactor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间：待定</p>
</font>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/123440#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 13 Sep 2007 00:40:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/123440</link>
        <guid>http://rocket.javaeye.com/blog/123440</guid>
      </item>
      <item>
        <title>mingle使用小记--agile项目管理工具</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/122998" style="color:red;">http://rocket.javaeye.com/blog/122998</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>这篇文章不是用来讲mingle的使用方法的，是来发表使用mingle一个月的使用感受。<br />
由于mingle的操作十分简单，方便，有兴趣的同学可以自己下载一个并可以参考官网的flash。<br />
官网地址：http://studios.thoughtworks.com/mingle-project-intelligence</p>
<p>基本感受：<br />
Anything is card!所有操作都是基于卡片的，也就是说一个项目的基本构成单位就是story card，而基于这些卡片方便的展示、管理、统计都是很方便的。</p>
<p>优点：<br />
1、操作简单，修改属性，拖曳卡片，过滤查找，都是几个简单动作就可以完成的，而且由于大量的使用ajax，用户感受很好<br />
2、项目自定义性强，可以针对卡片添加你想要控制的任何信息，这样由于不同的项目就会有各自不同的主要关注点，你就可以把主要精力集中在相应的关注点。这样就不会所有项目都是千篇一律的属性，而实际上很多属性都是对于当前项目无用的信息（MS的project虽然强大，但是我却很不喜欢用它）。这是很 agile的做法，需要什么才用什么。<br />
3、项目模式的重用，可以把当前项目的模板导出做为一个case来提供给另一个项目参考，或者可以直接重用。这样就实现了部分项目经验的传递与共享。<br />
4、可以把你最期望关注的定制过滤条件使用固定的view展示出来，比如说我当前关注是5.5版本的卡片信息，就可以直接定制成一个tab view让每个访问者都看到<br />
5、grid的展示方式让你了解卡片更加直观，比如我现在想知道当前迭代周期内每个人的卡片状态，就可以使用grid的方式来展现<br />
<img src="http://www.blogjava.net/images/blogjava_net/rocket/mingle.JPG" border="0" alt="" /><br />
</p>
<p>6、通过简单的mql语句可以订制你需要统计的基本图形。</p>
<p>一些缺点：<br />
1、内存恐怖，之所以用恐怖这个词是因为确实很难想象一个安装文件只有几十m的安装文件运行起来就吃了我400m内存（都是ruby惹的祸），而且还是访问用户只有1-2个的情况下，要不是我刚升级到2G内存，那我绝对不会使用mingle的。<br />
2、讨厌的Description：不是所见即所得编辑器，很不友好，甚至在导出然后导入的时候经常出错。因为mingle一般在公司内部服务器使用，期望能够加入粘贴图片的功能，毕竟用附件的方式很不方便。<br />
3、mql--虽然我也没想出更好的进行统计展现的方法，但是，用一个工具又要学一个语言确实让我觉得有些不舒服。<br />
4、不完善的导入导出，data的导入导出是基于excel的，但是但是为什么要多一个复制-粘贴的动作呢？很多余的说。。。<br />
PS：一个小技巧<br />
如何变相突破5人的限制。这里的方法不是破解，而是出于一种agile的管理想法，我觉得让开发者来每天登陆mingle然后更新属性和状态是一种不给实现功能带来实际价值的做法。而且要把这种工作交给开发者来做的话无疑是加大了开发者的负担。所以我的mingle中只有两个用户，一个是我自己，一个是 guest，我每天来更新所有卡片的工作状态，而guest是给团队成语甚至我的老大来了解当前进度的。然后再给卡片增加一个developer的属性，用来保存每个开发者的名字（这个就没有限制了吧，呵呵，希望TW看到这个技巧不会哭笑不得）。</p>
<p>好了，这就是我这一个多月的mingle实用感受，欢迎大家提出更好的工具，对于工具的选择上我一向是绝对agile的。</p>
<p>下篇预告：mock还是build&mdash;&mdash;关于TDD环境的选择&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 时间：2007-09-12</p>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/122998#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 22:10:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/122998</link>
        <guid>http://rocket.javaeye.com/blog/122998</guid>
      </item>
      <item>
        <title>功能还是任务--制定敏捷计划</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/122711" style="color:red;">http://rocket.javaeye.com/blog/122711</a>&nbsp;
          发表时间: 2007年09月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>前些天对需求讨论确定后开始制定计划安排。<br />
根据最近对agile的一些体会我这次制定计划是这样的：</p>
<p>1、根据需求的功能点定义，把需求纵向切割成一个个较为独立的story，然后把这个story归入到计划中。<br />
解释：对于一个story来说，所有的分析、设计、实现都是由一个开发者来完成的。当然在开始实现前对于一般的设计都是要一起讨论的<br />
这时候story可以确立的基本属性有：title（标题）description（描述）</p>
<p>2、我把story收集好之后，根据需求的复杂度和优先级作了一个初步的分析，然后再和资深的developer做一次沟通，大概预估以下每个story需要花费的时间，然后根据老大给我的时间要求把story分成了两个iteration<br />
这时候可以确定的story属性有：Iteration（迭代周期）&nbsp; Priority（优先级） Release（发布版本） Status（状态） PlanSize（计划时间）</p>
<p>3、当我确定了在当前迭代周期需要完成的story之后，我就会在开发小组内部召开一个小讨论，罗列出这个迭代周期内有哪些功能需要完成，然后由大家自己选择感兴趣的story<br />
在选择story的同时可以经过讨论确立的属性有：developer（开发者）</p>
<p>至此一个迭代发布版本的粗略计划，一个迭代周期的详细计划就已经出来了。</p>
<p>but，当我把这个计划提交给我老大的时候，他们提出了几个问题：<br />
1、一个功能纵向开发，如何知道开发者每天的工作任务，如何知道他现在是在做设计和还是在做开发<br />
2、以前的开发是有一个专门负责实现设计和后台接口实现，一个专门负责调用接口和前台实现，这样由一个人开发后，有些人可能会在模型和接口的实现上因为经验不足而造成失误<br />
3、让一个人独立开发一块功能，是不是破坏了项目组内部的协作机制，是否会让开发者感觉到他是孤独的<br />
4、如何考察一个开发者的工作是否饱和？</p>
<p>对于上面的问题，我经过思考和讨论后给出了这样的回答：<br />
1、每天都会由我发起一个简短的状态了解，了解每个story的进度，是在分析，是在设计，设计还是在实现了我都会对story做一个记录<br />
2、一个人纵向开发也许会经验不足造成接口不够全面，但是由于是他一个人开发，他可以方便的根据自己需求来修改接口。而且两个人在横向开发时会有一些沟通交流问题而造成成本增加。（实际上在完全的agile中是由两个人结队开发，而且通常的组合是一个经验丰富的带一个经验少的）<br />
3、在功能开发时，无论是分析，设计，还是实现发现问题都可以立即举手进行讨论。可以说只要有问题就是团队一起解决的。<br />
4、这其实是只如何对开发者进行工作量考核了，我觉得从敏捷的角度来看考核的问题比较简单，就是你最终实现的完整功能（因为只有完整的功能才能给产品带来价值）所花费的时间和预期时间的差值。比如说一个story预期是6点（两点为一天）完成，结果你用3点就做完了，那么你的考核点就是+3，但是这还没完，当测试后发现这个功能点出现一次bug，你的考核点就要扣除1点，这样最终的考核点就是2点。</p>
<p>经过和老大的讨论之后，他们觉得以功能story来分配的方法和以前已工作任务来分配的方法是有些难以控制的，但是还是同意我开始在项目组试行（这里要赞一下我老大的开明态度）</p>
<p>最后提一下我用于agile项目管理的工具，相信很多人都猜到了，就是mingle</p>
<p>下篇预告：mingle使用小记&nbsp;&nbsp;&nbsp; 时间：2007-9-11</p>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/122711#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 10 Sep 2007 12:08:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/122711</link>
        <guid>http://rocket.javaeye.com/blog/122711</guid>
      </item>
      <item>
        <title>项目还是产品——需求之争引发的思考</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/122712" style="color:red;">http://rocket.javaeye.com/blog/122712</a>&nbsp;
          发表时间: 2007年09月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>周五开需求讨论会，当讨论到其中一个需求功能点的时候我提出了这样一个问题：<br />
这个需求在文档之中只表明了what，而没有说明who和why，所以我希望能够说明另外两个基本要素<br />
在我开来，一般一个需求都包含三个基本要素what who why<br />
what&nbsp; 是指这个需求的内容是什么<br />
who&nbsp;&nbsp; 是指这个需求是由谁提出的<br />
why&nbsp;&nbsp; 是指这个需求提出的目的是什么</p>
<p>当时我的老大在听完我的提问后，略为的思索（估计是认为我的问题是指这个需求是由哪个客户提出来的，为什么而提）了一下回答说：&quot;我们做的是产品而不是项目，希望你能够明白产品与项目之间的区别&quot;.当时由于在讨论会上，我们没有再这个问题上再过多久就缠下去。</p>
<p>会后老大找到我，并给我解释了一下项目和产品之间的区别：<br />
项目：由客户提出具体的需求来，开发人员只需要根据客户的具体需求来实现就可以了，而且当开发过程遇到需求不明确的情况时可以直接询问客户得到具体的需求回复。<br />
产品：客户提出一个模糊的需求，甚至是市场部或产品部自己挖据出一个模糊的需求，然后探索性的进行开发，在产品发布后给客户试用并让客户提出意见，客户通常的意见是他觉得哪块不好。而开发者就要自行寻找不好之处的解决方案，并且在下一个发布版本中实现出来，如果客户说好，那么意味解决方案是成功的，如果客户说不好，那么需要再次改进相关功能。总而言之，就是开发者需要替用户去揣摩他们想要什么，用户只会说好或者不好（就好像大家都说不好的windows，呵呵）。</p>
<p>这样看起来这样比较的话项目和产品在需求分析上的差别很大，甚至产品的需求都无法找到who和why了。其实不然，狭义的理解需求当然who和why这两个要素实际上是出于用户角度，但是从我们要实现的软件来说，一个具体实现的功能必然具备3w要素，不然是不可能被实现出来的。就拿上面的例子来说，那个需求功能点的提出者就是我们的老大，至于他提出的目的就是为了让用户使用起来更加方便顺手。</p>
<p>回到项目还是产品的标题上来，其实无论项目还是产品都是为了给最终用户提供一个可以工作的具体功能，那么只要是一个具体功能，它就必然满足需求的3W要素，只不过有些需求的提出者是最终用户，而有些需求的提出者有可能是市场人员、产品人员、甚至是开发人员。</p>
<p>最后加一点点小小的体会，曾经有一段时间，我为了做好开发，去察看了各种各样如何作何需求的资料，写过大大小小各种各样的需求文档，但是到了最后实现的过程中，总是能发现需求文档当中的种种不足。最终这种困惑是在接触agile之后给我解决的，其实需求文档的目的是为了通过沟通把具体的需求让开发人员知晓，不要出现我需要汽车你给我造出火车这样的问题出来。这里最重要的问题不是文档，而是让开发人员知道他具体要开发什么东西，至于文档只能当作再沟通当中为了辅助记忆的一个附加产物。而在现实过程中，我们往往使用文档进行沟通，因此在现实中我们往往能够感觉到文档的种种不足。结果为了解决这种不足，我们采取的方式是增加文档项，让需求文档变得越来越庞大，也越来越在难以维护，甚至需要各种各样的<a href="http://www.linkedcast.cn/website/monitor/click.do?id=9d19090d1a0056545b165859347262692a3b546a0c" target="_blank" style="COLOR: rgb(138,176,55)">链接</a>索引，甚至当需求发生变化时，我们发现维护文档的成本已经远远高于实现本身了。。。</p>
<p>所以我现在在讨论需求的时候以3w问题做为基础，弄清楚实现出的功能最终是什么样子（当然还有优先级啊之类的功能点属性），然后把一些难于记忆的要点做一些记录，这个记录甚至是没有格式的。然后做成卡片。。。。呵呵，也许你知道我要说什么了，你想的没错，就是它&mdash;&mdash;Story Card</p>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/122712#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 09 Sep 2007 14:33:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/122712</link>
        <guid>http://rocket.javaeye.com/blog/122712</guid>
      </item>
      <item>
        <title>mingle让我崩溃的一天</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/104528" style="color:red;">http://rocket.javaeye.com/blog/104528</a>&nbsp;
          发表时间: 2007年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天真的是和mingle干了一天，一直在搞mingle的中文编码问题，coder的书呆子气又来了，总是想不解决问题不罢休<br />用开始一直在调试mingle与mysql的整合，查找了好就mingle连接mysql的地方，但是始终没有找到正确的配置文件<br />然后开始想换一个数据库，用postgre，结果发现安装时到最后一步导入模板时出了问题。<br />
<pre>NativeException: org.postgresql.util.PSQLException: ERROR: column "sequence_catalog" of relation "sequences" does not exist: INSERT INTO sequences ("sequence_catalog","sequence_schema","sequence_name","data_type","numeric_precision","numeric_precision_radix","numeric_scale","maximum_value","minimum_value","increment","cycle_option","name","last_value") VALUES(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'project_7_card_numbers',NULL)</pre>
<br />不知道哪位达人有解决办法啊，救命啊。。。。。。。。<br />不过看起来好像postgre对中文的支持是没有问题的，这是一个好消息<br /><br />截至晚上19：40，问题终于解决了，原来是mingle要求postgre的版本是8.1,而我安装的版本是8.2<br /><br />同时也找到了mysql的解决办法，就是在一开始安装mysql的时候就指定编码为UTF8的后续就没有问题了。<br /><br />解决问题的过程中看了一些mingle的一些配置代码，感觉就一个，头晕，呵呵，不知道TW会不会以后把mingle和selenium一样也设置成开源的俄<br />
<img src="http://www.blogjava.net/rocket/aggbug/131919.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/rocket/" target="_blank" style="text-decoration:none;">rocket</a> 2007-07-23 17:48 <a href="http://www.blogjava.net/rocket/archive/2007/07/23/131919.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/104528#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jul 2007 09:48:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/104528</link>
        <guid>http://rocket.javaeye.com/blog/104528</guid>
      </item>
      <item>
        <title>mingle - XP template</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/104250" style="color:red;">http://rocket.javaeye.com/blog/104250</a>&nbsp;
          发表时间: 2007年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          mingle继续试用中，下面是XP模板中的相关属性，比较Agile模板而言，我觉得XP模板更加简洁好用一些，都最关心的一些属性<br />Iteration:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 迭代周期<br />Owner：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个card的所有者（不清楚是指story的所有者还是开发者）<br />Priority　　　　　　　　优先级&nbsp;&nbsp;&nbsp; Critical紧急的/Essential基本的/Nice to have最好能完成/Not essential非本质的<br />Size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所需要的资源点数&nbsp;&nbsp; 小时/人<br />Status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 状态 [new/open/Ready for Development准备开发/Ready for Testing准备测试/Deleted/Complete]&nbsp;&nbsp; <br />Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; card的类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Story 故事需求/Defect缺陷/Issue问题<br /><br /><br />同时开始学习MQL，呵呵，比较容易（有点像介绍完3个模板开始准备介绍MQL，不知道算不算有些多余），使用起来也很方便，就是对语法定义还要再熟悉一段时间<br />在XP的<a href="http://localhost/projects/xp/wiki/Overview_Page" accesskey="w"><u><font color="#800080">Overvie<span class="accesskey">w</span></font></u></a>重增加了一个个人的card列表<br />{% dashboard-panel %}<br />{% panel-heading %}my card{% panel-heading %}<br />{% panel-content %}<br />{{ table query: SELECT&nbsp; Number, Name, Priority, Status, Type, Size WHERE owner IS CURRENT USER ORDER BY Priority }}<br />{% panel-content %}<br />{% dashboard-panel %}<br /><br />试用到快准备休息时遇到一个很打击的事情，就是mingle好像不支持中文。。。。<br />这个很郁闷啊，尝试了半天显示的都是？？？，估计是在提交的时候就已经编码成乱码了。。。。<br />不过我在提交的时候分别用GBK，UTF-8，18030尝试过，都不行啊<br />如果不能支持中文将会增加，mingle在team中推广的难度啊。。。<br />不知道哪位达人知道有解决办法吗？<br /><br />
<img src="http://www.blogjava.net/rocket/aggbug/131777.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/rocket/" target="_blank" style="text-decoration:none;">rocket</a> 2007-07-23 02:03 <a href="http://www.blogjava.net/rocket/archive/2007/07/23/131777.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/104250#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 22 Jul 2007 18:03:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/104250</link>
        <guid>http://rocket.javaeye.com/blog/104250</guid>
      </item>
      <item>
        <title>mingle- Agile hybrid template</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/102988" style="color:red;">http://rocket.javaeye.com/blog/102988</a>&nbsp;
          发表时间: 2007年07月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font style="BACKGROUND-COLOR: #cce8cf">终于获得了期待已久的mingle了，简单使用之后真的有惊叹的感觉，没有让我失望。而且还超出了我的想象（内存的耗用也超出了我的想象，300m，太夸张了，我觉得这是mingle在正式版之前需要重要解决的一个问题）<br /><br />我主要简单试用了mingle的3个工程模板（Agile hybrid，XP，scrum），从体验来说，mingle本质都是基于story card的管理了，3个模板只不过是对story的不同展现方式，重要的是mingle中的storycard是可以根据需要定制不同的属性，所以mingle的核心是story，建立好story的模型，如何对story进行管理和展现，就是mingle的事情了。而且mingle的UI感觉非常好，只要是我想到的动作，它都能有最简单操作方式。<br /><br />好了，mingle的马屁拍了一大堆，下面我想讲讲我对Agile hybrid模板中属性的理解，希望其中有理解错误的地方大家能够帮我指正出来<br /><br />Agile hybrid story card property:<br />名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含义&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />Card added in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; story是在哪个迭代周期加入进来的，用于标示卡片的迭代周期<br />Customer Signoff Done in Iteration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 客户要求在那个迭代周期之前完成，一般指story的交付时间<br />Deleted in Iteration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;在哪个迭代周期删除（具体用意不清，是指被用户取消了吗？） <br />Development Done in Iteration&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;在哪个迭代周期开发完成<br />Functional Area&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;功能区块，如UI，资源管理，后台进程之类的等等<br />Iteration Scheduled&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;预定在那个迭代周期中实现<br />Narrative Done in Iteration:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （猜测是指在哪个迭代周期被补充完整）<br />Original Estimate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原始估计（）耗费的基本资源点数，以小时/人为单位<br />Planning Estimate:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 计划估计（）耗费的基本资源点数，以小时/人为单位<br />Priority:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;优先级&nbsp;&nbsp;&nbsp; Critical紧急的/Essential基本的/Nice to have最好能完成/Not essential非本质的<br />QA Signoff Done in Iteration：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; QA 标记在哪个迭代周期完成<br />Release:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;状态&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />[new/open/Narrative started叙述开始/Ready for Development准备开发/Ready for Testing准备测试/Ready for Showcase准备展示/Ready for Deployment准备发布/Deleted/Complete]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><br />我觉得奇怪的这些属性只用于迭代周期相关的很多，但是没有一个是关于人的，比如说卡片添加者，卡片开发者，卡片测试者，是不是计划驱动的方法就不需要人了呢，还是这仅仅是一个example的模板，呵呵，反正不关怎样我至少会加上一个developer的属性的。<br /><br /><br /></font></p>
<img src="http://www.blogjava.net/rocket/aggbug/131383.html" height="1" width="1" /><br /><br /><div align="right"><a href="http://www.blogjava.net/rocket/" target="_blank" style="text-decoration:none;">rocket</a> 2007-07-20 01:01 <a href="http://www.blogjava.net/rocket/archive/2007/07/20/mingle.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>
          <br/>
          <span style="color:red;">
            <a href="http://rocket.javaeye.com/blog/102988#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jul 2007 17:01:00 +0800</pubDate>
        <link>http://rocket.javaeye.com/blog/102988</link>
        <guid>http://rocket.javaeye.com/blog/102988</guid>
      </item>
      <item>
        <title>dwr reverse-ajax 实例解析</title>
        <author>rocket</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://rocket.javaeye.com">rocket</a>&nbsp;
          链接：<a href="http://rocket.javaeye.com/blog/81212" style="color:red;">http://rocket.javaeye.com/blog/81212</a>&nbsp;
          发表时间: 2007年05月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在网上找了一个老外写的dwr&nbsp; reverse-ajax的例子，自己把coding顺序调整了一下希望可以对学习dwr reverse-ajax的朋友有所帮助<br />1、首先要下载dwr 2.0 地址 <a href="http://getahead.org/dwr/download">http://getahead.org/dwr/download</a><br />2、在web.xml中加入dwr的servlet和相关配置<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.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">dwr&nbsp;servlet</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">DWR&nbsp;Servlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">display-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">uk.ltd.getahead.dwr.DWRServlet</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-class</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">debug</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">pollAndCometEnabled</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">param-value</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">init-param</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">1</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">load-on-startup</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">dwr-invoker</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-name</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/dwr/*</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">url-pattern</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">servlet-mapping</span><span style="COLOR: #0000ff">&gt;</span></div>
<span style="COLOR: #000000">pollAndCometEnabled是指dwr 的reverse ajax是使用polling 和comet的方式，在这个例子中可以明显地从页面上看出来是用的polling+comet<br /></span>附：关于reverse-ajax的实现有3种方式<br />polling&nbsp;&nbsp; 就是隔一段时间向服务器发送一request来检查服务端是否有数据更新<br />comet&nbsp;&nbsp; 就是一个长http请求，在请求期间服务端可以向客户端push数据，但是这种做法要求server和brower长期建立一个通信通道，而且效率很低<br />piggyback 就是服务端的更新数据都在排队等待，等到下一次有请求过来，那么这些等待更新数据就伴随这次请求一起发送到brower<br />有关更详细的reverse-ajax技术介绍可以参考<a href="http://getahead.org/dwr/reverse-ajax">http://getahead.org/dwr/reverse-ajax</a><br />3、创建一个dwr.xml，用于配置你要制定的java代码映射类，以及允许使用的方法和converter<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.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;!</span><span style="COLOR: #ff00ff">DOCTYPE&nbsp;dwr&nbsp;PUBLIC<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"-//GetAhead&nbsp;Limited//DTD&nbsp;Direct&nbsp;Web&nbsp;Remoting&nbsp;1.0//EN"<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;"http://www.getahead.ltd.uk/dwr/dwr10.dtd"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">create&nbsp;</span><span style="COLOR: #ff0000">creator</span><span style="COLOR: #0000ff">="new"</span><span style="COLOR: #ff0000">&nbsp;javascript</span><span style="COLOR: #0000ff">="DWRHelper"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="class"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="com.cloverworxs.uma.helper.DWRHelper"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">include&nbsp;</span><span style="COLOR: #ff0000">method</span><span style="COLOR: #0000ff">="addMessage"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">create</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">convert&nbsp;</span><span style="COLOR: #ff0000">converter</span><span style="COLOR: #0000ff">="bean"</span><span style="COLOR: #ff0000">&nbsp;match</span><span style="COLOR: #0000ff">="com.cloverworxs.uma.helper.Message"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">param&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="include"</span><span style="COLOR: #ff0000">&nbsp;value</span><span style="COLOR: #0000ff">="id,text"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">convert</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">allow</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">dwr</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
create是只一个java的js映射，其中include是可以在js使用的方法<br />convert 是指对应js到java，或者java到js的对象转换，其中include是可以转换的属性<br />4、写服务段的java代码<br />DWRHelper<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.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.cloverworxs.uma.helper;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.ArrayList;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Collection;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Iterator;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.LinkedHashMap;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.LinkedList;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.List;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Map;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.directwebremoting.ScriptBuffer;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.directwebremoting.WebContext;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.directwebremoting.WebContextFactory;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.directwebremoting.proxy.dwr.Util;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_429_1501_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_429_1501_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_429_1501_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_429_1501_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_429_1501_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_429_1501_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_429_1501_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_429_1501_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DWRHelper&nbsp;</span><span id="Codehighlighter1_429_1501_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_429_1501_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_477_1495_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_477_1495_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_477_1495_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_477_1495_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_477_1495_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_477_1495_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_477_1495_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_477_1495_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;addMessage(String&nbsp;text)&nbsp;</span></span><span id="Codehighlighter1_477_1495_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_477_1495_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinkedList&nbsp;messages&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;LinkedList();<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_582_738_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_582_738_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_582_738_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_582_738_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_582_738_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_582_738_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_582_738_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_582_738_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(text&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">&nbsp;text.trim().length()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;</span><span id="Codehighlighter1_582_738_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 id="Codehighlighter1_582_738_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messages.addFirst(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Message(text));<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_675_728_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_675_728_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_675_728_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_675_728_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_675_728_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_675_728_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_675_728_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_675_728_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(messages.size()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">)&nbsp;</span><span id="Codehighlighter1_675_728_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 id="Codehighlighter1_675_728_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messages.removeLast();<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Reverse&nbsp;Ajax&nbsp;code&nbsp;to&nbsp;be&nbsp;added&nbsp;here&nbsp;shortly</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebContext&nbsp;wctx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WebContextFactory.get();<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;currentPage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wctx.getCurrentPage();<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Clear&nbsp;the&nbsp;input&nbsp;box&nbsp;in&nbsp;the&nbsp;browser&nbsp;that&nbsp;kicked&nbsp;off&nbsp;this&nbsp;page&nbsp;only</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Util&nbsp;utilThis&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Util(wctx.getScriptSession());<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utilThis.setValue(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;For&nbsp;all&nbsp;the&nbsp;browsers&nbsp;on&nbsp;the&nbsp;current&nbsp;page:</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Collection&nbsp;sessions&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;wctx.getScriptSessionsByPage(currentPage);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Util&nbsp;utilAll&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Util(sessions);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;Clear&nbsp;the&nbsp;list&nbsp;and&nbsp;add&nbsp;in&nbsp;the&nbsp;new&nbsp;set&nbsp;of&nbsp;messages</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utilAll.removeAllOptions(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chatlog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utilAll.addOptions(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">chatlog</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;messages,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></span></div>
Message<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.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;com.cloverworxs.uma.helper;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;org.directwebremoting.Security;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_98_494_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_98_494_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_98_494_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_98_494_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_98_494_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_98_494_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_98_494_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_98_494_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Message&nbsp;</span><span id="Codehighlighter1_98_494_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_98_494_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_135_305_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_135_305_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_135_305_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_135_305_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_135_305_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_135_305_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_135_305_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_135_305_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Message(String&nbsp;newtext)&nbsp;</span></span><span id="Codehighlighter1_135_305_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_135_305_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;newtext;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_194_247_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_194_247_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_194_247_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_194_247_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_194_247_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_194_247_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_194_247_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_194_247_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(text.length()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">)&nbsp;</span><span id="Codehighlighter1_194_247_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 id="Codehighlighter1_194_247_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;text.substring(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">256</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Security.replaceXmlCharacters(text);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_332_357_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_332_357_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_332_357_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_332_357_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_332_357_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_332_357_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_332_357_Open_Image.style.display=&apos;inline&apos;; Codehighlighter1_332_357_Open_Text.style.display=&apos;inline&apos;;" align="top" style="DISPLAY: none" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;getId()&nbsp;</span></span><span id="Codehighlighter1_332_357_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 id="Codehighlighter1_332_357_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;id;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_388_415_Open_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_388_415_Open_Text.style.display=&apos;none&apos;; Codehighlighter1_388_415_Closed_Image.style.display=&apos;inline&apos;; Codehighlighter1_388_415_Closed_Text.style.display=&apos;inline&apos;;" align="top" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_388_415_Closed_Image" onclick="this.style.display=&apos;none&apos;; Codehighlighter1_388_415_Closed_Text.style.display=&apos;none&apos;; Codehighlighter1_