<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>                                                                                       和老庄去钓鱼</title>
    <description></description>
    <link>http://wangpx.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>有感于《软件设计与哲学,做人 》</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/187474" style="color:red;">http://wangpx.javaeye.com/blog/187474</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天读了《软件设计与哲学,做人》<a href="http://www.jdon.com/jivejdon/thread/33237.html">http://www.jdon.com/jivejdon/thread/33237.html</a>这个帖子，感觉程序员既要务实，也要务虚，务实就是实实在在的做技术多实践，务虚就是多多研究理论，用理论来指导实践，用实践来验证理论。只要这样 虚虚实实，才能在软件这行有长足发展。笔者曾经一度迷恋技术，认为技术就是一切，忽略了理论虚的这一面的学习和研究，这种思想曾经给自己带来很多无谓的麻烦和困扰。理论和实践两者不可偏废，就如硬币的两个面一样。搞技术的人一定要多看看《老子》《周易》等这些哲学书籍，这样可以使自己的眼光不至于过于浅显，使自己不管是做技术还是做人不过于拘泥一某个点某个教条，进而 成了书呆子。《周易》告诉我们变是万物的根本，我们时时刻刻都要应对瞬息变化的事物，同样，软件的需求其实也在变化，我们的软件也要应对变化。因此我们要用周易的理论来指导我们软件的设计开发，用老子的道理论来指导我们的软件设计开发，这样不失为一种很好的方法。要想很好的运用《老子》《周易》的理论思想，必须做到 《老子》生活化，《周易》生活化，《老子》工作化，《周易》工作化，《老子》生活化，《周易》生活化，《老子》技术化，《周易》技术化。生活《老子》化，生活《老子》化，工作《老子》化，工作《周易》化，技术《老子》化，技术《周易》化。简而言之，就是把《老子》《周易》融入我们的生活，工作，思维，技术中。让我们的生活，工作，思维，技术中处处体现着《老子》《周易》思想。</p>
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/187474#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, 28 Apr 2008 11:26:33 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/187474</link>
        <guid>http://wangpx.javaeye.com/blog/187474</guid>
      </item>
      <item>
        <title>摘洋槐花</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/187361" style="color:red;">http://wangpx.javaeye.com/blog/187361</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>今天上午比较忙 ，下午回到家里感觉有些累，躺到床上就睡着了，醒来时发现已经5点了，突然想起来紫金山上洋槐花已经开了，小时候在老家还摘过，好多年都没有吃过洋槐花做的蒸闷饭了，那个香啊，童年的美好时光又浮现在眼前，早上还打算着要摘些回来做饭吃，现在还没有行动呢。马上穿上衣服上山摘槐花，紫金山就离家不到300米的地方，几分钟就到了，看着高高的洋槐树，怎么摘呢，难道真的要爬树么，这样会把衣服弄得很脏而且很费力气了。先走走看看，看看是不是有比较矮的树，这样我就可以不必要花很大力气了，正在边走边转悠，突然发现在草丛中淹没着一个用来勾洋槐花的竹竿，哈哈，上天作美啊，得来全不费功夫啊，有了勾洋槐花的竹竿，摘槐花就不难了。正好看到远处一个比较容易勾的树，这个树上槐花繁茂，而且有几个树枝不高不粗，很容易勾。举起竹竿，勾住一个树枝，用力拉了一下，没有想到，竹竿上的铁丝钩太软，被拉直了，我只好把铁丝拧成麻花状，这样就硬些，然后再折成钩，再举起竹竿，勾住那个树枝，这次吸取教训 不能用力太猛，慢慢的拉下来，树枝慢慢的弯了下来，越来越弯，突然啪的一声，树枝终于断了，在用力拉一下，终于掉下来。这时候想到妻加班也快到家了吧，让她一起帮忙摘槐花，打电话正好她到小区，告诉妻后，我想这个树枝可能不够我们吃，再勾一个树枝吧。这时候在远处发现两个女子，她们也在摘槐花，不过她们没有工具，只是用脚垫起来伸着脖子去摘，但是由于树都很高，她们也没有摘多少，不一会她们走过来，一人拎着一个大袋，里面有少许槐花，一个说能不能用我这个竹竿借她们也勾一下，我欣然答应，告诉她们，等我把下一个树枝钩下来，就给她们，第二个树枝一会就勾下来了，这时候妻已经到了，我把袋子给她，让她先摘，我帮那两个人勾几个树枝后就回来一起摘，后来由于那个铁丝钩又软了，怎么也勾不下一个树枝，再看看妻那边，摘了半袋了，树枝上槐花还有很多，反正我们也摘不完，就请那两个女子一起摘，不一会我们的那个袋子就摘满了，我和妻开心的回家了。靠山吃山，靠氺吃水，这句话真没错。昨天晚上在阅读菜根谭时，书上说道要做到静，单纯的静其实很难做到，但是如果能寄情于物，全身心投入到某个事物上，并从中找到乐趣，反倒很容易入静，这就是借物以养心之静力，我想傍晚摘槐花难道不是寄情于物和借物以养心之静力吗？</p>
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/187361#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, 27 Apr 2008 21:27:57 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/187361</link>
        <guid>http://wangpx.javaeye.com/blog/187361</guid>
      </item>
      <item>
        <title>XFire 入门--轻松将 POJO 发布成 Web 服务2(转载)</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/186843" style="color:red;">http://wangpx.javaeye.com/blog/186843</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a name="N101A4"><span class="atitle"><span style="font-size: large;"><strong>将 POJO 发布成 Web 服务</strong></span></span></a></p>
<p>XFire 框架中，我们有两种方式将 POJO 发布成 Web 服务：</p>
<ul>
<li>一种方式是直接使用 Web 服务接口和 Web 服务实现类（POJO）来发布； </li>
<li>另一种方式是基于 JSR181 标准和注释技术将被注释的 POJO 发布成 Web 服务； </li>
</ul>
<p>下面的章节中我们将学习使用第一种方式来完成 POJO 的 Web 服务发布。我们将使用经典的 &rdquo;Hello World!&rdquo;例子来演示将 POJO 发布成 Web 服务所需要的步骤，不过我们不再是简单的访问一个 Java 方法来输出 &rdquo;Hello World!&rdquo;字符串，而是转为在 SOA 环境下实现：Web 服务客户端通过访问服务器端发布成 Web 服务的 POJO 获得返回的 &rdquo;Hello World!&rdquo;字符串后输出到客户端的控制台上。</p>
<p>将 POJO 发布成 Web 服务的基本步骤如下：</p>
<ol>
<li>创建 Web 服务接口，声明该 Web 服务对外暴露的接口； </li>
<li>创建 Web 服务实现类，为 Web 服务接口提供实现； </li>
<li>修改 XFire 框架的服务发布文件 ---- services.xml，将 POJO 发布成 Web 服务。 </li>
</ol>
<p>下面我们通过创建 &rdquo;Hello World!&rdquo;例子来具体说明如何实现这三个步骤。</p>
<p><a name="N101CB"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1．创建 Web 服务接口 ---- HelloWorldService</span></strong></span></a></p>
<p>要将 POJO 发布成 Web 服务，首先需要创建 Web 服务接口，在接口中声明该 Web 服务需要对外暴露的接口。</p>
<p>我们根据需要创建 Web 服务接口 &rdquo; HelloWorldService&rdquo;，在其中声明一个 &rdquo;sayHello&rdquo;方法，该方法返回 &rdquo;String &rdquo;类型的内容。&rdquo; HelloWorldService&rdquo;接口对应的 Java 文件代码如 <a href="../#code13"><span style="color: #996699;">清单 1-3</span></a>。</p>
<p><a name="code13"><strong>清单 1-3 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldService.java</strong></a></p>
<pre name="code" class="java">package org.vivianj.xfire.pojo;

 /**
 * HelloWorldService 中声明需要发布成 Web 服务的所有 Java 方法 
 * HelloWorldService 作为Web服务接口
 */
 public interface HelloWorldService {
	/**
	     * sayHello 方法声明了 Web 服务对外暴露的接口
	 * 
	 * @return 返回给客户端的字符串
	 */
	public String sayHello();
}
</pre>
<p>&nbsp;</p>
<p><a name="N101E3"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2．创建 Web 服务实现类 &rdquo;HelloWorldServiceImpl&rdquo;</span></strong></span></a></p>
<p>创建 Web 服务实现类 &rdquo;HelloWorldServiceImpl&rdquo;，它继承 <a href="../#h1"><span style="color: #996699;">&rdquo;1、创建Web服务接口 ---- HelloWorldService&rdquo;</span></a> 中创建的 HelloWorldService 接口，并且为它声明的 &rdquo;sayHello&rdquo;方法提供具体实现： 返回字符串&rdquo;Hello World!&rdquo;。 &rdquo;HelloWorldServiceImpl&rdquo;类对应的 Java 文件代码如 <a href="../#code14"><span style="color: #996699;">清单 1-4</span></a>。</p>
<p><br /><a name="code14"><strong>清单 1-4 WEB-INF\classes\org\vivianj\xfire\pojo\HelloWorldServiceImpl.java</strong></a></p>
<pre name="code" class="java">package org.vivianj.xfire.pojo;

/**
 * HelloWorldServiceImpl 中为 Web 服务接口中声明的所有 Java 方法提供具体实现 
 * HelloWorldServiceImpl 作为 Web 服务的实现类
 */
public class HelloWorldServiceImpl implements HelloWorldService {

	/*
	 * sayHello 方法为 HelloWorldService 服务接口定义的 sayHello 方法提供具体实现
	 *  
	 * @see org.vivianj.XFire.pojo.HelloWorldService#sayHelloToXFire()
	 */
	public String sayHello() {
		return "Hello World!";
	}

}
</pre>
<p>&nbsp;</p>
<p><a name="N101FC"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">3．修改 services.xml，将 POJO 发布成 Web 服务</span></strong></span></a></p>
<p>我们可以在 WEB-INF\classes\META-INF\XFire\services.xml 文件中的 &lt;beans &hellip;&gt; 和 &lt;/beans&gt; 元素中间加入如下的 xml 内容将上面创建的 HelloWorldService 发布成 Web 服务。</p>
<pre name="code" class="xml">&lt;service&gt;
	&lt;name&gt;HelloWorldService&lt;/name&gt;
	&lt;namespace&gt;http://vivianj.org/HelloWorldService&lt;/namespace&gt;
	&lt;serviceClass&gt;
		org.vivianj.xfire.pojo.HelloWorldService
	&lt;/serviceClass&gt;
	&lt;implementationClass&gt;
		org.vivianj.xfire.pojo.HelloWorldServiceImpl
	&lt;/implementationClass&gt;
&lt;/service&gt;
</pre>
<p>&nbsp;</p>
<p>其中各元素的功能如下：</p>
<ul>
<li><strong>service</strong>
<p>service 标签和它所包含的 xml 内容为发布成 Web 服务的 POJO 提供完整的描述。</p>
</li>
<li><strong>name</strong>
<p>Web 服务被发布时所采用的唯一名称。</p>
</li>
<li><strong>namespace</strong>
<p>Web 服务发布时所使用的命名空间。</p>
</li>
<li><strong>serviceClass</strong>
<p>Web 服务接口类的全名，包括包名和类名。</p>
</li>
<li><strong>implemetationClass</strong>
<p>Web 服务实现类的全名，包括包名和类名。</p>
</li>
</ul>
<p>更多 service 元素的子元素和它们的用法请参考 <a href="http://xfire.codehaus.org/services.xml+Reference"><span style="color: #5c81a7;">XFire 站点</span></a>。</p>
<p>通过上面的三个步骤，我们已经将新创建的HelloWorldService发布成了Web服务，我们可以使用下面的步骤测试一下创建的Web服务是否能够正常运行：</p>
<ol>
<li>编译上面的步骤中创建的 Java 接口和类； </li>
<li>启动 TOMCAT 服务器。 </li>
<li>等 TOMCAT 服务器完全启动后，打开浏览器，在地址栏中输入 http://localhost:8080/XFire/services/HelloWorldService?wsdl。 </li>
</ol>
<p>其中 HelloWorldServcie 是配置文件中 service\name 元素所定义的内容，&rdquo;wsdl&rdquo;参数表示查看该 Web 服务的 WSDL（Web服务描述语言）文件。</p>
<p>如果浏览器中出现如下图所示类似的内容，表示 Web 服务发布成功，我们可以编写客户端访问该 Web 服务从服务器获取返回字符串，本文下载资源中提供的下载文件中包含有可供参考的客户端类 org.vivianj.xfire.pojo.client.HelloWorldServiceClient。</p>
<p><br /><a name="N10259"><strong>图：浏览器中访问效果</strong></a><br /><img src="http://www.ibm.com/developerworks/cn/java/j-lo-xfire/fig001.jpg" height="415" alt="" width="554" /></p>
<p>如果浏览器中出现错误提示，请按照上面的步骤和说明检查已经完成的开发、配置过程是否完全正确。</p>
<p><br />
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
</tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle">&nbsp;</td>
<td align="right" valign="top"><a href="../#main" class="fbox"><strong></strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</p>
<p><a name="N10266"><span class="atitle">结束语</span></a></p>
<p>本文中作者首先讲解了 XFire 框架的主要特性，XFire 框架的运行环境以及基于 XFire 框架开发 SOA 应用的基本步骤，并且借助于 SOA 环境下的 &rdquo;Hello World!&rdquo;例子，详细的讲解和演示了如何基于 XFire 框架、经过简单的开发、配置步骤就将一个 POJO 类中包含的方法发布成Web服务。从 &rdquo;Hello World!&rdquo;例子实现的过程中，我们可以发现 XFire 框架最大化的发挥了 POJO 的作用，减少了 SOA 实施时对框架本身的依赖，降低了 SOA 实施的难度，企业实施 SOA 时并不需要增加太多的投入就可以实现目标。</p>
<p><br /><br />
<table cellspacing="0" border="0" width="100%" cellpadding="0">
<tbody>
<tr>
<td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td>
</tr>
</tbody>
</table>
<table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0">
<tbody>
<tr align="right">
<td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br />
<table cellspacing="0" border="0" cellpadding="0">
<tbody>
<tr>
<td valign="middle"><br /></td>
<td align="right" valign="top"><a href="../#main" class="fbox"><strong></strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/186843#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, 25 Apr 2008 16:28:31 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/186843</link>
        <guid>http://wangpx.javaeye.com/blog/186843</guid>
      </item>
      <item>
        <title>XFire 入门--轻松将 POJO 发布成 Web 服务1(转载)</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/186807" style="color:red;">http://wangpx.javaeye.com/blog/186807</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java 社区一直试图将 POJO 的作用发挥到极致，降低 Java 应用实现的难度，最近的尝试是将 EJB3.0 建立在 POJO 之上；另一方面，SOA 是目前 Java 社区炙手可热的名词，非常多的企业都在努力应用和实施 SOA；XFire 为这两方面的需求提供了一种魔术般的解决方式，我们很快能够发现使用 XFire 创建和发布 Web 服务可以直接基于 POJO，将烦人的继承关系和一大堆其他可能的约束丢在一边。</p>
