<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>mpkoo 的博客</title>
    <description>java,开源,生活，其他</description>
    <link>http://mpkoo.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>用Acegi Security来保护Grails应用</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/179379" style="color:red;">http://mpkoo.javaeye.com/blog/179379</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong></strong><br /><h2 id="intro">简介</h2><p>本文论述了grails-acegi plugin与一个简单Grails应用的集成。集成使用了三个主要组件&mdash;&mdash;<a href="http://groovy.codehaus.org/">Groovy</a>, <a href="http://grails.codehaus.org/">Grails</a>和<a href="http://www.acegisecurity.org/">Acegi Security</a>.</p><p><strong>Groovy</strong>是一个针对Java平台的强大的高级语言，其代码最终被编译为Java字节码。在概念上，它类似于Ruby或Python，可是它与Java平台紧密地集成在一起。这就使你既可利用强大简明的编码语法，又可继续停留在JVM上，从而保护你在已有Java平台和相关类库上的投资。</p><p><strong>Grails</strong>是一个用Groovy实现的全功能框架。Grails试图通过其核心技术及相关plug-in来解决Web开发中的许多难题。开箱即用的功能包括：</p><ul><li>建立在<a href="http://hibernate.org/">Hibernate</a>之上的对象/关系映射（ORM）层 </li><li>被称为Groovy Server Pages（GSP）的富于表现的视图（View）技术 </li><li>构建在<a href="http://www.springframework.org/">Spring</a> MVC之上的控制器（controller）层 </li><li>构建在<a href="http://gant.codehaus.org/">Gant</a>（基于Groovy的Ant）之上的一个命令行脚本环境 </li><li>一个内嵌Jetty容器，被配制为可实时进行资源重载 </li><li>通过内置Spring容器支持依赖注入（dependency injection） </li><li>支持国际化（i18n），这一功能是使用Spring的MessageSource API来构建的 </li><li>事务服务层，其利用了Spring的事务管理功能 </li><li>广泛应用了领域特定语言（Domain-Specific Languages&mdash;&mdash;DSLs） </li></ul><p><strong>Acegi Security</strong>是为企业级软件提供的一个强大的、灵活的安全解决方案，尤其是那些使用了Spring的应用。Acegi提供了全面的认证、授权、基于实例的访问控制、信道安全以及人类用户检测能力。</p><p>本文假定你已经阅读过了Grails指南&mdash;&mdash;由<a href="http://jasonrudolph.com/blog/">Jason Rudolph</a>所编写的<a href="http://www.infoq.com/cn/minibooks/grails">Grails入门指南</a>，而且已经实现了其中示例的RaceTrack应用。Grails-acegi plugin将被集成进RaceTrack，为你的应用提供安全性。利用grails-acegi plugin为你免除了在应用中实现Grails拦截器所需的开支，提供了比拦截器更加灵活的解决方案，也节约了你利用Acegi重新实现自己的安全系统所要花费的时间。</p><h2 id="setup">建立RaceTrack例子应用</h2><p>首先，你需要下载<a href="http://grails.codehaus.org/Installation">Grails 1.0</a>、<a href="http://grails.codehaus.org/AcegiSecurity+Plugin">grails-acegi-0.2 plugin</a>以及<a href="http://java.sun.com/javase/downloads/index.jsp">Java SE JDK 5.0</a>或更新版。</p><p>这里，我们假定你已经实现了<a href="http://www.infoq.com/cn/minibooks/grails">Grails入门指南</a>中所描述的RaceTrack应用的大部分功能。但是，为了测试grails-acegi plugin，你不必完成整个指南。测试grails-acegi plugin所需的全部东西包括：领域类（domain classes）和controller，controller的脚手架对于测试来说已经足够了。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure1.JPG" alt="图 1 &mdash;&mdash; 创建完racetrack应用后的目录结构" /> <p><strong><span style="font-size: x-small">图 1 &mdash;&mdash; 创建racetrack应用后的目录结构</span></strong></p><p>你的RaceTrack应用目录看起来应该和图1显示的类似。现在，打开\grails-app\domain目录：</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure2.JPG" alt="图 2 &mdash;&mdash; 领域类目录" /> <p><strong><span style="font-size: x-small">图 2 &mdash;&mdash; 领域类目录</span></strong> </p><p>正如你从图2中看到的，&ldquo;domain&rdquo;目录只包含了两个domain类：Race和Registration。现在，打开\grails-app\controllers目录，确认一下每个domain类都有一个对应的controller，如图3所示：</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure3.JPG" alt="图 3 &mdash;&mdash; Controllers目录" /> <p><strong><span style="font-size: x-small">图 3 &mdash;&mdash; Controllers目录</span></strong> </p><p>这些controller可以是空的、脚手架（scaffold）controller，例如：</p><pre>  class RaceController { def scaffold = Race }
 
  class RegistrationController { def scaffold = Registration }</pre><p>这足以让程序跑起来了。在你开始运行RaceTrack应用之后，你将能够在如图4所示的contoller list中看到两个你所创建的controller：</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure4.JPG" alt="图 4 &mdash;&mdash; Grails-Acegi Plugin之前的首页" /> <p><strong><span style="font-size: x-small">图 4 &mdash;&mdash; 使用Grails-Acegi Plugin之前的首页</span></strong> </p><h2 id="install">安装Grails Acegi plugin</h2><p>下一步是安装grails-acegi plugin，这样RaceTrack就可以利用该plugin所提供的基于角色的安全防护。在命令提示行中，进入到&ldquo;racetrack&rdquo;目录并运行如下命令：</p><pre>grails install-plugin [path-to]/grails-acegi-0.2.zip </pre><p>这一命令会在&ldquo;racetrack&rdquo;目录下创建一个plugins目录，如图5所示：</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure5.JPG" alt="图 5 &mdash;&mdash; 安装plugin之后所创建的plugins目录" /> <p><strong><span style="font-size: x-small">图 5 &mdash;&mdash; 安装plugin之后所创建的plugins目录</span></strong> </p><h2 id="creation">创建Acegi Security组件</h2><p>下一步是创建代表用户帐号（Accounts）和角色（Roles）的领域类。运行如下命令开始这一过程：</p><pre>grails create-auth-domains AuthUser Role</pre><p>这一命令将创建两个领域类（AuthUser和Role）、建立AcegiConfig类、并创建Login和Logout两个controller。AuthUser领域类代表你的用户，因此每个新用户都将在Auth_User表中创建一条新的记录。Role领域类代表每个用户所拥有的安全角色，Role将被指派给AuthUser。所有这些类都显示在图6中。</p><p>AcegiConfig类（图7）定义了你的应用的安全配置。配置中包括：用户领域类的名字（本例为AuthUser）以及角色领域类的名字（本例为Role），使用动态还是静态安全Urls，怎样设置email警报（打开或关闭它们）。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure6.JPG" alt="图 6 &mdash;&mdash; AuthUser.groovy、Role.groovy和Requestmap.groovy（在AcegiConfig中使用）" /> <p><strong><span style="font-size: x-small">图 6 &mdash;&mdash; AuthUser.groovy、Role.groovy和Requestmap.groovy（在AcegiConfig中使用）</span></strong></p><span style="font-size: x-small"><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure7.JPG" alt="图 7 &mdash;&mdash; 已创建的AcegiConfig.groovy" /></span> <p><strong><span style="font-size: x-small">图 7 &mdash;&mdash; 已创建的AcegiConfig.groovy</span></strong> </p><p>为了创建新的AuthUser，创建新的Role并指派给AuthUser，我们还得运行两个命令。其一是产生领域类的CRUD控制：</p><pre>grails generate-manager</pre><p>第二个是为controller和domain产生registration：</p><pre>grails generate-registration</pre><p>这些命令给了用户注册并创建其用户名和口令的能力，默认的安全角色将被指派给该用户。从图8可以看到所产生的这一controller集合：</p><p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure8.JPG" alt="图 8 &mdash;&mdash; CRUD controllers （Login和Logout controller是在AuthUser和Role被创建的时候创建的）" /></p><p><strong><span style="font-size: x-small">图 8 &mdash;&mdash; CRUD controllers （Login和Logout controller是在AuthUser和Role被创建的时候创建的）</span></strong> </p><p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure9.JPG" alt="图 9 &mdash;&mdash; 安装grails-acegi-plugin之后可用的Controller" /></p><p><strong><span style="font-size: x-small">图 9 &mdash;&mdash; 安装grails-acegi-plugin之后可用的Controller</span></strong></p><p>访问RaceTrack首页&mdash;&mdash;它看上去类似于图9所示内容。</p><h2 id="config">配制Acegi Security来保护应用</h2><p>我们现在创建一个用户角色和管理者角色&mdash;&mdash;首先点击RoleController，输入角色名&ldquo;user&rdquo;以及角色描述（图10）。注意RoleController将会把&ldquo;user&rdquo;转换成&ldquo;ROLE_USER&rdquo;，数据库中和Acegi的配置中将使用&ldquo;ROLE_USER&rdquo;。重复同样的步骤创建一个管理者角色。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure10.JPG" alt="图 10 &mdash;&mdash; 创建一个用户角色" /> <p><strong><span style="font-size: x-small">图 10 &mdash;&mdash; 创建一个用户角色</span></strong> </p><p>回到首页，点击UserController。现在创建一个拥有&ldquo;user&rdquo;角色的用户和另一个拥有&ldquo;manager&rdquo;角色的用户，如图11所示：</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure11.JPG" alt="图 11 &mdash;&mdash; 创建一个标准用户，激活该帐户并为其指派&ldquo;user&rdquo;角色" /> <p><strong><span style="font-size: x-small">图 11 &mdash;&mdash; 创建一个标准用户，激活该帐户并为其指派&ldquo;user&rdquo;角色</span></strong> </p><p>我们创建的角色和用户现在已经足够用作配置了，下一步是保护RaceTrack应用。有两种方法保护你的URLs：一种是动态，通过RequestmapController来实现；另一种是静态的，直接编辑AcegiConfig.groovy文件。动态配置是被推荐的选项，下面我们继续进行动态配置工作。</p><p>在我们保护应用之前，需要考虑一下应用需要给予怎样的访问规则。一个manager被允许读/写访问应用中的任何页面，即：</p><ul><li><span style="font-family: Courier New">/race/*</span> </li><li><span style="font-family: Courier New">/registration/*</span> </li></ul><p>一个用户被允许只读访问某些页面，包括：</p><ul><li><span style="font-family: Courier New">/race/list/*</span> </li><li><span style="font-family: Courier New">/race/show/*</span> </li><li><span style="font-family: Courier New">/registration/list/*</span> </li><li><span style="font-family: Courier New">/registration/show/*</span> </li></ul><p>这些规则需要使用RequestmapController翻译成Acegi请求映射（Acegi request map）中的条目。从RaceTrack首页上点击RequestmapController，转到&ldquo;create a new requestmap&rdquo;页面。在URL域内填写上&ldquo;/race/**&rdquo;，在Role域填写为&ldquo;manager&rdquo;（图12）&mdash;&mdash;这将创建一条规则，允许任何拥有manager角色的用户访问/race下的所有URLs。同样的方法可以配置好registration（URL：/registration/**）。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure12.JPG" alt="图 12 &mdash;&mdash; Manager访问规则" /> <p><strong><span style="font-size: x-small">图 12 &mdash;&mdash; Manager访问规则</span></strong> </p><p>注意，一个好的习惯是给manager角色也授予所有用户权限。下一步将给用户角色创建访问规则&mdash;&mdash;在URL域输入&ldquo;/race/list/**&rdquo;，在Role域输入&ldquo;user, manager&rdquo;（图13&mdash;&mdash;注意角色之间是用逗号分隔的）。这一步骤将创建这样一个访问规则&mdash;&mdash;允许user和manager角色都能访问race列表页面。注意这两个角色你都需要指定&mdash;&mdash;如果你只将该URL指派给user角色，它将覆盖前面给manager指派的规则，这样只有user角色才能访问该页面。为前面定义的其他规则重复这一步骤&mdash;&mdash;这将为race和registration页创建所有的访问规则。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure13.JPG" alt="图 13 &mdash;&mdash; 为/race/list/**页面创建规则&mdash;&mdash;准许user和manager角色访问" /> <p><strong><span style="font-size: x-small">图 13 &mdash;&mdash; 为/race/list/**页面创建规则&mdash;&mdash;准许user和manager角色访问</span></strong> </p><h2 id="testing">测试</h2><p>在RaceTrack首页上点击RaceController或RegistrationController（我们已经保护了这些controller）。你将注意到页面自动重定向到了Login页面。如果你先以manager角色的用户登录，你就能够浏览、创建、更新和删除race和registration页面的任何东西。</p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure14.JPG" alt="图 14 &mdash;&mdash; 以一个用户身份登录" /> <p><strong><span style="font-size: x-small">图 14 &mdash;&mdash; 以一个user身份登录</span></strong> </p><p>回到RaceTrack首页并点击LogoutController&mdash;&mdash;这将使你的用户session失效并登出。再次点击LoginController，但是这次以user角色的用户登录。如果你转向/race/list的子页面（直接访问<a href="http://localhost:8080/racetrack/race/list">http://localhost:8080/racetrack/race/list</a>或通过controller转过去），你将看到race/list视图（图15）。</p><p>记得么，访问规则只允许manager创建新记录，user角色只允许从List和Show页面读取数据&mdash;&mdash;这意味着如果你以user角色的用户登录并点击了New Race（<a href="http://localhost:8080/racetrack/race/create">http://localhost:8080/racetrack/race/create</a>），Acegi将阻止你浏览该页面，它阻止了一个新记录的创建。</p><p>它是怎么工作的呢？回想一下，我们给manager角色授权可以访问/race/*，但是只给user角色授权访问/race/list/*和/race/show/*。当拥有&ldquo;user&rdquo;角色的用户试图访问/race/create页面时，Acegi察看该用户所拥有的所有角色，发现其只有&ldquo;user&rdquo;角色&mdash;&mdash;因为我们的Request map说了，必须是&ldquo;manager&rdquo;角色才被授权访问这一页面，于是访问这一页面的许可被禁止了。</p><p>顺便讲一下，在一个真正的应用中，你可能想要显示一个比默认错误页（图16）更好看的错误页。</p><p class="image-wide"><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure15.JPG" alt="图 15 &mdash;&mdash; Race List视图" /></p><p><strong><span style="font-size: x-small">图 15 &mdash;&mdash; Race List视图</span></strong> </p><img src="http://www.infoq.com/resource/articles/grails-acegi-integration/en/resources/figure16.JPG" alt="Figure 16 &mdash;&mdash; 访问禁止错误页" /> <p><strong><span style="font-size: x-small">Figure 16 &mdash;&mdash; 访问禁止错误页</span></strong> </p><p>恭喜你&mdash;&mdash;现在你已经有了RaceTrack应用的一个完整的安全实例了！</p><p><strong>查看英文原文：</strong><a href="http://www.infoq.com/articles/grails-acegi-integration">Securing a Grails Application with Acegi Security</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/179379#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><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 20:44:06 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/179379</link>
        <guid>http://mpkoo.javaeye.com/blog/179379</guid>
      </item>
      <item>
        <title>使用JRuby生成JVM代码</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/179378" style="color:red;">http://mpkoo.javaeye.com/blog/179378</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p id="s7vy">尽管JRuby的性能已经接近CRuby了，但有时它仍然不够快。CRuby的用户可以使用Ryan Davis的<a href="http://www.zenspider.com/ZSS/Products/RubyInline/" class="inplaceurl" id="r2cb">RubyInline</a>库，它提供了对C/C++的内建支持以便更容易的产生Ruby的C扩展。来自JRuby阵营的Charles Nutter现在已经为JRuby<a href="http://headius.blogspot.com/2008/03/rubyinline-for-jruby-easy.html" title="实现了针对JRuby的RubyInline构建器" id="q343">实现了一个RubyInline builder</a> ，它可以即时编译嵌入的Java代码。</p><p id="hexp">下面是<a href="http://www.zenspider.com/ZSS/Products/RubyInline/" title="Ryan Davis提供的使用C编写的一个阶乘计算方法的示例" id="tj1j">Ryan Davis提供的使用C编写的一个阶乘计算方法的示例</a>：</p><pre class="code">class MyTest
&nbsp;inline do |builder|
&nbsp;builder.c &quot;
&nbsp; long factorial_c(int max) {
  &nbsp;int i=max, result=1; 
   while (i &gt;= 2) { result *= i--; }    
   return result;     
  }
 &quot;
&nbsp;end
end </pre><p id="i_cg">下面是<a href="http://jruby-extras.rubyforge.org/svn/trunk/java_inline/samples/fastmath.rb" title="Charles提供的相应的JRuby实现" id="n.fk">Charles提供的相应的JRuby实现</a> ：</p><pre class="code">class FastMath
&nbsp;inline :Java do |builder|
 &nbsp; builder.package &quot;org.jruby.test&quot; 
   builder.java &quot;
&nbsp;  public static long factorial_java(int max) {
   &nbsp;int i=max, result=1;
   &nbsp;while (i &gt;= 2) { result *= i--; } 
    return result;       
   }
  &nbsp;&quot;
&nbsp;end
end &nbsp;</pre><p id="s7lj">RubyInline for JRuby的一个缺点在于其需要Java 6 JDK（对于编译器），它可能还无法在所有系统上都可使用。 </p><p id="h25v">另一个可产生快速执行代码的方法就是直接产生JVM字节码。对于正常的应用来说，这听起来有些过激了，像编译器这样的字节码生成工具会从<a href="http://headius.blogspot.com/2007/11/bytecode-tools-in-ruby-low-level-dsl.html" title="一个简单的字节码生成DSL中获益，就像Charles Nutter的blog中提到的那样" id="mvi5">一个简单的字节码生成DSL中获益，就像早前Charles Nutter的博客中提到的那样</a>。然而即便通过DSL来生成字节码也并非易事。以下是<a href="http://headius.blogspot.com/2007/11/bytecode-tools-in-ruby-low-level-dsl.html" title="Charles的博客中的一个例子" id="ag73">Charles的博客中的一个例子</a>：一个名为bar的方法将小写的String参数加到传进来的ArrayList中，下面就是产生的代码：</p><pre class="code">def test_class_builder
&nbsp;cb = Compiler::ClassBuilder.build(&quot;MyClass&quot;, &quot;MyClass.java&quot;) do
&nbsp;[...]     
 method(:bar, ArrayList, String, ArrayList) do
&nbsp; aload 1  
  invokevirtual(String, :toLowerCase, String)  
  aload 2       
  swap
&nbsp; invokevirtual(ArrayList, :add, [Boolean::TYPE, Object])   
  aload 2     
  areturn
end
[...] &nbsp;</pre><p id="llu9">Charles Nutter还提供了一个新方案，这就是叫做<a href="http://headius.blogspot.com/2008/03/duby-type-inferred-ruby-like-jvm.html" class="inplaceurl" id="nsba">Duby</a>的新语言，它实现了Ruby语法的一个子集，增强了一些类型推断逻辑（请访问<a href="http://headius.blogspot.com/2008/03/more-fun-with-duby.html" title="Charles的博客" id="i_rw">Charles的博客</a>来了解更多信息），以此来生成快速的字节码。下面同样是计算阶乘的方法，这次是针对Duby编译器而写的。</p><pre class="code">class Fac
&nbsp;def self.fac(max)
 &nbsp;{max =&gt; :int, :return =&gt; :int}
&nbsp; i = max
&nbsp; result = 1
 &nbsp;while i &gt; 1
  &nbsp;result *= i
  &nbsp;i -= 1 
  end
&nbsp; result
&nbsp;end
end </pre><p id="hvqi">这是一个原型，用来展现以一种类Ruby语言而不是一种新语言来实现类型推断的可能性。它还可被JRuby程序员所用，以避免因为性能问题而回退到Java，或者用来实现JRuby本身的一些部分功能，这与Squeak Smalltalk的<a href="http://wiki.squeak.org/squeak/2267" class="inplaceurl" id="ik.p">Slang</a>很像，它是Smalltalk语言的一个子集，可以很轻易的转化为C。Rubinius计划使用叫做Garnet的类似方法。现在，对于JRuby来说，你想使用何种代码生成方式呢？</p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/179378#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 20:38:20 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/179378</link>
        <guid>http://mpkoo.javaeye.com/blog/179378</guid>
      </item>
      <item>
        <title>AOM 2.0 M2版本融入IoVC编程思想和Elite语言</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/179376" style="color:red;">http://mpkoo.javaeye.com/blog/179376</a>&nbsp;
          发表时间: 2008年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p id="hcxu"><a href="http://www.operamasks.org/about" title="Apusic OperaMasks" id="upo4">Apusic OperaMasks</a>（简称AOM）是由OperaMasks.org组织（由金蝶中间件公司创建的一个独立的非盈利性法人实体）所提供的开箱即用的Web Framework，它以JSF为基础引擎，辅以独创的原生Ajax技术，同时提供丰富的组件和集成开发环境，使Web开发变得简单方便。其<a href="http://www.operamasks.org/about" title="网站" id="b-tb">网站</a>上是这样描述AOM的：</p><blockquote>无论是后台的事务、存储、分布式计算等基础服务，还是前端的UI展现与用户交互，以及后台与前端的会话过程，Apusic OperaMasks都提供了完整的解决方案，有效解决Web开发所面临的问题：<br /><br /><ul><li>开箱即用：使用Apusic OperaMasks进行Web开发，开发人员只需掌握基础的J2EE知识！ </li><li>引擎：提供标准的JSF引擎，JSF是已经得到业界认同的一种主流组件技术，能够很容易适应各种未来需求的变化，其精髓就是&ldquo;与表现层无关的表现层技术&rdquo;； </li><li>原生Ajax支持：从容器级别对Ajax予以支持，对Apusic OperaMasks用户来说，要使应用具备Ajax特性，付出的成本是零； </li><li>Rich Component：Apusic OperaMasks提供给用户丰富的Rich Components，用户可以用各种组件来组织数据、展现数据、编辑数据； </li><li>开发工具：提供开发工具Apusic Studio的支持，&ldquo;所见即所得&rdquo;的可视化设计，一体化的开发、配置、部署、调试、监控的集成开发环境； </li><li>跨浏览器支持：Apusic OperaMasks完全兼容业界主流浏览器，如IE、Firefox等； </li><li>开源社区：所有源码甚至是开发过程自身，全部通过OperaMasks.org开放，代表了J2EE社区开放和敏捷的力量！ </li></ul></blockquote><p id="z98v">3月28日AOM发布了2.0 M2版本，InfoQ中文站在29日<a href="http://hero2008.csdn.net/" title="CSDN举办的软件技术英雄会" id="i0nr" target="_blank">CSDN举办的软件技术英雄会</a>期间与其技术总监张勇进行了交流，并就AOM的现状及未来发展对他进行了采访。</p><p><strong>AOM所要解决的问题是什么？</strong> </p><blockquote>如果将网站基于BS架构的分成两类，第一类是以信息浏览为主要的，比如搜狐、新浪这样的，我们称之为Web Site；第二类是以BS架构为载体，但所承载的是一种应用，强调的是客户和系统之间的高交互性，他有非常复杂的操作和流程逻辑，我们将这种应用称为Web Application。而AOM就是适合做Web Applicationd的一种工具。 </blockquote><p><strong>为什么AOM要选择JSF作为基础框架？</strong> </p><blockquote>这是一个机缘巧合的问题，之所以选择JSF，这是由金蝶当初的定位决定的。作为一家J2EE服务器提供厂商，在通过了Java EE 5.0认证之后，那么金蝶就需要有JSF的实现，因为JSF已经是Java EE 5.0的一部分。在做JSF的时候，我们认识到JSF的优雅之处，但是也感觉到其过于理想化和不现实的地方，这也是那些批评JSF的人所引以为诟病的地方。JSF是一个服务器端编程模型，而AJAX是客户端的，后来袁红岗创造性地用Render Kit将JSF和AJAX结合起来，应用在AOM中。其实AJAX并没有什么什么创新之处，开发人员在做AJAX应用的时候还是要写大量的JS代码。而AOM解决了这个问题，通过JSF的Render将AJAX进行封装，对开发人员透明，从而只需要关注业务逻辑。这也是J2EE Without AJAX这个口号的由来。现在通过AOM，你可以做到应用基于JSF，但同时具备AJAX特性。 </blockquote><p><strong>为什么JSF没有形成主流？</strong> </p><blockquote>第一JSF规范没有得到业界的接受。因为在规范的制定上，JSF是基于HTTP的，一个很简单的Hello World示例，都需要传递几十K的字节，而我们一个普通的Hello World应用几K就可以了。这一点导致了JSF没有迅速成为主流。第二是Java世界已经有了很多可以解决类似问题的框架。 </blockquote><p><strong>AOM如何克服JSF的弊端？为什么AOM并没有被更多人所接纳？金蝶在AOM方面有没有可以分享的案例？</strong> </p><blockquote>我们对规范的细节做了改进。在状态方面我们花了很大的力气来消除状态。在JSF规范里面状态是有6步的，而AOM里面又多加了一步Build Tree。在生命周期这一部分做了动作。现在这个数据的传输量就比较小。<br /><br />虽然现在我们在JSF之上做了很多的扩充，但基本没有违背JSF这个规范。至于日后AOM是否要脱离JSF，发展成一个独立的解决方案，还是继续遵循JSF，我们在考虑，但还没有做最终的决定。我们希望其他更多的个人和企业参与到这个决定中来。<br /><br />至于AOM为什么目前没有被更多人所接纳，我认为有两个因素，第一个因素是推广力度不够；第二是国人对国人自己的民族软件还缺乏信任。<br /><br />在网上我们已经放了一些关于<a href="http://www.operamasks.org/" title="使用AOM的案例" id="t92f" target="_blank">使用AOM的案例</a>；金蝶规划的下一代ERP产品会考虑基于JSF来设计。</blockquote><p><strong>为什么AOM是开源的框架，但是却只放在自己的网站上，而没有放在大家更为常用的国际性的网站，如SourceForge上等？AOM采取的是什么开源协议？</strong> </p><blockquote>之所以放在自己的网站上是因为当时考虑到在国内访问SourceForge等这样的网站速度很慢，而且稳定性也不是特别好。而我们自己的网络环境比较好，另外大部分开发人员是金蝶自己的员工。其实AOM的CVS是对外公开的，我们很希望有更多的人能够参与进来，而不是成为金蝶一家公司的事情。<br /><br />而且，我们也没有提供比较好的英文文档，因为我们的团队里面绝大部分人员都是中国人，虽然有一些海归人士，但是使用的语言还是中文，这是我们比较欠缺的地方。另外因为开发上的压力比较大，所以在文档化方面做的并不理想。即使我们将AOM国际化了，我在也没有能力在国际上去推广。我们计划在08年7月份正式走向国际化，有可能会任命一个国际化产品经理。<br /><br />AOM现在采用的是<a href="http://www.gnu.org/licenses/lgpl.html" title="LGPL" id="vsd0">LGPL</a>。从前是GPL，但因为有很多厂商不习惯用这个协议，即自己在AOM之上做了开发要必须将自己的源代码再次公开，限制比较多。所以现在改用LGPL了。</blockquote><p><strong>AOM下一步打算做哪些事情？</strong> </p><blockquote>最近我们发布了一个里程碑式的版本，也就是AOM 2.0M2，包含以下新的特点： <ol><li>组件更加丰富。不仅有Tree、Table等这些常用的组件，还有各种各样的布局组件。要知道在HTML里面写布局是非常麻烦的，Table、DIV等嵌来嵌去，很罗嗦，通过我们提供的布局组件可以很好地解决这些问题。 </li><li>AOM 2.0里面融入了我们新的编程思想&mdash;&mdash;<a href="http://www.operamasks.org/articles/iovc/html_single" title="IOVC" id="oe7o">IoVC</a>（Inversion of View-Control，即&ldquo;视图控制反转&rdquo;，换言之：它能够把对&ldquo;View【即 UI 视图】的控制力&rdquo;注入到你的后台业务逻辑中。这样一来，你在编写业务逻辑的过程中，对View拥有足够的控制力，从而能够将展现层与业务逻辑完全的解耦），这是我们想着重强调的。通过这个编程思想，能够让你的整个系统可维护性和可扩展性得到显著增强。 </li><li>然后就是和<a href="http://sourceforge.net/projects/aom-elite/" title="Elite" id="biox">Elite</a>这个语言的结合，这是一个集命令式和函数式风格为一身的面向对象的程序设计语言，既有高阶函数（first-class functions）、列表推导（list-comprehension）、模式匹配（pattern-matching）、延时求值（lazy-evaluation）等函数式语言所具有的语言特征，又具有和Java相近的语法结构。 </li><li>最后就是对AOM 2.0从前的一些不足之处做得修正。 </li></ol>另外，AOM 2.0M2中包含了一个Apusic Studio 5.1 M5，它是一个All In One的版本。<br /><br />由于2.0里面包括了很多创新性的地方，目前我们不会在上面再做创新，而是要将2.0稳定下来。我们现在在规划3.0，比如是否要往Web Site方面努力，以及是否要让<a href="http://sourceforge.net/projects/aom-elite/" title="ELite" id="h:21">ELite</a>和AOM有更好的结合等。 </blockquote><p>如果想进一步了解Apusic OperaMasks，可以从他们的<a href="http://www.operamasks.org/" title="网站" id="a46t">网站</a>上阅读更多的信息。</p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/179376#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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 03 Apr 2008 20:36:28 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/179376</link>
        <guid>http://mpkoo.javaeye.com/blog/179376</guid>
      </item>
      <item>
        <title>在NetBeans 6中创建SOAP Web Services</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/178793" style="color:red;">http://mpkoo.javaeye.com/blog/178793</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如何在NetBeans 6中轻松创建Web Services项目。在这个项目中将用到NetBeans 6.0及其附带的JAX-WS 2.1。<br /><br /><strong>一、Web Services Description Language(WSDL：Web Services 描述语言)<br /><br /></strong>有很多种方式来创建Web Services。其中一种方式是首先创建WSDL文件。首先，你必需明确你的Web Services将要实现一个什么样的功能，从而确定它的输入和输出参数分别是什么。在这个实例中，只实现了一个名为getcalculateValues的操作，它将简单的求出两个数的和。即以两个数字作为输入参数，它们的和为输出参数。<br /><br />首先创建一下两个文件：<br /><br /><strong>webservices.wsdl</strong><br />=================<br /><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;
&lt;definitions xmlns:ns1=&quot;soapwebservices.jdevelop.eu&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; xmlns=&quot;http://schemas.xmlsoap.org/wsdl/&quot; xmlns:ns=&quot;http://schemas.xmlsoap.org/soap/encoding/&quot; name=&quot;SOAPWebServices&quot; targetNamespace=&quot;soapwebservices.jdevelop.eu&quot;&gt;
    &lt;types&gt;
        &lt;xsd:schema&gt;
            &lt;xsd:import namespace=&quot;soapwebservices.jdevelop.eu&quot; schemaLocation=&quot;webservices.xsd&quot;/&gt;
        &lt;/xsd:schema&gt;
    &lt;/types&gt;
    &lt;message name=&quot;calculateValues&quot;&gt;
        &lt;part name=&quot;calculateValues&quot; element=&quot;ns1:calculateValues&quot;/&gt;
    &lt;/message&gt;
    &lt;message name=&quot;calculateValuesResponse&quot;&gt;
        &lt;part name=&quot;calculateValuesResponse&quot; element=&quot;ns1:calculateValuesResponse&quot;/&gt;
    &lt;/message&gt;
    &lt;portType name=&quot;SOAPWebServices&quot;&gt;
        &lt;operation name=&quot;getCalculateValues&quot;&gt;
            &lt;input message=&quot;ns1:calculateValues&quot;/&gt;
            &lt;output message=&quot;ns1:calculateValuesResponse&quot;/&gt;
        &lt;/operation&gt;
    &lt;/portType&gt;
    &lt;binding name=&quot;SOAPWebServicesPortBinding&quot; type=&quot;ns1:SOAPWebServices&quot;&gt;
        &lt;soap:binding style=&quot;document&quot; transport=&quot;http://schemas.xmlsoap.org/soap/http&quot;/&gt;
        &lt;operation name=&quot;getCalculateValues&quot;&gt;
            &lt;soap:operation soapAction=&quot;urn:http://blog.jdevelop.eu/services/getCalculateValues&quot;/&gt;
            &lt;input&gt;
                &lt;soap:body use=&quot;literal&quot;/&gt;
            &lt;/input&gt;
            &lt;output&gt;
                &lt;soap:body use=&quot;literal&quot;/&gt;
            &lt;/output&gt;
        &lt;/operation&gt;
    &lt;/binding&gt;
    &lt;service name=&quot;SOAPService&quot;&gt;
        &lt;port name=&quot;WebServices&quot; binding=&quot;ns1:SOAPWebServicesPortBinding&quot;&gt;
            &lt;soap:address location=&quot;http://blog.jdevelop.eu:80/services&quot;/&gt;
        &lt;/port&gt;
    &lt;/service&gt;
&lt;/definitions&gt;

</pre><p>&nbsp;</p><p>&nbsp;</p><p>webservices.xsd<br />=================</p><pre name="code" class="xml">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;yes&quot;?&gt;
&lt;xs:schema xmlns:ns1=&quot;http://blog.jdevelop.eu/soapwebservices.xsd&quot; xmlns:tns=&quot;soapwebservices.jdevelop.eu&quot; xmlns:xs=&quot;http://www.w3.org/2001/XMLSchema&quot; targetNamespace=&quot;soapwebservices.jdevelop.eu&quot; version=&quot;1.0&quot;&gt;
   &lt;xs:element name=&quot;calculateValues&quot;&gt;
        &lt;xs:complexType&gt;
            &lt;xs:sequence&gt;
                &lt;xs:element name=&quot;value1&quot; type=&quot;xs:decimal&quot;/&gt;
                &lt;xs:element name=&quot;value2&quot; type=&quot;xs:decimal&quot;/&gt;
            &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
    &lt;xs:element name=&quot;calculateValuesResponse&quot;&gt;
        &lt;xs:complexType&gt;
            &lt;xs:sequence&gt;
                &lt;xs:element name=&quot;result&quot; type=&quot;xs:decimal&quot;/&gt;
                &lt;xs:element name=&quot;errormessage&quot; type=&quot;xs:string&quot; minOccurs=&quot;0&quot;/&gt;
            &lt;/xs:sequence&gt;
        &lt;/xs:complexType&gt;
    &lt;/xs:element&gt;
&lt;/xs:schema&gt;
</pre><p><br /><strong>二、创建NetBeans工程</strong><br /><br />打开NetBeans，新建一个Web Application工程，并命名为SOAPWebServices。将上下文路径文本框清空，点击完成按钮。<br /><br />【个人注解】在这里创建工程时，请选择Tomcat 6作为服务器，否则后面的步骤可能会有所不同。<br /><br />依次进入菜单File-&gt;New File-&gt;Web Services，选择Web Service from WSDL。如果您找不到此菜单，那么需要先安装插件&ldquo;Web Service Plugin&rdquo;（Tools-&gt;Plugins-&gt;Available Plugins）。<br /></p><div><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/2d7ce422bf807cb54723e823.jpg" border="0" alt="" /></div><br />输入Web Services的名字ServiceImpl，包名为eu.jdevelop.soapwebservices.service，然后将WSDL文件输入框指向你先前创建的wsdl定义文件。<br /><br /><div><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/fe85ffc6e44e920a9c163d79.jpg" border="0" alt="" /></div><br />点击完成按钮。<br />下面是为你的Web Services定义正确的URL。打开sun-jaxws.xml，将其中的url-pattern属性设置为&ldquo;/soapwebservices&rdquo;。<br /><br /><div><a href="http://hiphotos.baidu.com/dianjinglong/pic/item/a757f9cf4c6ec32cf9dc6141.jpg" target="_blank"><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/abpic/item/a757f9cf4c6ec32cf9dc6141.jpg" border="0" alt="" /></a></div><div><br /><a href="http://hiphotos.baidu.com/dianjinglong/pic/item/d7521250731a897384352430.jpg" target="_blank"><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/abpic/item/d7521250731a897384352430.jpg" border="0" alt="" /></a></div>同样修改web.xml文件中相应位置。<br /><div><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/e4e83001f13faa12728da548.jpg" border="0" alt="" /></div><br />编辑index.jsp，将一下代码插入到&lt;body&gt;&lt;/body&gt;标签中：<br />&lt;jsp:forward page=&quot;soapwebservices&quot;&gt;&lt;/jsp:forward&gt;<br /><br />到这一步，就可以测试你的Web Services了。右击项目，选择清空并生成。然后运行项目。<br /><br />在浏览器中输入http://localhost:8080/，回车后可以看到测试效果。点击其中的 Information-&gt;WSDL链接，可以查看其WSDL和XML-Schema。 <div><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/pic/item/dae50554df2bac0e3b293525.jpg" border="0" alt="" /></div><br />下面就可以实现对应的业务逻辑了。<br /><strong>ServiceImpl.java</strong><br />=================<br /><span style="color: #808000">package eu.jdevelop.soapwebservices.service;<br /><br />import eu.jdevelop.soapwebservices.CalculateValues;<br />import eu.jdevelop.soapwebservices.CalculateValuesResponse;<br />import eu.jdevelop.soapwebservices.SOAPWebServices;<br />import eu.jdevelop.soapwebservices.wrapper.impl.CalculateValuesWrapper;<br />import javax.jws.WebService;<br /><br />/**<br />* This is the Service-Implementation of the Web Service. Here are the<br />* operations which can be called from web clients.<br />*<br />* @author Siegfried Bolz<br />*/<br />@WebService(serviceName = &quot;SOAPService&quot;, portName = &quot;WebServices&quot;, endpointInterface = &quot;eu.jdevelop.soapwebservices.SOAPWebServices&quot;, targetNamespace = &quot;soapwebservices.jdevelop.eu&quot;, wsdlLocation = &quot;WEB-INF/wsdl/ServiceImpl/webservices.wsdl&quot;)<br />public class ServiceImpl implements SOAPWebServices {<br /><br />&nbsp;&nbsp;&nbsp; public CalculateValuesResponse getCalculateValues(CalculateValues calculateValues) {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CalculateValuesWrapper wrapper = new CalculateValuesWrapper();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return wrapper.getResult(calculateValues);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception x) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new IllegalStateException(x);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br /><br />} // .EOF<br /></span><br /><br /><strong>ILogic.java</strong><br />=================<br /><span style="color: #808000">package eu.jdevelop.soapwebservices.logic;<br /><br />/**<br />* Use this interface to create logic-implementations for<br />* each web service operation.<br />*<br />* @author Siegfried Bolz<br />*/<br />public interface ILogic&lt;T, V&gt; {<br /><br />&nbsp;&nbsp;&nbsp; public T doAction(V var)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception;<br />} // .EOF</span><br /><br /><br /><strong>CalculateValuesLogic.java</strong><br />=================<br /><span style="color: #808000">package eu.jdevelop.soapwebservices.logic.impl;<br /><br />import eu.jdevelop.soapwebservices.CalculateValues;<br />import eu.jdevelop.soapwebservices.CalculateValuesResponse;<br />import eu.jdevelop.soapwebservices.logic.ILogic;<br />import java.math.BigDecimal;<br /><br />/**<br />* This implementation is normaly used for executing operations.<br />* Here we calculate some values.<br />*<br />* @author Siegfried Bolz<br />*/<br />public class CalculateValuesLogic implements ILogic&lt;CalculateValuesResponse, CalculateValues&gt;{<br /><br />&nbsp;&nbsp;&nbsp; public CalculateValuesResponse doAction(CalculateValues var) throws Exception {<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CalculateValuesResponse response = new CalculateValuesResponse();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * Simple addition of two values<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BigDecimal value1 = var.getValue1();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BigDecimal value2 = var.getValue2();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double sum = value1.doubleValue() + value2.doubleValue();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; response.setResult(BigDecimal.valueOf(sum));<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception x) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * On errors, return a valid bean with values. Do not send null!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CalculateValuesResponse errorResponse = new CalculateValuesResponse();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errorResponse.setResult(BigDecimal.valueOf(0.0));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errorResponse.setErrormessage(&quot;An error has occurred!&quot;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return errorResponse;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return response;<br />&nbsp;&nbsp;&nbsp; }<br /><br />} // .EOF</span><br /><br /><br /><strong>IWrapper.java</strong><br />=================<br /><span style="color: #808000">package eu.jdevelop.soapwebservices.wrapper;<br /><br />/**<br />* Use this interface to create wrapper-implementations for<br />* each web service operation.<br />*<br />* @author Siegfried Bolz<br />*/<br />public interface IWrapper&lt;T, V&gt; {<br /><br />&nbsp;&nbsp;&nbsp; public T getResult(V var)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception;<br />} // .EOF</span><br /><br /><br /><strong>CalculateValuesWrapper.java</strong><br />=================<br /><span style="color: #808000">package eu.jdevelop.soapwebservices.wrapper.impl;<br /><br />import eu.jdevelop.soapwebservices.CalculateValues;<br />import eu.jdevelop.soapwebservices.CalculateValuesResponse;<br />import eu.jdevelop.soapwebservices.logic.impl.CalculateValuesLogic;<br />import eu.jdevelop.soapwebservices.wrapper.IWrapper;<br /><br />/**<br />* The wrapper calls the logic-implementation. Exchange or modify<br />* the wrapper if you want to use other logic-implementations.<br />*<br />* @author Siegfried Bolz<br />*/<br />public class CalculateValuesWrapper implements IWrapper&lt;CalculateValuesResponse, CalculateValues&gt;{<br /><br />&nbsp;&nbsp;&nbsp; public CalculateValuesResponse getResult(CalculateValues var) throws Exception {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CalculateValuesLogic logic = new CalculateValuesLogic();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return logic.doAction(var);<br />&nbsp;&nbsp;&nbsp; }<br /><br />} // .EOF</span><br /><br /><br /><strong>三、测试</strong><br />从<a href="http://www.soapui.org/" target="_blank">http://www.soapui.org</a>下载&ldquo;soapui&rdquo;，然后安装并启动它。从实例中导入相应配置文件SOAPWebServices-soapui-project.xml。<br />打开&quot;Request1&quot;，并按下绿色按钮提交请求。<br />【个人注解】必要的时候，更改一下SOAPWebServices-soapui-project.xml中的端口配置。<br /><br /><div><a href="http://hiphotos.baidu.com/dianjinglong/pic/item/401902d47aecdb10a08bb709.jpg" target="_blank"><img class="blogimg" src="http://hiphotos.baidu.com/dianjinglong/abpic/item/401902d47aecdb10a08bb709.jpg" border="0" alt="" /></a></div><br />恭喜，你的Web Service就运行起来了！
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/178793#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 13:28:59 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/178793</link>
        <guid>http://mpkoo.javaeye.com/blog/178793</guid>
      </item>
      <item>
        <title>Stephan Janssen谈Parleys.com和RIA的前景</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/178668" style="color:red;">http://mpkoo.javaeye.com/blog/178668</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h1>Stephan Janssen谈Parleys.com和RIA的前景</h1><p class="info">作者 <strong>Jon Rose</strong>译者 <strong>王丽娟</strong> 发布于 2008年4月1日 下午7时23分 </p><img src="http://ectropic.com/images/parleys.jpg" height="385" align="right" alt="Parleys.com" width="500" />InfoQ.com和Stephan Janssen坐在一起讨论，向他了解了<a href="http://parleys.com/" id="q7iu">Parleys.com</a>的相关情况，并问了他对新兴的RIA平台的看法。Stephan创建了每年于比利时举办的<a href="http://www.javapolis.com/" id="x7lw">JavaPolis大会</a>。JavaPolis是目前仅次于JavaOne的第二大Java会议。Stephan还是Parleys.com的创始人和工程师主管。Parleys.com是一个RIA平台，用来发布视频、播客、幻灯片等诸如此类的在线学习资料。除了讨论Parleys.com，Stephan还跟InfoQ.com的读者分享了他对Adobe Flex/AIR、JavaFX、Google Web Toolkit（GWT）、以及Silverlight的看法。<br /><strong><br />你能</strong><strong>概述一下</strong><strong>Parleys.com吗？</strong><br /><blockquote><a href="http://parleys.com/" id="kecd">Parleys.com</a>是下一代的RIA电子学习平台，在这个平台上，人们能在浏览器里或是在桌面上观看视频讲座。现在，Parleys.com的默认频道提供来自JavaPolis、SpringOne、BeJUG、JavaBin、Jazoon、EclipseCon的一些优秀技术演讲视频。顶级品质的Java内容总共将近有200个小时。<br /><br />Parleys.com观众也能把这些讲座下载到本地磁盘离线观看，这是一个使用得越来越多的优秀特性。浏览器和桌面应用程序都能让你用全屏模式观看演讲，甚至能在观看时动态调整播放模板。播放时间轴可以让我们的观众添加注释、标签，并在需要的地方跳过幻灯片。你能在菜单栏选择自己喜欢的幻灯片演示设置（我自己喜欢3D Cube），或在自己的收藏列表中添加某个演讲、查看其它相关的演讲。<br /><br />浏览器和桌面应用程序之间无缝集成是一个很好的特性。比如说，你能从浏览器中启动桌面应用程序。桌面应用程序启动之后，如果你在浏览器下载某个演讲，它会被添加到桌面应用程序的下载队列中。这样当你从浏览器中观看演讲的时候，如果该演讲已经下载过，流数据就会由桌面程序负责从本地磁盘中取得。这会节省你的（还有我们的）一些带宽。<br /><br />另一个顶好的特性是后退按钮能正常工作，你还能对演讲中的某个特定的幻灯片进行深度链接。<br /></blockquote><strong>构建应用使用的技术是什么呢？架构是什么样的？</strong> <blockquote>浏览器版本我选的是Adobe Flex3，桌面客户端选用AIR。但由于服务器端设计为使用REST的服务层，所以我们可以很容易地添加其它技术类型的客户端。目前，我们正在并行地开展JavaFX客户端（它看起来非常有发展前景）、GWT、Silverlight的工作。对比较不同技术来说，这是一种有趣而有根据的检验。 </blockquote><strong>Parleys.com的架构是如何发展的？</strong> <blockquote>目前公布的Parleys.com版本（我们的第一个版本）是一个使用轻量级AJAX的Web应用，其中Flash和JavaScript在一起无缝协作。我们超过十万的用户很快提出了更多的RIA特性需求，像在全屏模式下观看演讲、观看过程中更换播放器模板、甚至下载演讲并离线观看。用DHTML和Ajax满足不了更进一步的需求，对此类客户端来说，考虑像Flex/AIR、JavaFX这类RIA技术会更有意义一些。在我必须决定选择哪种RIA技术的时候（2007年6月），JavaFX语言才刚刚发布。于是，合理而实际的选择就是从Adobe工具开始。 </blockquote><strong>你对Adobe AIR/Flex的总体印象是什么样的？</strong> <blockquote>作为一个Java开发人员，学习面向对象的ActionScript和UI标记语言实在是像公园散步般简单。但问题是（Java）开发人员不是设计人员，而设计人员需要这两项技能来使用RIA技术。这就是我对<a href="http://labs.adobe.com/wiki/index.php/Thermo" id="fd0v">Adobe的Thermo项目</a>感到非常兴奋的原因。它能在Photoshop设计人员和开发人员之间的鸿沟上架设一个桥梁（很令人兴奋的东西）。<br /><br />Flex和AIR的另一个优点是，你能选择不同的通讯策略&mdash;&mdash;比如XML、JSON、AMF（二进制格式）&mdash;&mdash;容易地与Java后端协同工作。Adobe甚至<a href="http://www.infoq.com/news/2007/12/blazeds" id="hj_g">（在07年的JavaPolis大会上）开源了他们名叫BlazeDS的远程产品（用Java开发）</a>，BlazeDS允许你从ActionScript访问服务器端Java服务。<br /><br />与Java比起来，Flex和AIR的不足之处是质量保证方面的工具不足。例如，ActionScript代码的静态分析（像FindBugs、PMD、Simian等）还不可用。<a href="http://www.infoq.com/news/2008/02/flex-3rd-party-tools" id="d7y3">Jetbrains最近在IDEA 7.0.3中添加了对Flex的支持</a>，我觉得是个惊喜。它让你使用代码分析器分析ActionScript代码，这是一个好的开始。不过，现在我还不确定是否要用Flex去开发一个超过500个屏幕显示的ERP应用。JavaFX对企业世界有很大影响也在于此。<br /><br />对嵌入式RIA应用来说，另一个机遇是要便于搜索引擎搜索。RIA内容能被搜索引擎索引是非常重要的，这样人们才能通过Google、Yahoo等搜索引擎查找到你的站点。你可以用一个并行的静态站点来方便搜索引擎，不过这样工作量太大了。我更喜欢用RSS Feeds或Atom Publisher协议的优势来达成一样的效果&hellip;&hellip;等我们试验成功之后我再告诉你。<br /><br />Flex和Java之间的&ldquo;交叉授粉作用&rdquo;说起来也很有意思。Annotation在Java中是主流。你能观察到Flex阵营也露出了类似的端倪。比如说，Flex的元数据标签就用于与Annotation类似的行为。因此可以想象注解过的Java EE 5实体通过类似技术被重用为ActionScript实体，并在客户端映射进SQLlite。<br /><br />我对Flex/AIR较高的期望有：<br /><ul><li>就个人而言，我希望在AIR未来的版本中能出现Socket监听器，因为如果不这样，AIR应用中要实现完全的P2P功能也许只能使用Hack。 </li><li>通过AIR文件部署Java应用也许会非常棒。这可以让我利用在Java中的投入。在我们头脑风暴的时后，还想过用Java语言开发Flex和AIR应用呢。 </li><li><span>让签名的</span>Flex应用摆脱Flash沙箱的束缚。 </li></ul></blockquote><strong>作为一个Java的</strong><strong>长期倡导者，社区是如何认可你对</strong><strong>Adobe AIR/Flex的深入研究？</strong> <blockquote>Parleys.com的Flex/AIR版本已在去年12月的JavaPolis 2007大会上发布。在那个主题演讲中，我说明了技术难题，但也解释了我们的观众要求的功能。<br /><br />2007年6月我们决定开发Parleys.com的一个RIA版本。我本来可以继续DHTML/AJAX路线，但我对版本1已经觉得非常痛苦了，我对Ajax的求知欲消失殆尽。2007年6月，选择JavaFX做为技术路线为时太早，而且由于我在Mac上开发，Silverlight也不可用。所以，合理的选择就是考虑Adobe Flex/AIR。服务器端仍然使用WebWork/Velocity、Spring和Hibernate来保持100%的Java。<br /><br />这一选择带来的好事儿就是我的一些Java同僚震惊于Flex版的发布，于是他们决定重用相同的后端开发一个JavaFX和GWT客户端。我必须要说这看起来非常有发展前景。我会在一场非正式的JavaOne技术讨论会中介绍这些不同的Parleys.com策略。<br /><a href="http://www.parleys.com/display/V21Beta/Home#title=Parleys.com%20V2%20BETA%20Program;talk=6553638;slide=1" id="pkeq"></a><br />你可以观看<a href="http://www.parleys.com/display/V21Beta/Home#title=Parleys.com%20V2%20BETA%20Program;talk=6553638;slide=1" id="pkeq">Parleys.com的主题演讲。</a><br /></blockquote><strong>JavaFX发布已经将近一年了，你有哪些</strong><strong>与此相关的</strong><strong>经验</strong><strong>呢？</strong><br /><blockquote>JavaFX的工具支持仍需要加强，但更重要的是，我希望Sun Microsystems也能着手处理Photoshop和JavaFX之间的鸿沟，以便开发人员和设计人员能够协作（就像Adobe正在计划做的那样）。支持主流的音频、视频编解码器是JavaFX获取成功的另一个重要特性。JavaFX要是想在RIA领域分一杯羹，把JavaFX应用作为Applets部署（运行在JRE update N）、具有与Flash一样的（冷/热）启动体验也是至关重要的。希望下一届JavaOne大会上能提供相关信息。 </blockquote><strong>作为一个平台，</strong><strong>你认为JavaFX在正确的轨道上吗？它要取得成功必须实现的关键项目是什么？</strong><br /><blockquote>JavaFX的优势当然是成熟的Java平台和快速的运行时环境，尤其是JavaFX代码编译之后。我发现重新设计现有的（企业）Swing应用有巨大的商机，MVC中的视图部分可以使用更好看的JavaFX皮肤来替换。<br /><br />如果JavaFX Mobile允诺的那些都能实现，JavaFX也能得到巨大的推进。Java（FX）、AIR、Silverlight，谁第一个应用于iPhone，让我们拭目以待。 </blockquote><strong>你对GWT的印象如何？你对于把Java编译成JavaScript有什么疑虑吗？</strong> <blockquote>体验了DHTML/Ajax处理多浏览器/多操作系统的痛苦之后，我越来越欣赏GWT的策略。<br /><br />我们已经有了Parleys.com客户端的第一个GWT原型。它看起来很不错，而且在不同的浏览器和操作系统上不需要调整。Google的确实现了他们的承诺，以Google中汇集的脑力是理所当然的。<br /><br />开发新的组件有点儿挑战，我希望活跃的GWT社区能继续成长并发布更多的UI组件。发布GWT版本之后我们会关注观众们更喜欢哪一个客户端。我会让你保持消息灵通的。<br /></blockquote><strong>你花时间研究过</strong><strong>Silverlight吗？对它的总体印象如何？</strong> <blockquote>我安装过Silverlight的版本1和版本2早期的一个Beta版。Demo确实能在Mac上的Firefox中运转，除此之外就没什么值得提的了。看看Dolmen公司中负责Microsoft技术的同事能给我带来什么惊喜吧&hellip;&hellip;我可没给你们压力啊 ;) </blockquote><strong>你认为，或者说希望</strong><strong>一年半之后RIA领域会怎样呢？<br /></strong><blockquote>看DHTML/Ajax阵营是否能像RIA那样进取。GWT将会在这场较量中扮演重要的角色。一年半之后，我们也许就有了Flex4和AIR2。到那个时候，Photoshop设计人员先绘制出原型，Flex开发人员在上面添加一些逻辑就可以收官了。由于未来因特网和电视之间的趋同，我们将能制造类似iTunes的应用，在各种操作系统（包括Linux）上在线或离线播放HD交互式视频。<br /><br />一年半之后，我应该已经知道Adobe AIR和/或Java（FX）是否运行在iPhone上，还有JavaFX Mobile的承诺能不能落实&hellip;&hellip;美妙的时刻！ </blockquote>Parleys.com是一个真正的Web 2.0应用。希望InfoQ.com社区能借鉴Parleys.com构建过程中的经验，因为它就像领先的RIA平台相互较量的一个实验台。让我们看看什么技术能使Stephan成功，还有他的团队最终会为Parleys.com选择什么技术做为他们的主平台。 <br /><span><strong>查看英文原文：</strong></span><a href="http://www.infoq.com/news/2008/03/stephan-janssen-parleys-ria" title="Stephan Janssen On Parleys.com And The RIA Landscape" id="lxjc"><span style="color: #551a8b">Stephan Janssen On Parleys.com And The RIA Landscape</span></a> 
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/178668#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 09:37:11 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/178668</link>
        <guid>http://mpkoo.javaeye.com/blog/178668</guid>
      </item>
      <item>
        <title>过程组件模型——下一代工作流？</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/178664" style="color:red;">http://mpkoo.javaeye.com/blog/178664</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="info">作者 <strong>Floyd Marinescu</strong>译者 <strong>戴垚</strong> 发布于 2008年4月1日 上午2时35分 </p><p class="info">&nbsp;</p><p>在这篇最新的InfoQ文章中，JBoss jBPM 的缔造人和领导者Tom Baeyens总结了工作流&amp;BPM标准和工具的现态。在详细探讨了BPEL，BPMN和其他技术（如，编排、XPDL、BPDM、jPDL）之后，Tom指出：期望不懂技术的业务分析员通过画图来产生马上可用的软件的念头到了该抛弃的时候，将过程分析模型和过程执行模型分离的时机已经成熟。这种分离正是jBPM的基础（见<a href="http://jbpm.org/pvm" id="p31w">过程虚拟机</a>），Tom提出的主张和微软的工作流所采用的方法有颇多相似之处。</p><p><strong>阅读全文：</strong><a href="http://www.infoq.com/articles/process-component-models">过程组件模型：下一代的工作流？</a></p><p>在进一步探讨将执行框架从过程框架中分离出来的时候，Tom解释说：</p><blockquote>首先，可以观察到的是在同一活动组件框架上可以实现多个过程语言。每一个过程语言由多个活动类型组成。对于每一个活动类型，运行时行为可以用诸如Java或c#这样的通用编程语言实现。因此可执行过程语言就成为了一组活动类型的实现。这种活动组件最重要的部分是实现过程结构运行时行为的代码。但同时XML序列化，配置过程组件的设计窗体，持久化和许多其他部分都可能被包括在过程结构组件中。</blockquote><p>很多其他BPM框架提供者，包括Sun中间件&amp;标准大师Mark Hapner，都已经对此文发表了评论。</p><p><strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2008/02/process-component-models" title="Article: Process Component Models: The Next Generation In Workflow?">Article: Process Component Models: The Next Generation In Workflow?</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/178664#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Apr 2008 09:32:39 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/178664</link>
        <guid>http://mpkoo.javaeye.com/blog/178664</guid>
      </item>
      <item>
        <title>在.NET与Java间进行Web Service交互的新选择</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/178509" style="color:red;">http://mpkoo.javaeye.com/blog/178509</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="info">作者 <strong>Boris Lublinsky</strong>译者 <strong>张海龙</strong> 发布于 2008年3月31日 上午4时9分 </p><p class="info">&nbsp;</p><p id="w2ao">谈到.NET和Java之间的Web服务交互性时，通常的选择只有SOAP over HTTP，而根据.NET 3.0的相关规范，这仅有的一个选择也将会受到更多限制，.NET中提供的BasicHTTP将是唯一能直接与Java Web Servcies进行交互的方式。 </p><p id="ezon">最近，有两个新的选择出现了&mdash;&mdash;WebSphere MQ（WMQ）和ActiveMQ传送器，它们可以用于创建Java和.NET之间的交互式Web Services。而且.NET的可靠消息系统已经得到了扩展，因此对于MSMQ来说，WMQ和Active MQ都可以作为.NET Web Services的可靠传递者。 </p><p id="rrw4"><a href="http://www.alphaworks.ibm.com/tech/mqwcf" title="WMQ解决方案" id="ps8r">WMQ解决方案</a>基于IBM AlphaWorks中IBM WMQ for Windows Communication Foundation的定制通道（Custom Channel），它的最新版本已于3月14日发布。这一产品允许将WMQ作为定制通道用于Windows Communication Foundation（WCF）框架（已随.NET Framework 3提供）中，它与微软的内建通道工作方式相同。 </p><p id="q9ta">消息都是经过格式化的，以满足WMQ v6.0的SOAP over JMS实现，让应用程序即可以和运行于WCF之上的服务进行通信，也能和运行在WebSphere SOAP over JMS服务基础之上的服务进行通信，包括WebSphere应用服务器和CICS。 </p><p id="uro8">目前的实现是以概念验证为主，是为了帮助更好地理解对这一领域产品的需求（也就是说它并不适合在产品环境中使用），如何产品化这一实现的计划还没有最终确定。 </p><p id="d25.">定制通道的构建是通过Windows Communication Foundation的可扩展框架提供的，这一可扩展框架允许集成和使用那些与微软提供的内建传送器类似的传送器。服务型应用只要通过配置就可以使用新的定制通道，只要客户端应用程序是通过像微软的Service Metadata utility Tool（Svcutil.exe）这样的标准工具生成的，它们就可以正常运行。服务的元数据描述可以被正在运行的服务直接发布（可以通过一个附加的HTTP端点来暴露）或者使用WSDL（Web Service Description Language）。 </p><p id="jpcp">目前的实现版本支持核心的消息功能，它有如下限制：</p><ul><li>对于一个服务实例，只有一个客户端可以使用双向通道的模式； </li><li>双向通道是对WebSphere MQ v6所提供的SOAP/JMS实现的一种扩展，它只能用于WCF服务与其客户端之间的通信； </li><li>仅支持核心的消息功能（如不支持像事务化和安全等高级特性） </li><li>运行在现存WMQ v6的SOAP/JMS环境中的SOAP/JMS服务仅能进行单向操作； </li><li>运行在CICS或WebSphere应用服务器的SOAP/JMS环境内的SOAP/JMS服务，不允许在一个单一合约中混合使用单向操作和请求/回复操作，而必须为每个通道形态分别创建独立的合约。 </li></ul><p id="xvw3"><a href="http://dotnet.sys-con.com/read/502488.htm" title="Java &amp; .NET: SOAP Over JMS Interoperability @ .NET DEVELOPER'S JOURNAL" id="h4om"></a><a href="http://dotnet.sys-con.com/read/502488.htm" title="Active MQ解决方案" id="xcdo">Active MQ解决方案</a>基于Axis提供的JMS（由Java编写而成）和&ldquo;插件式协议&rdquo;特性（由.NET编写而成），因此，它并不是以真正的.NET定制通道方式包装的，这就需要更多的定制编程。 </p>这两种解决方案都没有彻底的产品化，但它们却提供了一个很好实验基础，以选择合适的Web Services交互式传送器。<br /><p id="djd:"><span><strong>查看英文原文</strong></span>：<a href="http://www.infoq.com/news/2008/03/wmq-activemq-interop" title="New Options for .NET-Java Web Services Interoperability" id="h:0d">New Options for .NET-Java Web Services Interoperability</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/178509#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 17:40:24 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/178509</link>
        <guid>http://mpkoo.javaeye.com/blog/178509</guid>
      </item>
      <item>
        <title>RubyGems发布1.1.0版本，已能够工作在Rubinius之上</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/178503" style="color:red;">http://mpkoo.javaeye.com/blog/178503</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="info">作者 <strong>Werner Schuster</strong>译者 <strong>高昂</strong> 发布于 2008年3月31日 下午11时4分 </p><dl class="tags2"><dt class="community">RubyGems的开发者<a href="http://blog.segment7.net/">Eric Hodel</a>公布了<a href="http://blog.segment7.net/articles/2008/03/29/rubygems-1-1-0">RubyGems 1.1.0版本发布的消息</a>。（关于RubyGems过去、现在、未来发展的讨论，可以参看<a href="http://www.infoq.com/interviews/eric-hodel-on-rubygems-and-the-ruby-community">InfoQ在RubyConf 2007大会上对Eric Hodel所做的采访</a>）。 <br /><br />新版RubyGems的特性包括：</dt></dl><blockquote><ul><li>在索引更新方面，RubyGems现在使用了持久连接，使得索引更新方面的效率更高。 </li><li>默认情况下，RubyGems仅从默认的索引进行更新，目前从更新列表中去除的候选gems大约在1/4左右。实际的索引更新比这要快的多。 <ul><li><span style="font-family: Courier New">gem list -r</span>命令可以只显示最新的gem版本，使用参数--all可以查看所有的gem包。 </li></ul></li><li><span style="font-family: Courier New">gem spec</span>可以从.gem文件中提取规范说明。 </li><li><span style="font-family: Courier New">gem query --installed</span>用来辅助检查gem包进行的自动操作。 </li></ul></blockquote><p>全部的特性更改可以查看<a href="http://rubygems.rubyforge.org/svn/tags/REL_1_1_0/ChangeLog">1.1.0版本的修改记录</a>。</p><p>最为简便的更新方法就是使用命令（参照发布说明）：</p><pre>gem update --system  （你需要admin或root的权限） </pre>注意：如果你在使用旧的RubyGems版本（低于0.8.5），Eric建议你使用命令： <pre>gem install rubygems-update （当然，你需要admin或root的权限） 