<p><span style="font-size: small;">&nbsp;</span><a name="N10057"><span class="atitle"><span style="font-size: large;"><strong>POJO、SOA 概述</strong></span></span></a></p>
<p>&nbsp;&nbsp;<span style="font-size: small;"> </span><a name="N1005D"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">被重新审视的 POJO</span></strong></span></a></p>
<p>&nbsp;POJO（Plain Old Java Object，简单 Java 对象）是 Java 社区中最早的成员（回想您学习 Java 时第一个兴奋的时 刻，那个简单的 "Hello World！" 例子），也是最简单、最容易实现的方式。</p>
<p>然而现实中 Java 的发展已经远远超越了 POJO 的范围，成为面向对象技术应用中最成功的编程语言，尤其是继承、多态的应用为我们造就了一大批开发框架（如 Struts）和标准（如 EJB），随之而来的就是实现的复杂化，我们必须面对一大堆继承关系的限制。比如说：要开发一个基于 Struts 的应用，我们必须了解 Struts 特定的继承关系如 ActionForm、ValidateActionForm；要开发一个 EJB 应用，我们必须继承 EJBObject、SessionEJB 等。</p>
<p>为了抛开这些限制，降低 Java 应用实现的难度，Java 社区开始重新审视 POJO 的价值，试图将 POJO 的作用发挥到极致，最新的努力是 EJB3.0。Java 社区将 EJB3.0 设计为基于 POJO，而不是为他准备更多的继承关系等限制。</p>
<p><a name="N1006B"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">让人爱恨交加的 SOA</span></strong></span></a></p>
<p>SOA 已经成为了目前 Java 社区中炙手可热的名词，几乎所有的软件厂商都在讨论它，为他提供解决方案和产品支持，大部分的企业也已经在企业内部实施或者正在考虑实施 SOA。</p>
<p>然而 SOA 在企业内的实施却不是一项简单的任务，即使抛开新建系统直接基于 SOA 架构实施的因素，要把企业已有系统纳入 SOA 框架也不是一件容易的事情。企业必须在对当前架构深入了解的基础上，对已有系统进行大规模的改造才能满足新的要求。如何经济的从原有技术架构切换到 SOA 架构成为很多企业的难题。</p>
<p><span style="text-decoration: line-through;">&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><a name="N10076"><span class="atitle"><span style="font-size: large;"><strong>XFire 概述</strong></span></span></a></p>
<p>XFire 是 codeHaus 组织提供的一个开源框架，它构建了 POJO 和 SOA 之间的桥梁，主要特性就是支持将 POJO 通过非常简单的方式发布成 Web 服务，这种处理方式不仅充分发挥了 POJO 的作用，简化了 Java 应用转化为 Web 服务的步骤和过程，也直接降低了 SOA 的实现难度，为企业转向 SOA 架构提供了一种简单可行的方式。</p>
<p>XFire 目前最新的版本是 1.2.6，目前支持的特性主要包括：</p>
<ul>
<li>支持将 Web 服务绑定到 POJO、XMLBeans、JAXB1.1、JAXB2.0 和 Castor； </li>
<li>支持基于 HTTP、JMS、XMPP 等多种协议访问 Web 服务； </li>
<li>支持多种 Web 服务业界重要标准如 SOAP、WSDL、Web 服务寻址（WS-Addressing）、Web 服务安全（WS-Security）等； </li>
<li>支持 JSR181，可以通过 JDK5 配置 Web 服务； </li>
<li>高性能的 SOAP 实现； </li>
<li>服务器端、客户端代码辅助生成； </li>
<li>对 Spring、Pico、Plexus 等项目的支持等。 </li>
</ul>
<p><span style="text-decoration: line-through;">&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><a name="N1009A"><span class="atitle"><span style="font-size: large;"><strong>XFire 安装包</strong></span></span></a></p>
<p>XFire 框架目前的最新版本是 1.2.6，可以访问 xfire.codehaus.org 下载 XFire 框架的安装包，下载时请选择&ldquo;全部二进制发布包（Binary Distribution in zip package）&rdquo;，而不仅仅是&ldquo;XFire jar 文件（Jar of all XFire modules）&rdquo;。</p>
<p>下载完成后，我们可以将下载的 .zip 文件解压缩到任意的文件夹中（后面的章节中使用 % XFIRE_HOME % 表示 XFire 框架的安装目录），解压缩后形成的文件目录结构如下：</p>
<ul>
<li><strong>api（目录）</strong>
<p>api 目录中是 XFire 框架中所有类（class）对应的 API 文档，为开发者使用 XFire 完成应用开发提供帮助。</p>
</li>
<li><strong>examples（目录）</strong>
<p>examples 目录中包含了所有随 XFire 二进制包发布的实例，包括这些实例的源代码和相关 Web 应用配置内容。</p>
</li>
<li><strong>lib（目录）</strong>
<p>lib 目录中包含 XFire 运行所需要的外部支持类包（.jar文件），可以根据不同项目所需的 XFire 特性选择所需要的支持类包。保守的方法是在 Web 项目中包含所有的外部支持类包（.jar文件）。</p>
</li>
<li><strong>manual（目录）</strong>
<p>manual 目录中包含有 XFire 框架的帮助文档，开发者可以从这些帮助文档中学习更多运用 XFire 框架实现 SOA 的知识和技巧。</p>
</li>
<li><strong>modules（目录）</strong>
<p>modules 目录中包含了 XFire 框架根据不同特性分别编译的二进制包文件。发布基于 XFire 框架的 Web 项目时，可以选择使用该目录下的所有 .jar 文件，也可以选择 XFire-all-1.2.6.jar 文件。</p>
</li>
<li><strong>XFire-all-1.2.6.jar</strong>
<p>XFire 框架的二进制包文件，包含了全部的模块（modules）。</p>
</li>
<li><strong>LICENSE.txt</strong>
<p>LICENSE.txt 文件中包含了 XFire 框架的授权协议。</p>
</li>
<li><strong>NOTICE.txt</strong> </li>
<li><strong>README.txt</strong>
<p>这两个文件中包含了 XFire 发布时的一些有用的信息。</p>
</li>
</ul>
<p><span style="text-decoration: line-through;">&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;&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;&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;&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; </span></p>
<p><a name="N100F7"><span class="atitle"><span style="font-size: large;"><strong>XFire 框架支撑环境</strong></span></span></a></p>
<p>XFire框架是一种基于Servlet技术的SOA应用开发框架，要正常运行基于XFire应用框架开发的企业应用，除了XFire框架本身之外，还需要JDK和Servlet容器的支持。</p>
<p><a name="N10100"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1．JDK 版本选择、下载和安装</span></strong></span></a></p>
<p>XFire 支持非常多的特性，其中不同的特性对 JDK 版本的要求有所不同，比如如果项目中选择基于 JSR181 标准发布 Web 服务，我们就需要选择 JDK5 或者以上版本，如果仅仅选择将 Web 服务绑定到最简单的 POJO，我们只需要选择 JDK1.4 版本即可。</p>
<p>JDK 各版本均可以在 <a href="http://java.sun.com/" target="new"><span style="color: #5c81a7;">java.sun.com</span></a> 网站上下载，如何安装 JDK 请参考 SUN 公司的相关技术文档和 JDK 的帮助文档。</p>
<p><a name="N10110"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2．Servlet 容器下载和安装</span></strong></span></a></p>
<p>XFire 是一种基于 Servlet 技术的 SOA 应用开发框架，需要 Servlet 容器的支持。XFire 支持在多种 Servlet 容器中运行，包括 Websphere、Weblogic、TOMCAT 等。为了说明的简单，我们选择使用 TOMCAT（版本5.0.30）作为 XFire 的运行容器，所有配置过程和发布步骤的说明也均是针对 TOMCAT，如果读者使用 TOMCAT 之外的其它 Servlet 容器或者选择了 TOMCAT 的其它版本，下面的配置过程和步骤可能需要做出调整，请读者根据实际 Servlet 容器的帮助文档进行相应调整。</p>
<p>TOMCAT 各版本均可以在 <a href="http://tomcat.apache.org/" target="new"><span style="color: #5c81a7;">tomcat.apache.org</span></a> 网站上下载，如何正确安装 TOMCAT 服务器请参考 TOMCAT 服务器的帮助文档。</p>
<p><a name="N10120"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">3．xalan</span></strong></span></a></p>
<p>XFire 需要 xalan 项目的支持，然而 1.2.6 版本中并没有带有相应的 jar 文件，因此请访问 <a href="http://xml.apache.org/" target="new"><span style="color: #996699;">xml.apache.org</span></a>，下载 xalan 项目的二进制包。</p>
<p><span style="text-decoration: line-through;">&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;&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;&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;&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;&nbsp;&nbsp; </span></p>
<p><a name="N1012D"><span class="atitle"><span style="font-size: large;"><strong>XFire 应用配置</strong></span></span></a></p>
<p>前面的章节中我们下载和安装了 XFire 安装包和所需要的支持环境，现在我们开始学习如何从零开始创建 XFire 应用开发环境。下面的所有配置过程和发布步骤均针对 TOMCAT（版本5.0.30）服务器，如果选择其它的 Servlet 容器，下面的配置过程和步骤可能需要做出调整，请读者根据实际 Servlet 容器的帮助文档进行相应调整。</p>
<p><a name="h1"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">1、创建 Web 应用目录和基本元素</span></strong></span></a></p>
<ol type="a">
<li>在 %TOMCAT_HOME%/webapps 目录下创建新的 Web 应用目录 &ldquo;XFire&rdquo;
<p><em>[注] 其中的 %TOMCAT_HOME% 指向 TOMCAT 的安装目录。</em> </p>
</li>
<li>在 &rdquo;XFire&rdquo;目录下创建 &rdquo;WEB-INF&rdquo;目录、 </li>
<li>在 &rdquo; WEB-INF&rdquo;目录下创建 &rdquo;lib&rdquo;目录和 &rdquo;classes&rdquo;目录 </li>
<li>在 &rdquo; WEB-INF&rdquo;目录下创建 Web 应用描述文件 &rdquo;web.xml&rdquo;， &rdquo;web.xml&rdquo;文件的内容见 <a href="../#code11"><span style="color: #996699;">清单 1-1</span></a>。</li>
</ol>
<p><a name="code11"><strong>清单 1-1 WEB-INF\web.xml</strong></a></p>
<pre name="code" class="xml"> &lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;
 &lt;web-app xmlns="http://java.sun.com/xml/ns/j2ee"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"&gt;  </pre>
<pre name="code" class="xml">    &lt;display-name&gt;XFire实例&lt;/display-name&gt;
     &lt;description&gt; 基于XFire框架发布Web服务的例子&lt;/description&gt;               