update_rubygems             （这里也需要admin或root的权限） </pre>或简单的<a href="http://rubyforge.org/frs/?group_id=126">在RubyForge上下载RubyGems 1.1.0</a>，之后进入到解压缩后的目录中执行： <pre>ruby setup.rb （你需要具备admin或root的权限）  </pre>在与此相关的新闻中，比方说Eric在<a href="http://www.infoq.com/news/2007/12/engine-yard-bets-big-rubinius">Engine Yard押宝Rubinius</a>一文中的报道，Eric已经在为RubyGems可以运行在Rubinius之上而努力。正如<a href="http://www.novemberain.com/2008/3/28/state-of-rubygems-on-rubinius">Michael Klishin关于在Rubinius上通过RubyGems安装Rails的文章</a>所写，这些努力看起来已经有了不小的进展，随后Eric也宣布<a href="http://blog.segment7.net/articles/2008/03/11/au-sprint">Gems已经包含在Rubinius之中</a>: <blockquote>Lincoln Stoll帮助我从RubyGems中去除最后的几个bug之后，我们将其整合在Rubinius之中。我们决定就像rbx编译或rbx描述一样，让它成为一个rbx gem子命令。目前仍然有一些小的不足存在于RubyGems之中，也就是由于mkmf.rb目前还无法工作在Rubinius之上，所以使用拓展来安装gems还存在问题。<br /><br />Lincoln同样也发现并修补了RDoc在向后兼容性方面的几个问题，所以目前RubyGems和RDoc都可以顺利工作在Rubinius之上。 </blockquote><strong>查看英文原文：</strong><a href="http://www.infoq.com/news/2008/03/rubygems-1dot1-rubinius">RubyGems: 1.1.0 released, now works on Rubinius</a> 
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/178503#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Apr 2008 17:30:01 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/178503</link>
        <guid>http://mpkoo.javaeye.com/blog/178503</guid>
      </item>
      <item>
        <title>工作流学习参考网站</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/150432" style="color:red;">http://mpkoo.javaeye.com/blog/150432</a>&nbsp;
          发表时间: 2007年12月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          国外：<br />http://www.workflowpatterns.com<br />资料非常全，包括各种工作流模式，每种模式有演示动画。<br />业界著名产品的支持程度，相关的标准链接.<br /><br />国内：<br />http://blog.csdn.net/james999
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/150432#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/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Dec 2007 11:34:49 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/150432</link>
        <guid>http://mpkoo.javaeye.com/blog/150432</guid>
      </item>
      <item>
        <title>IntelliJ.IDEA.v7.0 破解</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/133841" style="color:red;">http://mpkoo.javaeye.com/blog/133841</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">IntelliJ.IDEA.v7.0正式版 破解出来了，呵呵</font></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/133841#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Oct 2007 18:58:55 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/133841</link>
        <guid>http://mpkoo.javaeye.com/blog/133841</guid>
      </item>
      <item>
        <title>我理解的soa</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/100451" style="color:red;">http://mpkoo.javaeye.com/blog/100451</a>&nbsp;
          发表时间: 2007年07月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          什么是soa，能解决什么问题？我相信很多人都不是很清楚，前两天参加了soa构架师培训，下面就根据我对soa的理解，阐述一下什么是soa，soa可以做什么？<br /> soa是一种手段，解决问题的手段，也可以说是一种解决方案。<br />soa可以集成异构系统的，这里说集成异构系统，也不是说所有的异构系统都可以集成，而是集成对于业务提供了webservice接口的系统。<br /> 其实soa就是基于webservice的，soa不仅仅是为了集成异构系统，也是为了应对快速变化的业务流程变动。<br />在soa的实施中需要了解以下几个概念及其功能（个人理解）：<br /><br /><strong>esb（企业服务总线）：</strong>就是一个把个个需要集成的系统的webservice注册到该esb上面，然后由esb包装成统一的对外的接口。<br /><br /><strong>bpm（流程设计）：</strong>通过设计器，把esb中的webservice根据业务流程串起来<br /><strong>process server（流程服务器）：</strong>把设计好的流程发布到该服务器上，在此服务器上面运行流程。<br /><br />对于soa相关的webservice事务，性能，安全，这里省略了。<br />根据上面所述，soa要集成异构系统，必须是系统提供了相关业务功能的webservice接口。<br />当业务有变化时候，只需要修改流程重新部署到流程服务器上就可以了，对业务变化提供快速响应<br />bea，ibm，microsoft都有成熟的相关产品。<br /><br /><br />我这里有些文档，需要联系我的msn：xzy_msn在163的邮箱
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/100451#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jul 2007 16:23:23 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/100451</link>
        <guid>http://mpkoo.javaeye.com/blog/100451</guid>
      </item>
      <item>
        <title>今天递交了辞职报告，大家看看值不值得？？</title>
        <author>xzy_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://mpkoo.javaeye.com">xzy_love</a>&nbsp;
          链接：<a href="http://mpkoo.javaeye.com/blog/60087" style="color:red;">http://mpkoo.javaeye.com/blog/60087</a>&nbsp;
          发表时间: 2007年03月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          简单说明：05年毕业，一直做java，现在是第二家公司。<br /><br />     刚刚发送辞职报告给经理，心里空空的，我希望早些结束交接，奔向新的工作，虽然不知道新的工作在那里。<br /><br />     辞职的原因包括一下几方面，大家分析分析是否值得：<br />1、前几周一次开内部设计评审会，和我们老大争论一个问题，弄的我们部门经理（涨工资什么的还全靠他说了算的）很没有面子，在最近几周发现一些重要的工作不再交给我做了。我自己断送了自己在该公司的发展。<br />2、进这家公司一年多了，进来的时候说半年加薪一次，可是现在我要求加薪，经理说要等指标，靠 ，什么年代了，还要等指标。再说今年公司效益不好，我看加薪希望不大，就是加薪，最多加500，满足不了我的胃口。呵呵<br />3、现在是我在这家公司参与的第二个项目，两个项目做的都很郁闷。并且做系统集成也不是我自己的发展方向，我比较喜欢做业务系统，也算是一种积累。
          <br/>
          <span style="color:red;">
            <a href="http://mpkoo.javaeye.com/blog/60087#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Mar 2007 17:12:16 +0800</pubDate>
        <link>http://mpkoo.javaeye.com/blog/60087</link>
        <guid>http://mpkoo.javaeye.com/blog/60087</guid>
      </item>
  </channel>
</rss>