&lt;/web-app&gt;</pre>
<p>&nbsp;</p>
<p><a name="N1015E"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">2、拷贝 XFire 所需的支持类包文件</span></strong></span></a></p>
<p>拷贝 %XFIRE_HOME%/lib 目录下所有文件到 <a href="../#h1"><span style="color: #996699;">&ldquo;1、创建 Web 应用目录和基本元素&rdquo;</span></a> 中所创建的 &rdquo;lib&rdquo;目录下，将 %XFIRE_HOME%/XFire-all-1.2.6.jar 文件也拷贝到 <a href="../#h1"><span style="color: #996699;">&ldquo;1、创建 Web 应用目录和基本元素&rdquo;</span></a> 中所创建的 &rdquo;lib&rdquo;目录下。将 xalan 安装包中的所有 jar 文件和所需要的支持 jar 文件拷贝到相同的 &rdquo;lib&rdquo;目录下。</p>
<p><strong>[注] </strong>为了减少拷贝的 jar 文件的数目，开发者可以根据项目的需要选择需要拷贝的 jar 文件，而不是全部拷贝，如何根据需要选择拷贝合适的类包文件请访问 <a href="http://xfire.codehaus.org/Dependency+Guide"><span style="color: #5c81a7;">XFire 站点</span></a>。 </p>
<p><a name="N10178"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">3、配置 XFire 框架运行所需的 Servlet</span></strong></span></a></p>
<p>修改 web.xml 文件，在其中增加如下 Servlet 定义内容。</p>
<pre name="code" class="xml">&lt;servlet&gt;
	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
	    &lt;display-name&gt;XFire Servlet&lt;/display-name&gt;
	    &lt;servlet-class&gt;
	        org.codehaus.xfire.transport.http.XFireConfigurableServlet
	    &lt;/servlet-class&gt;
	  &lt;/servlet&gt;
	
	  &lt;servlet-mapping&gt;
	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
	    &lt;url-pattern&gt;/servlet/XFireServlet/*&lt;/url-pattern&gt;
	  &lt;/servlet-mapping&gt;
	
	  &lt;servlet-mapping&gt;
	    &lt;servlet-name&gt;XFireServlet&lt;/servlet-name&gt;
	    &lt;url-pattern&gt;/services/*&lt;/url-pattern&gt;
	&lt;/servlet-mapping&gt;
</pre>
<p>&nbsp;</p>
<p><a name="N10184"><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial;">4、创建 XFire 框架的服务发布文件 services.xml</span></strong></span></a></p>
<ol type="a">
<li>在 <a href="../#h1"><span style="color: #996699;">&ldquo;1、创建 Web 应用目录和基本元素&rdquo;</span></a> 中创建的 classes 目录下新建目录 &rdquo;META-INF\xfire&rdquo;； </li>
<li>在步骤 a) 中新建的 &rdquo;xfire&rdquo;文件目录下创建新文件 services.xml，文件的默认内容如 <a href="../#code12"><span style="color: #996699;">清单1-2</span></a> 。 </li>
</ol>
<p>&nbsp;&nbsp; <a name="code12"><strong>清单 1-2 WEB-INF\classes\META-INF\xfire\services.xml</strong></a><br /><br />&nbsp;</p>
<pre name="code" class="xml">&lt;beans xmlns="http://XFire.codehaus.org/config/1.0"&gt;
&lt;/beans&gt;
</pre>
<p><span style="text-decoration: line-through;">&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;&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;&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;&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; </span>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/186807#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>Fri, 25 Apr 2008 15:41:15 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/186807</link>
        <guid>http://wangpx.javaeye.com/blog/186807</guid>
      </item>
      <item>
        <title>破解SAAS（转载）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/183411" style="color:red;">http://wangpx.javaeye.com/blog/183411</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          许多人在研究SAAS，尤其是做传统管理软件的。看着阿里软件，看着Google Office，看着Salesforce，眼馋了。<br /><br />但是，我经常问他们一个问题，你们研究SAAS的什么？很多人却讲不明白，看个热闹，大呼别人过瘾，自己却没有自己动手的开始。<br /><br />许多人对SAAS有误区。说SAAS就是给中小企业用的，说SAAS就是CRM，还有的说SAAS只能做些边缘应用，如OA什么的。有的说SAAS在EAI方面不行，有的说SAAS在定制方面不行。这些都是看现状看表面得出的结果。<br /><br />SaaS是Software-as-a-service（软件即服务）的简称。软件即服务。这才是SAAS。我要接下来的讨论就是在这个大背景下讨论的。如果你不认同软件即服务这个讨论的大背景，请离场，该文章对于你会浪费你的时间。<br /><br />软件即服务，不仅仅简单的把软件放到网上，采用租赁的收费模式这么简单。如果是这样，现在的网站，现在的B/S软件，过去的ASP模式就是SAAS。<br /><br />先让我们回顾一下ASP的历史，这个貌似SAAS的家伙。<br /><br />我们传统做管理软件，先调研，再设计，再开发，再测试，然后市场宣传，然后销售打单，销售方案编写、销售投标陈述、销售演示，然后实施安装、培训、推动上线，需求定制，最后是技术支持服务。如果远程搞不定，还需要及时赶到现场。为了让客户续服务费，如果他们不交服务费，我们就不给他们提供技术支持。如果这个软件不太多的需要后续服务，我们就在用户数、并发量、数据量、时间期限上给客户加限制，逼迫他们给我们续费。如果他们来个反破解，我们就继续道高一尺魔高一丈。<br /><br />于是，发明了ASP（Application Service Provider ）。应用托管提供商。客户你不用投入硬件（现在硬件换代这么快，你买上两年就旧了，不值得），不用维护（你想一个最起码的系统维护人员，每月1000元的工资，1年还1万2呢），而且我们有强大的安全防护（你自己不专业，很有漏洞，我们有安全专家），我们还有海量数据硬盘和高速的带宽。<br /><br />客户想：这是好事啊。一尝试，发现不对，我的数据需要放到你的服务器上，你把我的客户档案卖了怎么办？你手下的员工不老实把我企业的信息透露给我的竞争对手怎么办？我知道你老板肯定诚信没问题，但谁能保证你的基层员工没问题呢？我又不能惩罚你的员工。如果是我自己的员工把我自己服务器上的资料泄密了，我自己的人我有的是招治他。<br /><br />于是，ASP炒作了一段时间黯然下去。那已经是99-2000年的事情了。那时候互联网上网的企业也少，在网上找客户的企业也少，在网上做广告的企业也少。电子商务、支付宝、IM软件，都还起步。网速也慢，开发工具也简单，没有像如今的AJAX这么自然的UI感受。<br /><br />听说过ASP这段历史的读者，是最容易产生SAAS和ASP之间到底存在哪些差异的疑问。认为SAAS就是换汤不换药，起了个新名词继续忽悠人，就如同Web2.0，AJAX之类，都是新名词旧技术，把杂七杂八纠集一起，揉揉然后给你包装一个新概念继续卖钱。甚至国内有些厂商为了争SAAS这个头名状，说我们99年就SAAS了。<br /><br />但是SAAS真的是换汤不换药的ASP么？<br /><br />让我们好好看看这两个词：<br /><br />SAAS 软件即服务。<br /><br />ASP 应用托管提供。<br /><br />一个强调的是服务，一个强调的是托管。<br /><br />我在前面大量的博文在讲Open API、WebService、Json、Javascript API、Open ID，讲组件容器、SCA/SDO、SOA、中间件、虚拟机、云存储、分布式文件系统、分布式关系数据存储、分布式关系数据查询、LINQ、GQL、Flash 3DUI。其实我都一直围绕着软件即服务在研究和探索。<br /><br />我一路从企业管理软件走来，经历了函数、对象、组件，如今面临着面向服务。我从研究Corba，到Com+、EJB，到如今的SCA/SDO。我也经历了企业EAI、消息中间件、异构应用集成、数据大集中。我也经历了海量数据、企业级存储、企业级灾难恢复、企业级不间断运行。我也组建了咨询、市场、销售、教育、支持、开发、测试、文案、售前这样的组织模式。我也经历了从报表设计器到UI设计器到工作流设计器都自行开发。我也经历了传统管理软件盈利瓶颈困惑、收费困难、盗版问题、和互联网网站公司日进斗金3年上市市值超过联想的困惑。<br /><br />我一直在思考，什么样的盈利模式能够持续的收费，大规模的销售。而非现在的收费模式和销售模式。<br /><br />我也一直在思考，如果真的实现大规模的销售，那么必然用户数据海量，而且并发访问剧烈，这个产品的技术架构应该是如何的？<br /><br />我不断跟踪着业务动态，希望能得到借鉴。但是我看过800CRM、看过xtools，我没有感觉到革命。<br /><br />首先给我冲击的阿里的支付宝，开放了WebService，允许外站来调用。然后是Google开放了API，让大家在自己的网站或软件中利用Google的软件接口得到自己想要的功能。然后就是MapABC开放了API，让大家在自己的应用中搜索地图和产生标记。然后Amazon也开发了S3服务，让大家用于关系数据的存储和查询。然后就是业界开放之潮不断，SOHU博客也开放了（博客是个人门户不能小觑），豆瓣也开放软件服务了，允许大家查阅书籍资料。<br /><br />它们是Open的，它们是SOA的，它们是API的，它们可以嵌入到任何你的应用中，它们是可以服务全球的，你根本无法想象这些软件服务到底最终会有多少人调用，会有多少用户在并发访问。<br /><br />我深深的感觉到，这就是我想要的SAAS。它从收费模式、开发方法、技术架构方法、实现方法、基础设施、软件生态链、快速交付满足客户需求各个方面都对过去传统管理软件和ASP实行了颠覆。<br /><br />想想，你提供了一个提醒软件服务，我提供了一个费用报销服务，他提供了一个工作流服务，另外的人提供了报表服务。想想，把这些都整合在一起，会怎样呢？<br /><br />这就是趋势。<br /><br />看看我们现在的模式：能做的都做了，从CRM、OA，到进销存、财务、费用报销、考勤请假工资计算。我们无其不能，无其不做。我们N个开发组在加班、N拨项目组在全国出差实施培训、N个小姑娘在客服接电话。我们是一个麻雀虽小五脏俱全的“巨无霸”。<br /><br />这种模式从盈利模式到开发组织到技术架构，都是不符合未来趋势的，我们负重前进，我们势必无法像互联网企业一样快速成长。<br /><br />全球的SAAS市场我并不想在这里大鸣大放。我也仅仅工作在企业管理软件行当，我要思考的也仅仅是在这个全球都SAAS潮流的大背景下，我们传统管理软件厂商应该如何拥抱未来，跟随时代大潮而腾飞（许多人无法成功，就是没有踏准时代的脉搏，而不是运气不好这么简单。想想80年代的万元户和特区下海，90年代的关系经济，2000年后的知识经济）。<br /><br />所以我对SAAS在管理软件行当的研究分为这几个方面：<br />1 SAAS的在管理软件应用的切入点、目标客户群、盈利模式、市场容量、发展周期、收费模式、周期每阶段预期收入、竞争环境。<br /><br />2 SAAS的运行技术基础。SAAS不仅仅只是片面理解的一套可以存储多个客户单位数据的B/S软件。如果你要应对上亿次的访问，几亿用户的并发和数据存储，你的运行基础设施一定是一个可信平台。在稍后我会给大家讲讲我理解的可信平台。<br /><br />3SAAS的业务架构平台。我们既要提供一套可以不用代码就能简单定制的业务平台，也要提供WebService API接口，以使代码能够切入进行复杂定制。而且能够部署、运行，而且是安全的沙箱，而不能部署的是恶意代码。而且每个定制是隔离的，不能互相影响的。<br /><br />4SAAS的开发模式。SAAS的开发，上一条我们就已经说到了，需要打造一个开发链。我们维护业务平台，维护合作伙伴，而应用定制，却必须由合作伙伴来完成。所以，如何设计、如何开发、如何测试、如何部署、如何版本管理、如何培训教育、如何支持服务大家必须统一。而且团队配合，需要有group、wiki、blog、mail、IM、office online来协作，并且必要的时候还需要配合代码搜索。这也就是为什么google大力发展Gmail、Gtalk、Project Hosting、code search、office online、blog、group forum、SVN。其实Google要搭建的就是SAAS平台和SAAS生态链。你看Google不仅给我们提供了分布式全球存储基础设施（商业称“云存储、云计算”）、各种应用，而且提供了应用API，而且最近还提供了App Engine，而且还提供了代码社区。<br /><br />管理软件的SAAS的应用切入点非常重要。你是面对ISV来盈利呢，还是面对最终客户呢？你是想通过软件收费（按流量、按带宽、按存储量、按用户数、按时间年限、按模块数来收费。还有收培训费、支持服务费）呢，还是通过广告来收费呢？还是想挂羊头卖狗肉，利用人气来做其它销售和市场活动呢？（看看Google。Google既提供了应用，也提供了应用接口。既能让最终用户直接使用，也能让ISV调用开发嵌入到ISV自己的应用中。应用既向最终用户收使用费，也向ISV收接口使用费，还要在应用中挂广告收广告费）。如果大家联想到阿里软件有多少软件功能被嵌入阿里巴巴网站和淘宝网站的服务，估计大家按照这个思路下去会想出更多的办法。<br /><br />应用想好了，就该想在什么基础设施上实现他。我刚才就讲到：你无法估量你的应用会被多少网站调用，会被多少用户使用。你做的应用再也不是给那一个个的客户使用了（你想想过去你做的管理软件，充其量就是一个大型集团上万人访问，但是在互联网上，几亿人的访问都有可能），你需要为你的应用好好设计一下可以供互联网调用的应用平台。<br /><br />讲到云计算模式的SAAS平台，我们需要提一下可信平台。一说可信，大家首先想到的是数据安全和应用使用安全。但可信平台不仅仅只是安全单方面，它应该包括以下几方面：<br />1 7x24x365不间断，不会因为节点失效而间断<br />2 安全访问<br />3 永久存储。首先是存储不失效数据不丢失，第二是存储服务不失效。<br />4 允许异构硬件、异构操作系统的接入<br />5 随地访问，没有世界地区差异造成的访问限制或速度限制或功能限制或存储限制<br /><br />我的企业业务要随时随地能处理，你不能因为你的服务器有问题了，你的电信机房有问题了，你的南北电信隔离有问题，而使我使用受限制。<br />而且我的数据是安全的，不能告诉我你的服务器硬盘有问题某段数据丢了。<br />我的操作也是安全的。互联网上有许多黑客和黑客软件，我可不想让黑客知道了我的登陆密码。现在，网上银行很多人都被窃取了银行账号丢了钱。<br /><br />许多人认为Google最强大的是Google的搜索和Google的关联广告，还羡慕Goolge有钱能建电厂能发卫星能购买无线频段，能有大资金并购Youtube。其实，Google最大的核心就是多年运营搭建了这个可信计算环境。这是目前唯一的一个互联网上的可信海量计算环境。没有稳定的基础，我们怎敢还相信上层的应用呢？谁还敢把数据存放在上面呢？<br /><br />而我们的国内SAAS厂商，还在用传统的做中大型管理软件的做法在做计算环境，集群、不间断电源、企业存储设备、企业备份设备。这些传统做法支撑一家大型企业应用运行没有问题，但是要服务全球，服务全球企业，这个计算环境显然是无法快速的、低成本的扩展的。最后很可能形成一个瓶颈，不是上小型机，就是把企业分配到不同的服务器集群上。就跟现在做网络游戏一样。我们无法轻松的堆砌上万台PC甚至几十万台服务器来扩展计算环境。当然，如果你想做的SAAS，只想服务国内，甚至国内小企业，甚至是国内某行业的小企业，那就另当别论。不同目标，当然技术架构层面会发生质变，而不是裁减的量变。<br /><br />有了可信的平台，才能放心的构建基于之上的业务架构平台。传统的业务架构平台，我上一篇文章也已经讲过。但是在SAAS环境下，业务架构平台是不一样的。SAAS的业务架构平台必须能做到以下两点:<br />1数据隔离<br />2业务隔离<br /><br />为了完成这两方面的隔离。最好的处理方法是物理隔离，给每个企业都建立一套运行环境和数据库。这是最安全的隔离。但是这种方法有一个突出问题，就是统一的BUG补丁或功能耐升级，怎么给全部企业升级，并且升级了还不影响定制业务。我也在思考和学习Google的Project Hosting的方法。这也就是为什么虚拟软件平台如VMWare之类这么流行的原因。<br /><br />SAAS管理软件平台还需要良好的定制性。现在的传统业务基础平台，用一个词：密不透风来形容最形象不过了。不让代码插入，复杂的定制又处理不了。如果能处理，复杂程度真不如用代码三下五除二的搞定。业务平台本来是为了快速开发，最后却阻碍了快速开发，这种业务平台是错误的思路。今天听说Google App Engine和Salesforce整合了，我想这就是潮流。这种架构实现模式可以给现在仍在传统业务开发平台道路上奋斗的朋友以启发。<br /><br />现在，全球都在讲Open API。Google几乎开放了它所有应用的接口，而且Google App Engine也很容易让你定制的代码能够很好的部署和运行在平台上。这才是一个良好的业务架构平台。如果大家搭建SAAS平台，还在照抄过去的平台架构思路，还是会走到现在传统平台的死胡同里的。现在的传统业务平台已经如困兽一般，但是我还是看到许多人前赴后继，声称百变金刚，信心百倍的宣传，浪费了人才和时光。我想起了微软亚洲工程院院长张宏江说的一段话表达的意思，原话我记不住了，但大致意思是这样的：这个应用在美国10多年前就已经很成熟了，你现在才想到并认为是自己的创新是错误的，你的视野应该去看看国际上一流人在做什么。<br /><br />有了符合潮流的设计，就要组织开发实现落地。我们国内的开发组织发展时间非常的短。直到现在还有95%的软件公司都是单人单枪在讨生活，根本无法谈到开发组织。但是互联网的出现、资本的介入，让我们看到了开发组织。<br /><br />97年我还在羡慕求伯君、鲍岳桥这些第一代中国程序员。2001年，我才研读设计模式、软件工程、UML、RUP。但是很快，外包公司、网络游戏公司、网站门户公司，给了我们实践的一课。他们都是大规模团队组织开发。他们的开发模式都值的我们学习。<br /><br />尤其门户网站公司，他们快速应用开发、测试、发布、大规模计算环境部署，都是我们做传统管理软件人需要学习的。<br /><br />还有，现在的开源协作组织，我看国内也有很多成功的案例，如HuiHoo组织。他们在项目需求管理、BUG管理、进度管理、版本管理、代码合并、代码更新、团队沟通，都有很好的模式经验，都值得我们学习。（关于轻型开发组织模式，我在我的一篇博文详细谈过：软件开发组织的web2.0模式）<br /><br />在上个月参加CSDN的软件技术英雄大会的时候，有人问我怎么没听过你们公司。我说传统管理软件厂商，一般都是闷声发大财，一般不和业界交流。甚至用友，要在工作时间断网。<br /><br />其实，这是蛮尴尬的。我们作为传统管理软件厂商，我们真的成了老古董。未来的计算模式、未来的盈利模式、未来的业务架构、未来的开发模式，我们都不去学习先进，我们还在用我们使用了10多年的传统开发组织模式来进行着，我们的盈利模式也是传统的，我们的业务功能模型也是陈旧的。我们总是在5000万以下徘徊，如果想上市，想突破1个亿、10个亿、100亿的销售，我们必须和时代接轨。我们现在真的很象一个老古董，慢慢被潮流扫到一边，成为历史的叹息。<br /><br />就是这个原因，所以我在网上消失很久后又重返业界，希望能和符合潮流的技术模式、盈利模式、业务架构、开发模式一起工作一起探讨。
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/183411#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>Wed, 16 Apr 2008 15:40:31 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/183411</link>
        <guid>http://wangpx.javaeye.com/blog/183411</guid>
      </item>
      <item>
        <title> 用友U9 SOA Ready （转载）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/183410" style="color:red;">http://wangpx.javaeye.com/blog/183410</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在国内做管理软件的，用友就是一个标杆。<br /><br />用友有U8，金蝶就有K3；用友有NC，金蝶就有EAS。用友有通系列，金蝶就有KIS。<br /><br />时代在发展，曾经辉煌的管理软件行业成了没有人关注的壁花。大家都在关注互联网，关注嵌入式，关注PPG哄孩子，关注阿里巴巴和垂直行业网，关注如家分众橡果国际，关注网游、搜索、地图、QQ，关注通信手机3G。<br /><br />阿里软件横空出世，Salsforce打起SAAS，顿时让过惯了既定游戏规则的管理软件大佬一下子不知道怎么玩了。<br /><br />中小企业曾经是块最难啃的肉。没有钱投资软件硬件，没有钱雇佣IT维护人员，虽数量众多却失之无味弃之可惜。阿里携商品展示、沟通（IM、邮件、短信）、支付、营销群发、<br /><br />商机搜索、社区交流、广告营销、口碑营销、诚信评价、销售管理、市场营销管理、客户管理、客户联系历史、客户回访、事务提醒、客户订单过程管理、财务管理、采购管理、库存管理、文档管理、企业域名、企业邮箱、企业WEB全套SAAS打了用友们的阵营。凭借阿里巴巴和淘宝数以千万的客户，和阿里集团的强大宣传和运营团队，还有阿里最重要的支付安全而带来的数据信任，一举把用友们多年没有解决的问题突然攻克，并且迅速占领了大量中小企业信息化市场份额。也让那些国内单枪干的程序员兄弟们的生意带来了很大的冲击，原想拉几个小客户，卖个600、1000或7000块，这会生意也慢慢不行了。<br /><br />用友看在眼里，馋在心上。但阿里具备谁也不具备的数据诚信优势，所以其他人干看也吃不了。还得想想在自己优势的中大企业怎么站好脚，别让阿里抽底，SAP削顶。<br /><br />于是，U9出世。<br /><br />用友就是中国管理软件行当的标杆。每个从事管理软件的都得看看老大是怎么做产品的。我也是抱着这个心态时时跟踪U9的。<br /><br />管理软件，技术门槛并不高。其突出特点就是：需求不断，每个企业都不愿意和别人一样。管理软件，说到本质，还是管理思想的落地。只有保持差异化的管理思想，才能保证差异化的竞争。尤其每个企业面临的内部外部环境都不相同，面临的问题，目前的竞争地位，过去的历史包袱，现在的人的利益平衡，未来的走向，都决定了一个企业肯定与另一个企业不相同，所以落实到管理软件肯定是不相同的。（当然，你可以骗企业你是最先进的管理思想。不过这个吹法已经过时，都在商界江湖混了N年的，玩钱玩人玩术玩销售多年的老板，你以为他们就是不懂现在信息化的原始人？当然，你也可以宣传你这是模仿SAP做的，你这是模仿欧洲美国做的。但是现在老板们都清楚，中国和外国不一样，从人的思想层次到经济发展到外部经济干预，都需要立足现状，而不能赶英超美。过去大跃进，每个老板都记得）<br /><br />需求不断，是咨询顾问缺乏的恶果。但是，软件公司擅长的是制作软件，而非咨询。如果非要在咨询和软件都双头并进，那么还没有那么多资源做，而且也不专业，不符合现代企业特征。就连世界管理软件老大SAP都专业做软件，合作伙伴做IT咨询，如IBM、埃森哲、德勤，而IT的安装、软件操作培训、软件二次开发、软件支持，还得分到东软之类的集成商手里。这也就是王文京爱将高少义出走创办IT咨询公司，都是顺应发展潮流。（高少义出身军人，管理强悍，当然销售也强悍。曾经负责U8事业部，后来做华东市场。高在用友的影响力，非常类似三国关羽，而王文京又极为类似刘备。王文京对这位兄弟是又爱又恨又没有办法，于是请来何经华。何也管不了高，每每决议都是华东市场除外。最后，还是王文京杯酒释兵权，给高投资创立公司，送走了高爷。当然，高爷还是代理销售用友的系统、IT咨询、实施。估计定制化和支持不管。这两块既不肥又麻烦。估计高以后会涉入）<br /><br />时代要求产业链必须分工合作了，所以才有了王文京的制造软件，高少义的软件服务。而且，现在的客户，也不是U8 10年研发那样规模小经营单一，要不是U8在这快10年中不断被内部重构，甚至在高的领导下重写了U8，U8早就无法承载用友这个每年需要几亿资金才能让财务报表好看的大航母。（当时何经华无奈而走，高觉得自己能挑起未来大梁。U8，小菜，我过去不是管理U8事业部么，我也懂研发。如今U8家架构老化，我还能让它跟上新时代。所以U8架构重新用新架构思想新技术开发。当然，思路是好的。无奈高的技术眼光还停留在过去的U8架构思路，当然U8重写也不能变动太大，还有平滑升级的问题。所以，动用了直到现在还没有推广开的XAML/WPF技术。做了一个能兼容过去，也不至于过去包袱太重的新U8产品。但新U8产品出来后并没有什么大起色，让高感觉大势已去，统管一个事业部，从研发到销售，而且还能面向未来领导，高觉得自己已经不适合时代了。于是自己专注做好一方面，软件制作或服务，挑一个，高挑了后者）。<br /><br />从以上来看，承担下一个要将用友推到突破10亿销售收入的地位，U8的下一代，U9，必须具备以下特点<br /><br />1用户企业规模已经比10年前大得多，需求也当然要比U8复杂的多。<br /><br />2软件制造和软件服务必须分开了，专业化发展，产业链协作。<br /><br />要能满足这两个条件，一个坚实的软件架构是必须的。<br /><br />王文京知道U8辉煌了这么多年，不可能把用友带到下一个10年。所以未来10年，用友要想10个亿，100个亿，就需要一个很重量级的，能代表未来10年技术和应用趋势的产品。<br /><br />当然，王文京也吃过研发亏。当年王文京另外一个爱将邵凯受命研发面向大型企业，能够集团运行，能够在网上运行，能够和SAP抗衡的产品，那就是一定要是中间件、要是JAVA的NC。NC的研发，时机不当，落地也不当。但那个时期的人们都已经疯狂。为什么？因为那时候是1999年，互联网让大家都迷失了方向。大量程序员出走用友去创业，大量企业争先恐后给自己打.com的标签。互联网经济似乎颠覆了一切，就连老江湖柳传志都动摇了，上了FM365。邵凯受命后，立即打造核心团队，全国搜找行内老手。邵凯确实找到了几个从管理、到阅历、到业务、到运作、到技术开发都很在行的人。但可惜致命的有两个地方：1 当时大家都被互联网速度冲昏头脑大干快干，而且当时软件工程也不太流行，设计模式也没有火起来，于是就打算在凤凰岭封闭3个月就可以OK（事实上，一个重量级的想和SAP抗衡的产品不是这样能出来的）。 2 当时大家根本就没想到用啥大型架构，还按照过去U8的架构走，其实当时在国外中间件已经流行，各种大型企业架构已经流行，但中国还未流行。很多NC团队的人都是过去开发VB之类产品的人，对大型企业架构都不是特别理解，觉得U8的架构就应该可以了。但樊冠军的出现让大家第一次认识到大型架构模型。而樊当时是从和佳（还是佳软，忘了，都是老牌的管理软件商）跳过来的。樊并没有用这套架构作过真实的一个大型产品，也没有完整的主导经历过一个大型产品的生命周期。但是团队其他人都没什么大型架构经验，樊就成了这方面的权威了。大家一看他的架构确实好，而且确实代表未来，就决定用了。但那时候，樊做的架构其实质是一个3000多行代码的DEMO原形演示。而一个真正产品需要的接受过各种复杂企业需求考验的大型架构，樊还没有经验。<br /><br />而且当时大家已经封闭了，很多人都聚在一起天天设计业务和表结构了。而且，1999年的JAVA，大家都知道，从JAVA本身到开发工具本身都还不是太利索，如果2001年开发，情况就会好很多。但就是各种阴差阳错，NC就上路了。<br /><br />我想，直到现在，王文京也对NC很是戚戚然。虽然，中间件成熟了，JAVA成熟了，开发工具成熟了，设计模式成熟了，大型软件工程成熟了，但NC架构已经定型了，只能这么继续走了。NC在用友内部很多年都被称为就会花钱不会赚钱的鸡肋，老遭U8事业部的人看不起，因为用友大部分收入还是U8支撑的。但NC不断艰难坚持，也变的越来越好了，唉，起了个大早，赶了个晚集。邵凯经过这么一遭，也深深反省自己在软件工程管理上的问题，于是他接手了用友软件工程公司，这个公司专门做外包，是非常讲究软件工程的。邵凯就是希望能取取经，看看人家外国人是怎么管理的。当然，现在管理软件公司做外包，没有一个成气候的，用友也把外包公司脱离了用友软件，以防影响上市报表成色。<br /><br />经过NC这一遭，王文京知道这个U9的研发就要沉住气，不能再走NC老路了。<br /><br />注重架构、注重软件工程管理的U9，没想到这一走就是4年（其实是5年，2003年就有策划，但实质进展在2004年）。<br /><br />过去的U8架构，是田荣举做的。这个管理软件行业的传奇人物，出自金算盘。然后用友，然后金蝶，然后又回金算盘，然后又回金蝶，然后又回重庆不知所踪。田荣举几乎给U8、K3都带来了至少影响10年的架构思想。现在，做管理软件的，搭建架构，都是借鉴的是田荣举的思想。而田荣举在10年前就这么思考了。可见是高人。<br /><br />而U9呢，谁来负责？黄涛浮出水面。黄涛，也是出自金算盘（这个公司到底怎么了？黄埔军校？）。然后在用友就没走。在郑雨林、章培林、杨祉雄、高少义、向奇汉、何经华、黄义璋这些猛人辈出的用友，黄涛并不引入注目。直到U9，才慢慢出现在媒体坊间。<br /><br />黄涛这次是真沉住了气。经历了这么长的中国管理软件发展，黄涛知道管理软件研发的每一个核心点。管理软件，首先是管理。没有一整套完整的先进的管理体系（而不是功能），管理软件只能成为电子化工具，成为跟随客户需求的一个工具，而无法帮助企业提升管理。<br /><br />所以，黄涛一开始就大力招聘业务专家。他实行交叉管理模式。按职能分：架构平台组、开发管理组、业务功能设计组、数据库设计组、测试组、文档组、UI组。按系统又交叉分为：财务、生产、OA、HR等等。真正按照流水线生产方式来生产。<br /><br />而在架构上呢？黄涛的设计又比田荣举10年前的设计高出哪些呢？<br /><br />我也不是用友人，所以我也拿不到更详细的材料（这是管理软件行当的一个浅规则，管理软件厂商很少在网站上详细介绍产品，如果你真是企业，想用他们的产品，可以电话咨询，销售人员会跟进递送资料）。<br /><br />从我手上的这份U9宣传手册来看，U9的架构并没有多大改进。<br /><br />U8架构的时代，还没有面向组件。所以无法二次开发。而K3赶上了COM时代，所以可以有二次开发调用COM接口。而现在面向组件已经走进了面向服务时代。COM/COM+已经由于是WIN32时代，.NET时代屏蔽了COM，而且COM也无法穿透防火墙，现在都互联网普及了，上下游需要整合了，必须穿透内部防火墙走向外部EAI。所以，开发WebService业务组件是必须的。和U8比，当然比U8强很多，U8连面向组件都没有赶上，而U9直接跳过面向组件，走向面向服务。所以，U9一直号称自己是第一款原生SOA管理软件。<br /><br />SOA是个基础技术。重要的是看U9架构。<br /><br />其实，作为管理软件的架构，其实是比较简单的技术。大致相同。所以从金蝶EAS，到U9，到SAP Netwear，都差不多思路。管理软件最主要的成功门槛还是管理思想、项目质量、项目进度、项目文档、项目大规模团队组织协调、咨询渗透、专业培训。管理软件最主要的技术门槛还是在于海量数据存取，但性能受业务需求、功能设计、数据库设计、代码开发多种因素影响，所以需要在各个层面去调节。我过去做架构师的时候，由于数据库产品有些BUG补丁没有出来，由于OS有些BUG，由于COM+有些BUG，还有开发工具对于COM+和ADO支持上有些BUG，所以被性能弄的很是麻烦，整天在客户机房蹲守检测CPU、内存、I/O、线程、池化、连接数、事务并发。<br /><br />我也是做管理软件架构的，所以在这里给大家讲讲一个管理软件的一般架构思想。<br /><br />一个架构的作用：<br /><br />1业务程序员少写代码就能实现业务功能<br /><br />2有了需求来，也好定制修改<br /><br />3也稳定<br /><br />4性能也高<br /><br />5部署和支持也方便<br /><br />6安全性也高<br /><br />为了实现这些目标，所以我们需要具备以下这些组件设施：<br /><br />1登陆用户口令验证、license许可验证、盗版验证、过期失效验证、版本差异验证<br /><br />2主控台 用户功能树 管理主控台<br /><br />3表单设计器、业务实体设计器、工作流设计器、报表设计器、功能菜单设计器、多语言设计器、多皮肤设计器、查询过滤定制器<br /><br />4UI框架：Grid/Toob bar/Tree/TabSheet/Menubar/参照录入组件/Edit/Button/Combo之类<br /><br />5单实体输入框架、主从List/Detail输入框架<br /><br />6运行配置参数设置、单号计数器、业务预警设置<br /><br />7异常框架、业务实体权限框架、业务实体存储引擎、业务实体查询引擎<br /><br />8报表：套打、单据报表、普通二维查询统计报表、交叉报表、图表<br /><br />9工作流引擎、消息引擎、自动任务引擎<br /><br />10企业组织结构设计工具、权限分配工具、数据导入导出工具、数据备份恢复工具、升级更新工具、错误诊断跟踪工具、性能监测工具、日志查看工具<br /><br />11OFFICE集成、BO集成、通信集成、邮件集成、短信集成、IM集成、搜索集成、电子商务集成、企业门户集成等等一切外围集成<br /><br />有了这些基础，就可以在其上开发业务模块了。一般，让业务开发人员能够顺利开发业务组件并且能顺利插入这个平台去运行，还需要有Example、Docs、IDE。这样，在IDE中，自<br /><br />动就能查到所能调用的公共业务类库命名空间的成员，也能有帮助文档知道如何使用，更有Example代码，几乎修改一下就能用。于是，几乎，业务人员不需要直接使用VS之类的开发工具。如果确实做不了，平台组会扩充平台功能。如果平台也不很好的完成，就需要平台组来分解需求抽象需求仅提供公共功能API，然后让业务人员调用API，适当使用VS工具，但都容易很多，开发的速度、质量稳定、性能都不错。<br /><br />没有平台，高手低手都混在一起，开发的功能模块有的强有的弱，有的很好扩展很好修改原代码也很好理解性能也不错质量也不错，有的代码一团浆糊BUG百出几乎无法下手修改，整体质量无法保证。有了平台，就让能力高的开发平台，让能力低的去使用平台。毕竟，我们能招到的高手不多，而且成本高，大部分都是资质平凡的一般程序员。如果整体成功，就需要搭配各施其职。<br /><br />我看这次U9引入了DSL这个新技术。这也是我10多年一直摸索的，但却没有成果的。如今，Google和Ruby给了我很多思路。Google的REST、JSON、JAVASCRIPT，能够实现比BEPL广泛的Mashup，也比JAVA要轻量级。而Ruby更是引入真正的DSL脚本，像在编写游戏脚本一样。如果我们没有DSL，我们必须用JAVA这类原生重型语言操刀，这就难为业务开发人员了。<br /><br />我们并不期望DSL给客户的IT维护人员用，但至少也不希望业务开发人员去全面深入的学习JAVA或C#，大家都知道现在各种框架越来越大，各种类库越来越大。让一个资质平凡的程序员去学习这些东西还要能开发，那上手需要多慢，培训成本需要多高。<br /><br />但是，从U9在媒体透露出来的各种消息来看，U9现在已经完成的业务模块比较少，应该是财务、供应链、OA、HR这四部分（有没有生产管理、质量管理、CRM、物流仓储？没看到宣传内容）。其实要做ERP，就必须从CAD设计到产品数据管理到物料清单、采购、供应链、生产排程、仓储管理、生产成本管理、质量管理、物流、销售管理、市场管理、服务管理、客户管理、商业智能、企业OA、人力资源都得需要（不熟悉ERP构成的可以学习这些完整的ERP链，SAP基本业务套件[行业解决方案除外]也不外乎这些）。<br /><br />四年，听说用友每年投资1个亿研发，U9研发甚至动用了600-800研发人员，堪称国内第一单产品动用人数最多的完成这么点，而且从看到的资料，UI和功能细节上都不能让人信服这是一个研发了四年的产品。我个人猜想，估计还是NC的两个错误：1 技术的不成熟，从.NET/WPF/WCF/WF，想实现的架构底层技术不支撑 2软件工程管理的不成熟。<br /><br />其实还有第三点：管理思想和业务细节。<br /><br />黄涛过去一直做技术方面，这次统领产品大局，研发时间之久却业务模块出的少，很有可能和我估计的第三个软肋有关（用友一直封锁消息做的很好，具体我不清楚，我只作为门外汉猜测而已）。<br /><br />U9不断跳票，从王文京说的2006，跳到2007，然后是2007年底，然后是2008年3月。希望U9在今年上半年能够正式发版。<br /><br />而金蝶呢，K3老去，EAS产品技术成熟却无法决战未来10年。因为从最近发布的.NET 3.5来看，.NET在架构思想上比JAVA走的要先进的多。而JAVA，在众多厂商的博弈中背负了大量的包袱无法快行。<br /><br />U9是又起早了呢，还是正好。不管怎样，管理软件行当都想看到未来的标杆是什么样？
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/183410#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, 16 Apr 2008 15:39:58 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/183410</link>
        <guid>http://wangpx.javaeye.com/blog/183410</guid>
      </item>
      <item>
        <title>SQLSERVER内核架构剖析 （转载）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/183409" style="color:red;">http://wangpx.javaeye.com/blog/183409</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          们做管理软件的，主要核心就在数据存储管理上。所以数据库设计是我们的重中之重。为了让我们的管理软件能够稳定、可扩展、性能优秀、可跟踪排错、可升级部署、可插件运行，我们往往研发自己的管理软件开发平台。我们总是希望去学习别人的开发平台（如用友或金蝶或SAP），但我们却总是感叹管理软件业务处理细节繁多，而数据库管理软件却简单的SELECT、INSERT、DELETE、UPDATE四个命令就搞定。我们多希望有一天能做出一个架构，也可以这么简单就搞定管理软件。我们往往研究别人的架构，却忘记了我们身边我们最熟悉的数据库的架构。所以，今天，我想带领大家一起剖析一下数据库的架构，来探索数据库的架构思想。而我本人呢，只熟悉SQLSERVER这一种数据库产品，所以我就拿SQLSERVER来分析。<br /><br />在讲SQLSERVER内部原理的之前，我觉得非常有必要向大家介绍一下SQLSERVER的历史。<br />让我们站在1999年，看看计算机数据库业界到底处于什么状态。<br /><br />1999年，Oracle已经于1998年9月发布了Oracle 8i（可能中文版在1999年才来到中国）。Oracle 8i支持用JAVA编写存储过程，支持XML，支持Linux。<br />1999年1月，SQLSERVER7正式发布。SQLSERVER7重构了整个数据库引擎（相当于重写了SQLSERVER）。SQLSERVER第一次完整性的支持了行锁（有没有搞错，过去人是怎么使用数据库产品的。1988年，Oracle6就支持行锁。另外1988年，Oracle就开始研发ERP产品。谁说Oracle是ERP门外汉，可以参考这个）。<br /><br />看看他们俩的前一个版本。如果你入行比较晚（2000年以后），可能对以下文字更感到惊讶。<br /><br />1992年，Oracle7发布。有了存储过程、触发器、引用完整性校验、分布式事务处理。（天哪，Oracle7才有了这些东西）。<br />1995年，SQLSERVER6发布。SQLSERVER6是微软真正意义上的第一个数据库产品（真是爆料，大家没想到SQLSERVER6才是微软第一个数据库产品，那版本6之前的5、4、3、2、1是怎么度过的）。因为1994年，微软和Sybase掰了（Sybase是第一个运行于PC上的C/S数据库产品）。微软为了进入数据库产品领域，自己又没有经验，于是和Sybase一起合作（当时微软是全世界第一大软件公司，微软1986年上市。Sybase有产品，缺钱。微软缺产品，有钱。于是一拍即合）。直到1994年，微软也不需要Sybase了（已经学会了数据库技术），Sybase也感觉微软太狼子野心，于是合作分裂。微软开始自己做自己的数据库。<br /><br />历史说完。我们言归正传。<br />很多入门级做管理软件的，SQL语句玩的熟练，从子查询到Having到交叉表统计SQL都能做出来，甚至存储过程能写2000多行，游标、自定义函数、触发器、约束用的眼花缭乱。再入点门，在SQL查询器中可以使用SQL分析优化索引，用SQL Profile可以跟踪SQL，甚至在性能查看器中监测SQLSERVER内存、CPU、线程、I/O的运行状态，甚至为自己会使用DBCC而沾沾自喜。<br /><br />你是如此熟悉SQLSERVER，又是对SQLSERVER如此陌生。<br /><br />我今天就用架构的角度来给大家分析一下SQLSERVER架构和原理。短短一篇博文肯定只能面上的多一些，深一层的可能需要连载数篇文章甚至一块大砖头书才能讲完整。不过，我希望我的博文能够抛砖引玉，使大家能从一个过去没有想过的角度去看SQLSERVER。<br /><br />SQLSERVER，作为一个数据库产品，我个人认为，最重要的就是两大块：存储引擎和查询引擎。<br /><br />其他的日志、事务、锁、索引等等都是围绕他们来工作的。<br /><br />SQLSERVER是C/S产品，所以一条SQL语句要让SQLSERVER执行，必须要传输到SQLSERVER服务器端。传输，我们当然知道需要NetBEUI、TCP/IP等等网络传输协议。但是光有这些还不行。客户端如何发，服务器端如何收，如何确认发的和收的正确完整，如何确实发的和收的已经结束，如何发和收能跨越各种网络协议（如UNIX和WINDOWS和NOVELL通讯），如何保证数据安全校验，如何保证数据收发是同步还是异步，就需要在网络传输协议之上再构造一层协议。SQLSERVER既支持IPC机制，也支持RPC机制。你想想你的管理软件开发平台是否有这一层。当然，现在的消息服务器已经专业的提供了这一机理，可靠的、安全的、高效的、异步的、消息压缩、消息拆分、智能路由、集群，跨越不同的操作系统、不同的编程语言、不同的通讯协议、不同的硬件平台的消息数据传输。可能你过去不了解消息中间件，通过这一案例可以知道消息中间件的用途。<br /><br />SQL语句被可靠无误的发送到了服务器端，SQLSERVER引擎中第一个模块就来接待这个SQL数据。这个模块的名字叫：Open Data Services。它监听新的连接；清除失败连接；将结果集、消息和状态返回给客户端。<br /><br />SQLSERVER客户端和服务器端之间传输数据，数据包是有格式的。在SQLSERVER中被称为tabular data stream。这个数据流是令牌控制客户端和服务器端对话（否则，客户端说了N句话，服务器端返回N句话，没有令牌就混在一起了，不知道哪个回答是对应哪个请求的）。我们往往不能直接和Open Data Services打交道，把数据放进来。而是我们必须通过ODBC、ADO或DB-Library来发送tabular data stream。而SQLSERVER返回的数据结果，也是通过这些ODBC之类发回tabular data stream。你看看SQLSERVER设计的多巧妙，一个通用数据访问接口屏蔽了你和SQLSERVER之间，就如同WINDOWS API屏蔽了内核让你无法访问，就如同DirectX屏蔽了UI和外设的操控。<br /><br />SQL语句-ODBC-编码成tabular data stream-IPC或RPC-网络协议-IPC或RPC-解码tabular data stream-ODBC-Open Data Services。<br /><br />Open Data Services监测客户端连接。如果并发太多，它会创建连接，如果服务完，它会自己维护连接归入池中。在池中保留一段生命期，它会自己释放连接。如果有的客户端连接中途突然断掉（如客户端重启了），它在侦听后无回应，它也会自己整理自己的连接的。我们在SQLSERVER线程中看到的连接，就是Open Data Services创建的。<br /><br />Open Data Services有了连接（可能是创建的可能是从池里拿出来的，池化、创建、销毁都是非常讲究技能的。池化多少，上下文资源如何保留，池化多长时间，什么时候该销毁，调度不当就会严重消耗资源），就把SQL接住。这时，是接到了Open Data Services的读缓冲区里面。这个缓冲区为高性能处理数据的SQLSERVER带来一丝喘息机会，而就这一丝喘息机会，让SQLSERVER可以游刃有余（你的设计有吗？）。而Open Data Services有一个写缓冲区。SQLSERVER把检索到的数据，检索出来就立即放进写缓冲区，写缓冲区一满就立即被Open Data Service发走。当我过去研究SQLSERVER原理的时候，我常常赞叹，一个小小的SQLSERVER外围模块都设计如此精妙，实在让人佩服。我们经常在追求海量数据存储和Cache架构，我们却无视我们手边的SQLSERVER。<br /><br />SQL语句放到读缓冲区，SQLSERVER的关系引擎就开始工作了。它总是在侦听这个读缓冲区。<br /><br />SQL语句遇到的关系引擎的第一个模块就是命令分析器。我们在SQL查询分析器中看到的查询分析结果就是它的输出杰作。它来构造查询树。首先是将你的SQL语句规范化（你想想你写的软件代码，输入数据来了什么都不管就直接处理，连输入数据校验都没有，怎能稳定），否则以后的步骤将不好操作，如果你的SQL语句有语法错误，这个查询树的构造就无法完成，于是中断。而要规范一个SQL语句，首先要从SQL语法库中抽取SQLSERVER现有支持的各种语法和函数。<br /><br />一旦构造成功，关系引擎的第二个模块就是命令优化器，来裁剪这棵树。一个SQL语句可以生成多种执行和优化的方案（如果你使用过那种SQL优化工具的话，你就能理解），SQLSERVER会选择最节省内存、CPU利用率、I/O次数（I/O是性能优化最要命的地方，往往性能就瓶颈在I/O上）的那一种方案。优化器会根据每张表的数据统计（有时候你为了性能优化，必须定时期同步更新一下统计，否则优化就会有误差）。而且优化器也会根据查询树去选择合适的索引（如果使用索引代价大，它会自动选择全表扫描），优化器也会根据查询树知道先取哪些表的数据，然后再内存中如何合并数据，以得到你想要的结果（有时候想想优化器真伟大，你一个SQL过去，它需要在极短的时间内做多少事啊，为了能在极短时间内确定一个相对优化的方案，它也不可能穷举所有可能的方案，所以我们做海量数据优化的时候，往往评估多种方案，然后修改自己的SQL语句以符合产生最优的方案）。<br /><br /><br />规范化、优化完SQL语句，就要产生执行计划了。SQL管理器负责执行计划的产生。因为你发过来的SQL语句可能是一个SELECT，也可能是一个INSERT或UPDATE。即使SELECT，也面临着用户权限的限制（你如果设置过某一个SQLSERVER用户的对象权限和列权限，你就会明白）。而INSERT之类更新语句，又会涉及到权限、默认值、约束、表达式、主外键、触发器。一个优化完的SQL，具体要真正让SQLSERVER从内存或硬盘上把数据找出来或者更新回去，需要很多细节的步骤。<br /><br />查询执行器来负责SQL的执行。因为SQL的执行要涉及到事务、锁、等待、CPU调度，内存页失效影响、I/O存取影响，所以查询执行器会协调很多其他模块，但各个模块来负责处理，而查询执行器并不真正全部包办，否则让事务管理器、锁管理器、索引管理器、页面文件管理器、缓冲管理器、行管理器、日志管理器干吗去。<br /><br /><br />查询执行器是查询引擎的最后一个模块，接下来的模块都属于存储引擎的范畴。所以，从上看，查询引擎最主要是构造SQL查询树、优化裁剪SQL查询树，根据查询树产生执行计划，然后协调执行查询树，把结果返回去。<br /><br />而真正要把数据取出来或存进去，就需要存储引擎来工作了。<br /><br />首先根据执行计划，要存取哪些数据页和索引页。这就是访问方法管理器（access methods manager）要做的事情。但其实真要打开这些页，还不是访问方法管理器自己要亲手干的。<br /><br />亲手干这个活的是一个叫“缓冲区管理器”的模块。因为在硬盘上的数据是不可能计算处理的，必须要在内存中才能让CPU来计算。所以要存取那些数据页和索引页，就通知让缓冲区管理器来做。如果数据没有在内存中，就让缓冲区管理器来读入，如果数据已经在内存中了，缓冲区管理器只有返回即可。这个过程是被缓冲区管理器来屏蔽的，对于访问方法管理器是透明的。大家可不要以为访问方法管理器啥事不做，只是一个发布调度命令的。这可错怪了它。因为SQLSERVER要保证高速处理，必须预先预测好哪些数据页和索引页要处理。不能人家缓冲管理器已经处理完，你访问方法管理器才计算下一步将要处理的页面。要知道，这些管理器可是不分哪个用户来处理的。如果接受来自100多个并发的用户，发来各种各样的数据处理请求，你怎么能预测到哪些数据页和索引页要处理呢？这就需要一个统一的调度。而且这个统一的调度也影响着缓冲区管理器。你不能请求一个大数据，缓冲区管理器这才火烧屁股才扩大缓冲区，然后装载数据，那样流水线就停下了。缓冲区管理器必须预先知道将在不久要有一个大数据，所以在并行运算的时候就有独立线程来扩展了缓冲区。因为扩大缓冲区还和操作系统有关。你要扩大缓冲区，正好遇到WINDOWS页面失效，就涉及到你的虚拟文件的变化。而页面失效又会影响CPU和I/O。所以页面失效是一个性能影响很大的问题。而提高命中率是我们性能优化一直努力的重点。如果数据长时间不用，缓冲区管理器就要让这块内存数据过期，可以被新的数据覆盖。否则缓冲区老加载不卸载也不行。再说，有些数据已经被更新了，你数据老化了，不重新读入，你的数据就引起读错误了。<br /><br />我们知道，数据页包含数据行。索引页包含索引行。数据行就由行管理器来控制。而索引行，由索引管理器来负责。<br /><br />而单行上的检索、修改、执行，又被事务管理器和锁管理器影响着。事务，有显性事务和隐性事务两种。而锁，又有共享锁、排它锁、更新锁、意向锁。而锁，还分为行锁、页锁、表锁、数据库锁。而锁，又有死锁的可能性。锁的不同，加上事务的影响，这个行是否能读、能修改，能怎样的读（读一致还是脏读），是等待事务和锁，还是可以进行，就受了很多影响。因为一张数据页上放的行是有限的，尤其还有填充度的影响（如填充度为80%，就这个数据页面只能填充80%就必须分页，以防以后有数据插入的时候，就非常影响数据插页，这也是性能影响比较大，尤其在插入数据比较多的情况下）。SQLSERVER的一张数据页默认是64K，除去填充度和数据头，也没有多少可存储的数据了。这就是为了关系型数据库都劝阻大家要小表大数据。也就是说，列要少，列要短，频繁访问的列要在前。数据可以海量。如果行长了，你想要检索和更新多少数据页，这需要多少页面调度，面临着页面失效和锁机制的影响。而且，大文本和可变行，都是指针存储，需要跳转查找，更浪费了不少时间。<br /><br />而索引管理器，最主要在维护着索引B树。没有索引页，我们就要做全表扫描了，那需要载入多少数据页，而且还要逐行扫描，如果遇上事务和更新锁，就更有问题。所以，索引是非常重要的。而一个表，可以建立很多索引。索引，能直接找到所需要的行，而无须全表扫描。但是，你的索引如果仅仅是男女，或者你的索引涉及到可变行，都对索引不利。索引，不宜建立多。否则维护索引页的成本和消耗也非常多。索引页更要涉及到插页、拆页，频繁改动涉及到索引的字段，会让索引页剧烈变动，尤其数据量越大影响越大。我就不在这里讲解如何利用索引优化SQL了，否则一本书也讲不完。<br /><br />数据不断存取，数据不断被维护，载入内存或从内存中写入硬盘。其实都是惰性写入器在照顾。惰性写入器来定期扫描老化数据，让硬盘和内存中的数据是一致的。有这个惰性写入器，就有了内存和硬盘的差异时间窗。就有可能出现异常。一旦服务器突然断电，没有来得及写会磁盘的怎么办。也也涉及到另一个模块：日志管理器。日志管理器利用检查点的机制维护着日志文件。在服务器重新启动的时候，重写载入日志来把数据恢复到一致性。写日志，当然要比写数据要容易的多，快的多。因为写数据要操控内存和硬盘，还要注意权限、锁、事务，所以突然断电，你还没反应就来不及了。所以日志这种轻量级的方法，就可以在恢复一致性上有很好的帮助（当然，也丢失数据。日志页也没来得及写入硬盘）。<br /><br />讲到这里，就剩下事务管理器、锁管理器。这两个管理器和显性事务、隐性事务、显性锁、隐性锁、事务隔离级别、锁级别、行管理器、索引管理器都有很多关系。微软有WINDOWS优势，又有Jim Gray这样的巨师坐镇（Jim Gray是图灵奖获得者，就是此爷提出了数据库事务这一概念。盖茨为了让此爷为微软工作，而此爷不喜欢雷德蒙天天下雨的天气，于是在加州阳光中给此爷单独建了一座研究院）。所以，在性能上，我个人认为SQLSERVER的性能是非常优秀的（你想想，一个数据库产品的性能受什么方面的影响）。至于业界老称SQLSERVER无法管理海量数据，性能不佳，我个人感觉都是业界在以讹传讹。而尤其中国内地IT业界，大部分都是入门级在跟帖嘈杂，尤其还有一批更不懂技术的媒体记者或写手。<br /><br />如果真要去说SQLSERVER不行，大型海量数据管理必须用某某数据库产品，我建议从内部原理、内部架构、内部实现三个层次诸多方面来剖析到底在不在理。<br /><br />最后就是I/O管理器了。我一直不认同SQLSERVER内核中有I/O管理器。因为SQLSERVER使用的是和WINDOWS同样的页面调度和页面分配方法。何必要自己另创一套呢。就如同SQLSERVER把页面、硬盘、内存、线程、CPU交给了WINDOWS一样。SQLSERVER作为WINDOWS上的一个应用软件，应该和WINDOWS上的其他软件一样被WINDOWS管理。SQLSERVER又不跨平台，无须自己管理。<br /><br />除了SQLSERVER这些内核涉及精妙以外，SQLSERVER的外围工具也设计的相当好。如SQLSERVER的用户安全性管理方法、对象分类（表、列、约束、默认、索引、触发器、存储过程、视图、主键）、对象权限方法、元数据自管理方法、SQL语言、SQL查询分析器、SQL跟踪器、SQL性能分析器、SQL数据库（master\msdb\tempdb\model）。<br /><br />想一想，你的管理软件平台有这些架构思想吗？
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/183409#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, 16 Apr 2008 15:38:32 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/183409</link>
        <guid>http://wangpx.javaeye.com/blog/183409</guid>
      </item>
      <item>
        <title>企业管理软件平台架构内幕揭秘 （转载）</title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/183407" style="color:red;">http://wangpx.javaeye.com/blog/183407</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我上一篇文章《用友 U9 SOA Ready》写完后，有朋友说里面的企业管理软件平台架构讲的非常好，可惜被用友的内容给遮盖了，希望我能独立成篇，真正把企业管理软件平台架构讲透。于是就成了这篇博文的动笔之因。<br /><br />企业管理软件，由于进入门坎低，各行各业各层次企业都需要，做面向企业应用比做面向个人应用要赚钱多，好销售，所以中国内地有相当大部分的程序员在从事着企业管理软件的开发。<br /><br />尤其是接项目的软件公司，这类公司往往在中国当前软件行业占很多。3-4个或5-6个程序员，老板拉来什么项目就做什么项目，进销存、费用报销、销售管理、客服维修工单、请假考勤管理等等为大部分单子内容。<br /><br />有朋友留言：就10来万的单子，就1-2个程序员，从调研到设计到开发到测试到打包到实施安装到培训到推动上线到支持，全活儿。哪来的精力再去开发平台。再说了，都是10来万的单子，开发平台就大才小用了，什么设计模式，什么OO，什么界面和代码分离，什么代码重构，都扯淡，往界面拖控件，用ADO连数据库，OK。费那精神干嘛，把钱快速赚到才是真理。<br /><br />其实，你发现没，你做的管理软件（叫它MIS也行，你爱戴高帽就叫它ERP）有一些东西都挺相似。我有个专门给小企业做网站的哥们，5天一个网站。他手里面从免费邮箱服务器、BBS论坛、流量统计软件、网站新闻内容管理系统全从网上找好源代码，各种图标图片素材库，机器上装好Dreamweaver、PhotoShop、Flash。小企业老板来了，他把过去做的案例往出一拿，你挑吧。然后七凑八凑几天完工。<br /><br />这是不是平台呢？<br /><br />我们为什么需要平台？我们需要什么样的平台？平台应该包括哪些东西？一个完备的平台是怎样的？<br /><br />带着这些问题，我们一一揭秘。<br /><br />拿我哥们刚才的例子剖析。我个人认为那就是一个平台。我们为什么需要平台？就是为了不每次都重新发明轮子，为了能快速的完成代码工作（可以多赚点钱或者可以多打会游戏或者瞌睡或者可以多时间去泡MM）。<br /><br />快速完成，是平台的第一目标。但是快速三下五除二干完了，去客户那里一跑，BUG百出，倒霉，还得熬夜修改，长期出差回不了家。修改代码，痛苦，还不如推倒重新正式写代码。<br /><br />看来，平台的第二个目标必须是稳定。<br /><br />既能快速开发，又能稳定，这是个好平台了吧。<br /><br />不，客户个性化需求来了，发现真难改。按照普通简单流程处理（增/删/改/查 列表/明细），确实平台能给很大帮助，但是客户一个性化，平台就不灵了，个性化代码怎么都插不进去手。平台自成一套圈子，外围异常代码根本插不进去（这是现在很多号称平台的产品都共有的最大弊病）。<br /><br />好不容易遇到个好个性化定制的平台，平台性能不佳，老挂机，客户的电话吼的真想把电话线拔掉，甚至幻想全公司电话和互联网和自己的手机都坏了。<br /><br />终于搞定以上的所有问题，给客户安装上，培训好，推动上线，终于可以闪人了。回到自己的床上，真舒服呀。<br /><br />没想到恶梦才刚刚开始。客户的电话来了：我发现报表不对呀，数对不上去，你看哪里出问题了？<br /><br />O，My God。我刚回来，你就...。 我又不能飞过去。好吧，好吧，你有QQ或PcAnyWhere吗，我们来连一下，我给查一下数据库。什么？服务器不容许上网？那我怎么办？<br /><br />看来需要一个排错、可跟踪、可输出详细日志、可过滤日志的东西，就像SQLSERVER的查询跟踪器一样。<br /><br />嗯，好不容易把问题搞定，修改完代码，需要给客户升级。<br /><br />什么，你们家没有网管，都是兼职的，根本不会SQLSERVER，脚本怎么执行，怎么备份，不知道？<br /><br />算我倒霉，电话我告诉你一步步操作。（长途电话费N多，老板冲你发火，你低头不语，心里念到这个猪头）<br /><br />什么？升级了也不好用？那你肯定没按我说的操作来。<br /><br />什么？有的机器好用，有的机器不好用？你肯定没有把所有客户端都升级了。<br /><br />哦，看来需要一个自动升级的模块。<br /><br />挖咔咔，软件卖的好好哦。咿呀咿呀咿。可是，可是...。居然有家伙盗版使用我们的软件，看来我不加密不行了。<br /><br />加密，加KEY，加并发用户数，加正版判别，加使用期过期。<br /><br />嗯，终于天下太平了，抱得美人归。<br /><br />从以上来看，我们似乎并不是为了平台而平台，为了市场宣传和销售便利而做平台噱头。我们确实在多如牛毛的小项目的水深火热战火纷飞中，我们渴望有这些东西将我们快速解脱。如果我们是开发中大型系统的，我们的产品需要延续生命周期8-10年，需要部署给成千上万的客户，客户需要管理几亿的关键数据，有几千个客户并发，我们更需要平台。<br /><br />所以，不管做小项目的，或者做大项目的，我们都需要平台。<br /><br />那我们需要什么样的平台。其实上述的场景中已经把平台的关键特性都说了一遍，现在我总结一下：<br /><br />1可以帮助开发人员快速开发<br /><br />2稳定<br /><br />3可以个性化定制<br /><br />4可以跟踪日志排错<br /><br />5可以自动升级<br /><br />6软件版权保护<br /><br />为了做到这些，国内软件精英不知有多少人前赴后继的的投入研究（甚至做OA的，做工作流的，也号称做平台）。让我们历数历数，看看各自的特点和优缺点，以对照一下我们需要的特性，他们的平台具备不？<br /><br />大连雅奇，95年我就知道它了。当时好像是Foxbase版本的。可以生成菜单、界面代码。其他的我现在忘了。不过去年CSDN还报道了一次大连雅奇<br /><br />1报表打印，支持二维、交叉、套打、单据格式、多栏头、导出HTML、PDF、EXCEL、DBF肯定是必须的。计算公式有没有？变量有没有？代码调用API有没有？嵌入图表有没有？小分组合计行不行？最底最右的总合计有没有？支持不支持主从？支持不支持链接钻取？<br /><br />2图表 当然支持折线、直方、饼图。不知道EXCEL所能支持的图表，它是否都能支持，而且像EXCEL一样好看。漏斗图有没有，里程图有没有？做领导报表（可以起名为管理驾驶舱或商业智能门户）时非常需要。<br /><br />3控件 可分组、可过滤、可定制查询、可定制列视图、可多排序、可导出、可预览、可小计的Grid控件有没有？可以权限管制行列数据，定制列视图的参照录入控件有没有？日历控件有没有？财务凭证控件有没有？<br /><br />4企业内部即时通讯模块、邮件收发模块、预警提醒模块有没有呢？<br /><br />其实，这是在企业应用中极为常见的一些公共功能。有一部份朋友给我QQ留言，他说平台架构就是：中间件+Hibernate（ORM框架）+structs（MVC框架）+spring(AOP框架)+JSF控件（UI框架）+Log4j（日志框架）+JUnit（测试框架）+Ant（Build框架）+JasperReports（报表框架）+JFreeChart（图表框架）+osWorkFlow（工作流框架）。<br /><br />我说对，这是平台架构，但不是企业管理软件的平台架构。企业管理软件的平台架构需要更上一层，能方便开发人员快速稳定的开发和修改。<br /><br />大连雅奇能一直存活到如今，从各方面看虽已跟不上未来，但目前很多小软件公司和小企业还在进行着初步的信息化，所以还是有很多的市场空间的。（我看到华军软件里有人发布的所谓强大平台，一下载一看，原来是一个数据库维护软件，让人尴尬，但是还有大量的个人或2人工作室在不断奋斗制造着这类软件，我已经看到了很多雷同的软件了，也有市场？可能）。<br /><br />讲完最老的大连雅奇，在企业管理软件平台界，最有名的就数思维加速（现在改名起步）。起步从1999年开始起步，技术一直跟的很紧，做的也非常深入，我个人认为，起步是做企业管理软件平台最优秀的一个。<br /><br />1 起步加入了工作流，非常适应时代<br /><br />2加入了集团企业多组织结构，非常适应时代<br /><br />3起步有数据库建模工具，有版本管理工具，有部署工具，报表、图表自不用说。居然还有甘特图和日历，还有即时通讯工具<br /><br />4起步拥有自己研发的代码开发IDE。这是国内没有的。老宋为了解决常规平台自我封闭无法定制的诟病下了很大的气力，让简单开发和个性定制融合。<br /><br />5能支持JAVA中间件，也能支持COM+，能WEB，也能C/S。这也是国内没有的。<br /><br />IDE，既是起步的杀手功能，也是起步的软肋（想起一句古龙的话：敌人的优点也就是他的缺点）。IDE这个东西，世界有三巨头：Eclipse、visual studio、Borland。大家都是干软件的，大部分都是选择这三类IDE，对这三类IDE很是习惯。但是现在要舍弃三巨头，用了起步的平台，就需要用起步的IDE，而且IDE还没有三巨头做的好（要想做好，谈何容易。君不见Eclipse有IBM巨资推动，visual  studio更是微软的一个重要产品线，投入大量人力。如果起步也要做，那岂不是平台、IDE、工作流都要并进？要知道，这三块中的每一块，都是需要单独一个公司，而且是相当实力的公司才能做好）。<br /><br />于是，上海普元学乖了。IDE，我们就用Eclipse。<br /><br />当然，还是老三套：控件+工作流+报表。<br /><br />普元的平台框架有组织结构管理（不知道是否支持区域管理组织和集团管理组织？）、部署工具、权限管理（这个非常重要，不知道能不能管理到业务实体的每一个操作和数据行列可访问性？）、业务字典管理（这个没必要单提出来吧？运行参数的配置才是最重要的）。不过普元具备了日志、异常、定制任务。更难能可贵的是，普元还提出了Cache机制（这个在企业管理软件领域中其实挺难。它不像咱们的通常论坛网站，如天涯，也并发量大需要Cache，但是天涯也仅仅是看，而企业管理软件主要是频繁读写和业务计算处理，这怎么Cache，我也需要学习学习，过去一直主要依赖数据库设计和代码写法和功能设计来保证性能）。<br /><br />普元做JAVA，金富瑞就做.NET。<br /><br />三大件继续拿上来：控件+工作流+报表。<br /><br />但很可贵的是，金富瑞提出了虚拟组织这一说法。这个确实老遇到。还有就是权限管理，从菜单到数据到列到行到按钮，控制的挺细，不过细就是多，多就会漏洞多，看来金富瑞需要深刻去思考一下数据库架构的设计。<br /><br />这些都是专注做平台的。<br /><br />但是，那些主要做管理软件的公司，也有自己的平台。甚至自己的平台还卖。如浪潮楼上（不过山东人的朴实与粗糙，尽在软件中）。<br /><br />自己用的平台，东软也有，但没有对外宣传，也不卖。偷偷自己用，做了N多医保、税务局之类的项目。（我曾经剖析的时候，发掘设计的思想和金蝶K3的平台特别相似）<br /><br />用友、金蝶这两大企业管理软件公司当然也有自己的平台。用友有U8平台和NC平台，金蝶有K3和EAS平台。不过，明显的是，金蝶的平台架构思路比用友高一级。从业务实体自省到权限控制到日志到二次开发，金蝶颇有套路，思路清晰抽象高度。而用友的平台，似乎还看业务是业务，看菜单是菜单。<br /><br />讲了这么多，几乎主流的平台厂商我都数了个遍，当然从事各细分行业管理软件的公司也都有自己的平台，只不过那类平台和本行业业务又结合的特别紧密，开发自己行业软件特别快速稳定易用，但不具有普遍意义。<br /><br />我把我在上一篇文章中写的企业管理软件平台架构内容再贴到最后，以使大家好总览：<br /><br />1登陆用户口令验证、license许可验证、盗版验证、过期失效验证、版本差异验证<br /><br />2主控台 用户功能树 管理主控台<br /><br />3表单设计器、业务实体设计器、工作流设计器、报表设计器、功能菜单设计器、多语言设计器、多皮肤设计器、查询过滤定制器<br /><br />4UI框架：Grid/Toob bar/Tree/TabSheet/Menubar/参照录入组件/Edit/Button/Combo之类<br /><br />5单实体输入框架、主从List/Detail输入框架<br /><br />6运行配置参数设置、单号计数器、业务预警设置<br /><br />7异常框架、业务实体权限框架、业务实体存储引擎、业务实体查询引擎<br /><br />8报表：套打、单据报表、普通二维查询统计报表、交叉报表、图表<br /><br />9工作流引擎、消息引擎、自动任务引擎<br /><br />10企业组织结构设计工具、权限分配工具、数据导入导出工具、数据备份恢复工具、升级更新工具、错误诊断跟踪工具、性能监测工具、日志查看工具<br /><br />11OFFICE集成、BO集成、通信集成、邮件集成、短信集成、IM集成、搜索集成、电子商务集成、企业门户集成等等一切外围集成<br /> <br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/david_lv/演示文稿2.gif" /><br /><br /><br /> <br /><br />后补记：<br /><br />刚才看到有朋友留言，说到单据如何变化、单据字段如何变化、报表如何变化、数据库如何变化、业务流程如何变化。<br /><br />刚才一看图，确实是忘了写单据设计器了。这个在各个平台上都有。不过现在单据设计器的主流都是在eclipse中做调整，然后再部署。<br /><br />有了单据设计器，单据变化、单据字段变化就都能适应。<br /><br />报表有报表设计器来适应。<br /><br />数据库有业务实体设计器来适应。<br /><br />业务流程有工作流来适应。如果是很特殊的业务流程变化，需要编写代码。一个完全不编写代码就靠配置实现企业业务的平台是不存在的，除非业务很简单。<br /><br />其实笔者原意也不是对国内平台上逐个品头论足。目的只是希望给大家普及平台架构，并且介绍国内主流的一些平台厂商。笔者也在近10年中搭建过两代产品线的平台架构，管理数据都在几亿条，涉及用户数也在几万，所以希望给没有架构思路的朋友们一些经验分享而已。<br /><br />大家如果想了解企业管理软件平台的更细节的架构和原理，可以去起步、金富瑞、浪潮楼上、普元、金蝶、用友的网站上去看他们详细的技术架构白皮书。看看他们是如何真实的实现一个企业管理软件业务平台。<br /><br />更深层次的如何实现，架构的每个细节难点和实现思路，我想，应该不是我这篇博文能够承担的。<br /><br /> 另外，看到留言说业务平台是为了适应企业变化无常的需求<br />其实这是个误区。业务平台并不能适应企业变化无常的需求，业务平台只是把公共的部分提取了出来，而变化无常的需求是由开发语言来完成的。如果一个业务平台无法容易的融入开发IDE编写的代码，这个业务平台基本不能用，只能算是一个简单的玩具，做些简单的增删改和确认的工作而已。<br /><br />有些平台，为了满足个性化特殊处理，内嵌了很复杂的业务逻辑语句，甚至也和起步一样做了IDE，即使走到这一步，也不如程序员用IDE编写代码方便。<br /><br />我们做平台，不是为了不用IDE，不用写代码，不是为了实施人员或业务人员拿去自己定义功能去吧，程序员没有用了，程序员只要维护好平台就OK了。这种认识是错误的。SAP作为全球最大的企业管理软件厂商也无法做到。
          <br/>
          <span style="color:red;">
            <a href="http://wangpx.javaeye.com/blog/183407#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>Wed, 16 Apr 2008 15:33:38 +0800</pubDate>
        <link>http://wangpx.javaeye.com/blog/183407</link>
        <guid>http://wangpx.javaeye.com/blog/183407</guid>
      </item>
      <item>
        <title>必须掌握的八个【cmd 命令行】(转载) </title>
        <author>wangpx</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wangpx.javaeye.com">wangpx</a>&nbsp;
          链接：<a href="http://wangpx.javaeye.com/blog/183402" style="color:red;">http://wangpx.javaeye.com/blog/183402</a>&nbsp;
          发表时间: 2008年04月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一，ping 　　  <br /><br />　　它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说，ping命令是第一个必须掌握的DOS命令，它所利用的原理是这样的：网络上的机器都有唯一确定的IP地址，我们给目标IP地址发送一个数据包，对方就要返回一个同样大小的数据包，根据返回的数据包我们可以确定目标主机的存在，可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧，在DOS窗口中键入：ping /? 回车，。所示的帮助画面。在此，我们只掌握一些基本的很有用的参数就可以了（下同）。 　　  <br /><br />　　-t 表示将不间断向目标IP发送数据包，直到我们强迫其停止。试想，如果你使用100M的宽带接入，而目标IP是56K的小猫，那么要不了多久，目标IP就因为承受不了这么多的数据而掉线，呵呵，一次攻击就这么简单的实现了。 　　  <br /><br />　　-l 定义发送数据包的大小，默认为32字节，我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用，会有更好的效果哦。 　　  <br /><br />　　-n 定义向目标IP发送数据包的次数，默认为3次。如果网络速度比较慢，3次对我们来说也浪费了不少时间，因为现在我们的目的仅仅是判断目标IP是否存在，那么就定义为一次吧。 　　  <br /><br />　　说明一下，如果-t 参数和 -n参数一起使用，ping命令就以放在后面的参数为标准，比如"ping IP -t -n 3"，虽然使用了-t参数，但并不是一直ping下去，而是只ping 3次。另外，ping命令不一定非得ping IP，也可以直接ping主机域名，这样就可以得到主机的IP。 　　  <br /><br />　　下面我们举个例子来说明一下具体用法。 　　  <br /><br />　　这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒，从这里可以判断网络连接速度的大小 。从TTL的返回值可以初步判断被ping主机的操作系统，之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。  <br /><br />　　（小知识：如果TTL=128，则表示目标主机可能是Win2000；如果TTL=250，则目标主机可能是Unix）  <br /><br />　　至于利用ping命令可以快速查找局域网故障，可以快速搜索最快的QQ服务器，可以对别人进行ping攻击……这些就靠大家自己发挥了。 　　  <br /><br />二，nbtstat 　　  <br /><br />　　该命令使用TCP/IP上的NetBIOS显示协议统计和当前TCP/IP连接，使用这个命令你可以得到远程主机的NETBIOS信息，比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。 　　  <br /><br />　　-a 使用这个参数，只要你知道了远程主机的机器名称，就可以得到它的NETBIOS信息（下同）。 　　  <br /><br />　　-A 这个参数也可以得到远程主机的NETBIOS信息，但需要你知道它的IP。  <br /><br />　　-n 列出本地机器的NETBIOS信息。 　　  <br /><br />　　当得到了对方的IP或者机器名的时候，就可以使用nbtstat命令来进一步得到对方的信息了，这又增加了我们入侵的保险系数。 　　  <br /><br />三，netstat  <br /><br />　　这是一个用来查看网络状态的命令，操作简便功能强大。 　　  <br /><br />　　-a 查看本地机器的所有开放端口，可以有效发现和预防木马，可以知道机器所开的服务等信息，如图4。 　　  <br /><br />　　这里可以看出本地机器开放有FTP服务、Telnet服务、邮件服务、WEB服务等。用法：netstat -a IP。  <br /><br />　　-r 列出当前的路由信息，告诉我们本地机器的网关、子网掩码等信息。用法：netstat -r IP。  <br />四，tracert  <br /><br />　　跟踪路由信息，使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径，这对我们了解网络布局和结构很有帮助。如图5。 　　  <br /><br />　　这里说明数据从本地机器传输到192.168.0.1的机器上，中间没有经过任何中转，说明这两台机器是在同一段局域网内。用法：tracert IP。 　　  <br /><br />五，net 　　  <br /><br />　　这个命令是网络命令中最重要的一个，必须透彻掌握它的每一个子命令的用法，因为它的功能实在是太强大了，这简直就是 微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令，键入net /?回车如图6。  <br /><br />　　在这里，我们重点掌握几个入侵常用的子命令。 　　  <br /><br />　　net view 　　  <br /><br />　　使用此命令查看远程主机的所以共享资源。命令格式为net view \IP。　　  <br /><br />　　net use  <br /><br />　　把远程主机的某个共享资源影射为本地盘符，图形界面方便使用，呵呵。命令格式为net use x: \IP\sharename。上面一个表示把192.168.0.5IP的共享名为magic的目录影射为本地的Z盘。下面表示和192.168.0.7建立IPC$连接（net use \IP\IPC$ "password" /user:"name"）， 　　  <br /><br />　　建立了IPC$连接后，呵呵，就可以上传文件了：copy nc.exe \192.168.0.7\admin$，表示把本地目录下的nc.exe传到远程主机，结合后面要介绍到的其他DOS命令就可以实现入侵了。 　　  <br /><br />　　net start  <br /><br />　　使用它来启动远程主机上的服务。当你和远程主机建立连接后，如果发现它的什么服务没有启动，而你又想利用此服务怎么办？就使用这个命令来启动吧。用法：net start servername，如图9，成功启动了telnet服务。 　　  <br /><br />　　net stop  <br /><br />　　入侵后发现远程主机的某个服务碍手碍脚，怎么办？利用这个命令停掉就ok了，用法和net start同。 　　  <br /><br />　　net user  <br /><br />　　查看和帐户有关的情况，包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的，最重要的，它为我们克隆帐户提供了前提。键入不带参数的net user，可以查看所有用户，包括已经禁用的。下面分别讲解。  <br /><br />　　1，net user abcd 1234 /add，新建一个用户名为abcd，密码为1234的帐户，默认为user组成员。  <br /><br />　　2，net user abcd /del，将用户名为abcd的用户删除。  <br /><br />　　3，net user abcd /active:no，将用户名为abcd的用户禁用。  <br /><br />　　4，net user abcd /active:yes，激活用户名为abcd的用户。  <br /><br />　　5，net user abcd，查看用户名为abcd的用户的情况　　  <br /><br />　　net localgroup  <br /><br />　　查看所有和用户组有关的信息和进行相关操作。键入不带参数的net localgroup即列出当前所有的用户组。在入侵过程中，我们一般利用它来把某个帐户提升为administrator组帐户，这样我们利用这个帐户就可以控制整个远程主机了。用法：net localgroup groupname username /add。 　　  <br /><br />　　现在我们把刚才新建的用户abcd加到administrator组里去了，这时候abcd用户已经是超级管理员了，呵呵，你可以再使用net user abcd来查看他的状态，和图10进行比较就可以看出来。但这样太明显了，网管一看用户情况就能漏出破绽，所以这种方法只能对付菜鸟网管，但我们还得知道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员，这是后话。有兴趣的朋友可以参照《黑客防线》第30期上的《由浅入深解析隆帐户》一文。 　　  <br /><br />　　net time  <br /><br />　　这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面，那么也许就用不到这个命令了。但简单的入侵成功了，难道只是看看吗？我们需要进一步渗透。这就连远程主机当前的时间都需要知道，因为利用时间和其他手段（后面会讲到）可以实现某个命令和程序的定时启动，为我们进一步入侵打好基础。用法：net time \IP。 　　  <br /><br />六，at  <br /><br />这个命令的作用是安排在特定日期或时间执行某个特定的命令和程序（知道net time的重要了吧？）。当我们知道了远程主机的当前时间，就可以利用此命令让其在以后的某个时间（比如2分钟后）执行某个程序和命令。用法：at time command \computer。 　　  <br /><br />　　表示在6点55分时，让名