<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>dongivan</title>
    <description></description>
    <link>http://dongivan.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>Xdoclet生成SessionBean 和 EntityBean代码</title>
        <author>dongivan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dongivan.javaeye.com">dongivan</a>&nbsp;
          链接：<a href="http://dongivan.javaeye.com/blog/99515" style="color:red;">http://dongivan.javaeye.com/blog/99515</a>&nbsp;
          发表时间: 2007年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody">
<h3><font size="5"><span lang="EN">xDoclet </span><span style="FONT-FAMILY: 宋体">简介</span></font></h3>
<p><span lang="EN"><span></span></span><span style="FONT-FAMILY: 宋体">使用</span><span lang="EN">XDoclet</span><span style="FONT-FAMILY: 宋体">，你能够在</span><span lang="EN">J2EE</span><span style="FONT-FAMILY: 宋体">环境下更加高效地工作，你所看到的</span><span lang="EN">Bean</span><span style="FONT-FAMILY: 宋体">以及</span><span lang="EN">Bean</span><span style="FONT-FAMILY: 宋体">之间的关系将更加简单，许多繁杂的事情将远离你的</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">开发过程。</span></p>
<p><span lang="EN"><span></span>XDoclet</span><span style="FONT-FAMILY: 宋体">从</span><span lang="EN">Rickard Oberg</span><span style="FONT-FAMILY: 宋体">创建的</span><span lang="EN">EJBDoclet</span><span style="FONT-FAMILY: 宋体">工具发展而来，它的设想很简单：避免为每个</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">提供多个文件，而是从单一</span><span lang="EN">Bean</span><span style="FONT-FAMILY: 宋体">类文件中提供组件需要的所有信息。那么，这是如何实现的呢？</span><span lang="EN">Java</span><span style="FONT-FAMILY: 宋体">没有</span><span lang="EN">.NET</span><span style="FONT-FAMILY: 宋体">吹嘘的&ldquo;属性&rdquo;，但</span><span lang="EN">Java</span><span style="FONT-FAMILY: 宋体">有</span><span lang="EN">Javadoc</span><span style="FONT-FAMILY: 宋体">标记。我们可以把一个特殊的</span><span lang="EN">@</span><span style="FONT-FAMILY: 宋体">标记放入</span><span lang="EN">Javadoc</span><span style="FONT-FAMILY: 宋体">注释，然后让一个</span><span lang="EN">Doclet</span><span style="FONT-FAMILY: 宋体">工具处理这些标记。由工具为指定的</span><span lang="EN">Bean</span><span style="FONT-FAMILY: 宋体">生成合适的</span><span lang="EN">XML</span><span style="FONT-FAMILY: 宋体">描述器文件和接口文件。</span><span lang="EN">XDoclet</span><span style="FONT-FAMILY: 宋体">建立在</span><span lang="EN">EJBDoclet</span><span style="FONT-FAMILY: 宋体">思想的基础上，但适用范围不再局限于</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">。现在，我们已经可以用</span><span lang="EN">XDoclet</span><span style="FONT-FAMILY: 宋体">生成</span><span lang="EN">Web</span><span style="FONT-FAMILY: 宋体">服务、</span><span lang="EN">Web</span><span style="FONT-FAMILY: 宋体">应用描述器，甚至还可以对它进行扩展，满足自己的特殊需要。</span><span lang="EN"> </span></p>
<p>&nbsp;</p>
<p><span lang="EN">@</span><span style="FONT-FAMILY: 宋体">标记有一个标准的格式，包含一个&ldquo;名称空间&rdquo;以及一个属于该名称空间的&ldquo;标记名称&rdquo;。标记的属性以&ldquo;名字</span><span lang="EN">=</span><span style="FONT-FAMILY: 宋体">值&rdquo;的形式在标记中指定。下面是一个例子：</span><span lang="EN"> </span></p>
<p>&nbsp;</p>
<p><span lang="EN">/** </span></p>
<p><span lang="EN">* @namespace:tag name=&quot;value&quot; name2=&quot;value2&quot; ... </span></p>
<p><span lang="EN">*/ </span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">当前可用的名称空间包括：</span><span lang="EN"> </span></p>
<p><span lang="EN">ejb </span><span style="FONT-FAMILY: 宋体">标准的</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">信息（非厂商私有的信息）</span><span lang="EN"> </span></p>
<p><span lang="EN">jboss </span><span style="FONT-FAMILY: 宋体">面向</span><span lang="EN">JBoss</span><span style="FONT-FAMILY: 宋体">应用服务器的信息。</span><span lang="EN"> </span></p>
<p><span lang="EN">weblogic </span><span style="FONT-FAMILY: 宋体">面向</span><span lang="EN">BEA Weblogic</span><span style="FONT-FAMILY: 宋体">应用服务器的信息。</span><span lang="EN"> </span></p>
<p><span lang="EN">webSphere </span><span style="FONT-FAMILY: 宋体">面向</span><span lang="EN">IBM WebSphere</span><span style="FONT-FAMILY: 宋体">应用服务器的信息。</span><span lang="EN"> </span></p>
<p><span lang="EN">orion </span><span style="FONT-FAMILY: 宋体">面向</span><span lang="EN">Orion</span><span style="FONT-FAMILY: 宋体">应用服务器（</span><span lang="EN">Oracle</span><span style="FONT-FAMILY: 宋体">）的信息。</span><span lang="EN"> </span></p>
<p><span lang="EN">castor </span><span style="FONT-FAMILY: 宋体">为</span><span lang="EN">Castor</span><span style="FONT-FAMILY: 宋体">框架生成映射信息。</span><span lang="EN"> </span></p>
<p><span lang="EN">mvcsoft </span><span style="FONT-FAMILY: 宋体">为</span><span lang="EN">MVCSoft EJB 2.0</span><span style="FONT-FAMILY: 宋体">持久化管理器生成文件。</span><span lang="EN"> </span></p>
<p><span lang="EN">soap </span><span style="FONT-FAMILY: 宋体">生成</span><span lang="EN">SOAP</span><span style="FONT-FAMILY: 宋体">描述器。</span><span lang="EN"> </span></p>
<p><span lang="EN">struts </span><span style="FONT-FAMILY: 宋体">生成</span><span lang="EN">struts-config.xml</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN"> </span></p>
<p><span lang="EN">web </span><span style="FONT-FAMILY: 宋体">为</span><span lang="EN">Web</span><span style="FONT-FAMILY: 宋体">应用生成</span><span lang="EN">web.xml</span><span style="FONT-FAMILY: 宋体">配置文件。</span><span lang="EN"> </span></p>
<p><span lang="EN">jsp </span><span style="FONT-FAMILY: 宋体">生成标记库扩展描述器信息。</span><span lang="EN"> </span></p>
<p><span style="FONT-FAMILY: 宋体">从上面的清单可以看出，除了</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">之外，</span><span lang="EN">XDoclet</span><span style="FONT-FAMILY: 宋体">还提供了许多其它方面的支持（因此它的名字也从</span><span lang="EN">EJBDoclet</span><span style="FONT-FAMILY: 宋体">变成了</span><span lang="EN">XDcolet</span><span style="FONT-FAMILY: 宋体">）。</span></p>
<h3><font size="5"><span style="FONT-FAMILY: 宋体">在</span><span lang="EN">myEclipse</span><span style="FONT-FAMILY: 宋体">中的配置</span></font></h3>
<p><span lang="EN"><span></span></span><span style="FONT-FAMILY: 宋体">以下本文使用</span><span lang="EN">eclipse</span><span style="FONT-FAMILY: 宋体">结合</span><span lang="EN">myeclipse</span><span style="FONT-FAMILY: 宋体">插件，进行</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的开发和演示。安装好</span><span lang="EN">eclipse</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN">myeclipse</span><span style="FONT-FAMILY: 宋体">以后，就可以新建项目进行</span><span lang="EN">ejb project</span><span style="FONT-FAMILY: 宋体">的开发。</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>1.<span> </span></span></span><span style="FONT-FAMILY: 宋体">新建立</span><span lang="EN">EJB Project</span><span style="FONT-FAMILY: 宋体">。</span></p>
<p style="TEXT-INDENT: -18pt"><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet1.jpg" border="0" height="500" alt="" width="500" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">输入工程名称：</span><span lang="EN">myEJB</span><span style="FONT-FAMILY: 宋体">，注意，</span><span lang="EN">src</span><span style="FONT-FAMILY: 宋体">是默认的源码输出文件夹，因为在</span><span lang="EN">myeclipse</span><span style="FONT-FAMILY: 宋体">中很多</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">配置文件的输出文件目标路径默认值都是该文件夹，所以建议大家不要修改这个默认值。</span></p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog//images/dream4ever_org/gzllm/xdoclet2.jpg" border="0" height="500" alt="" width="500" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">新建立项目后，由于目前没有</span><span lang="EN">ejb-jar.xml</span><span style="FONT-FAMILY: 宋体">的配置文件，所以会有一个</span><span lang="EN">warning</span><span style="FONT-FAMILY: 宋体">信息：</span></p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog//images/dream4ever_org/gzllm/xdoclet3.jpg" border="0" height="80" alt="" width="650" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">这个警告信息会在</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">运行生成</span><span lang="EN">ejb-jar.xml</span><span style="FONT-FAMILY: 宋体">文件后消失。</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>2.<span> </span></span></span><span style="FONT-FAMILY: 宋体">鼠标右键选择新建的</span><span lang="EN">myejb</span><span style="FONT-FAMILY: 宋体">项目，弹出窗口中选择</span><span lang="EN">properties</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet4.jpg" border="0" height="608" alt="" width="307" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">进入到</span><span lang="EN">myeclipse-xdoclet</span><span style="FONT-FAMILY: 宋体">，准备进行项目的</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">配置</span></p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet5.jpg" border="0" height="528" alt="" width="650" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">增加一个标准的配置，然后选择</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的标准配置</span></p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet6.jpg" border="0" height="180" alt="" width="183" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">这个操作将生成</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">代码的选项都进行默认的配置，不依赖于任何的应用程序服务器</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet7.jpg" border="0" height="528" alt="" width="650" /></span></p>
<p><span style="FONT-FAMILY: 宋体">不过我这个演示是用的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的服务器，所以还需要增加</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的选项，右键点上图中的</span><span lang="EN">ejbdoclet</span><span style="FONT-FAMILY: 宋体">的根节点，选择</span><span lang="EN">add</span><span style="FONT-FAMILY: 宋体">来增加</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的生成项目，在出现的选择列表中，选择</span><span lang="EN">jboss</span></p>
<p><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet8.jpg" border="0" height="635" alt="" width="183" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">然后配置新增加的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的选项，一般来说，有如下</span><span lang="EN">4</span><span style="FONT-FAMILY: 宋体">项需要填写，见下图标记部分：</span></p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet9.jpg" border="0" height="655" alt="" width="650" /></span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">其中，</span></p>
<p><span lang="EN">version</span><span style="FONT-FAMILY: 宋体">表明你用的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的版本，我用的是</span><span lang="EN">jboss-4.0.3</span><span style="FONT-FAMILY: 宋体">，但是只需要标记</span><span lang="EN">4.0</span><span style="FONT-FAMILY: 宋体">即可</span><span lang="EN">,</span><span style="FONT-FAMILY: 宋体">如果你使用的是</span><span lang="EN">3.2.*</span><span style="FONT-FAMILY: 宋体">的版本，那就填写成为</span><span lang="EN">3.2</span><span style="FONT-FAMILY: 宋体">，</span></p>
<p><span style="FONT-FAMILY: 宋体">第二个是你在</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">中配置的</span><span lang="EN">datasource</span><span style="FONT-FAMILY: 宋体">的名称</span></p>
<p><span style="FONT-FAMILY: 宋体">第三个是你用到的数据源映射名称，这个名称是不能够任意填写，必须按照</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">配置文件中填写，配置文件在</span><span lang="EN">C:jboss-4.0.3serverdefaultconfstandardjbosscmp-jdbc.xml</span><span style="FONT-FAMILY: 宋体">（我的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">安装目录）我测试用的是</span><span lang="EN">mysql</span><span style="FONT-FAMILY: 宋体">，所以填写</span><span lang="EN">mySQL</span><span style="FONT-FAMILY: 宋体">。如果是</span><span lang="EN">oracle9i</span><span style="FONT-FAMILY: 宋体">的数据库，则为</span><span lang="EN">Oracle9i</span><span style="FONT-FAMILY: 宋体">，更加详细的信息，察看</span><span lang="EN">standardjbosscmp-jdbc.xml</span><span style="FONT-FAMILY: 宋体">文件</span></p>
<p><span style="FONT-FAMILY: 宋体">最后一个是生成</span><span lang="EN">jboss.xml</span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN">jbosscmp-jdbc.xml</span><span style="FONT-FAMILY: 宋体">的目标文件夹，一般生成到</span><span lang="EN">src/META-INF</span><span style="FONT-FAMILY: 宋体">文件夹。</span></p>
<p><span style="FONT-FAMILY: 宋体">到这里，</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">的配置完成，下面将创建</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">的类并根据定义的</span><span lang="EN">tag</span><span style="FONT-FAMILY: 宋体">来生成代码。</span></p>
<h3><font size="5"><span style="FONT-FAMILY: 宋体">生成</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">代码</span></font></h3>
<h3><font size="5"><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet10.jpg" border="0" height="511" alt="" width="536" /></span></font></h3>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">首先创建一个</span><span lang="EN">entitybean</span><span style="FONT-FAMILY: 宋体">，名称为</span><span lang="EN">User</span><span style="FONT-FAMILY: 宋体">，如下图所示，需要注意，包名必须最后是</span><span lang="EN">.ejb</span><span style="FONT-FAMILY: 宋体">结尾，否则</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">不认</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet11.jpg" border="0" height="594" alt="" width="438" /></span></p>
<p><span style="FONT-FAMILY: 宋体">创建完成后，检查生成的代码，</span><span lang="EN">User.java,</span><span style="FONT-FAMILY: 宋体">会发现在类的上方，会出现如下的</span><span lang="EN">tag</span><span style="FONT-FAMILY: 宋体">：</span></p>
<p><span lang="EN">* @ejb.bean name=&quot;User&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>display-name=&quot;Name for User&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>description=&quot;Description for User&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>jndi-name=&quot;ejb/User&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>type=&quot;CMP&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span><span></span>cmp-version=&quot;2.x&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>view-type=&quot;both&quot;</span></p>
<p><span style="FONT-FAMILY: 宋体">这些是默认生成的</span><span lang="EN">tag</span><span style="FONT-FAMILY: 宋体">，不能完全的符合我们的要求，我们修改成为如下，红色为增加的部分：</span></p>
<p><span lang="EN">* @ejb.bean name = &quot;User&quot;</span></p>
<p><span lang="EN">* <span></span>type = &quot;CMP&quot;</span></p>
<p><span lang="EN">* <span></span>cmp-version = &quot;2.x&quot;</span></p>
<p><span lang="EN">* <span></span>display-name = &quot;User&quot;</span></p>
<p><span lang="EN">* <span></span>description = &quot;User&quot;</span></p>
<p><span lang="EN">* <span></span>view-type = &quot;both&quot;</span></p>
<p><span lang="EN">* <span></span>jndi-name = &quot;ejb/UserHome&quot;</span></p>
<p><span lang="EN">* <span></span>local-jndi-name = &quot;ejb/UserLocalHome&quot;</span></p>
<p><span lang="EN">* <span></span>primkey-field = &quot;userId&quot;</span></p>
<p><span lang="EN">* @ejb.persistence table-name = &quot;systemuser&quot;</span></p>
<p><span lang="EN">* @jboss.persistence table-name = &quot;systemuser&quot;</span></p>
<p><span lang="EN">* @ejb:util</span></p>
<p><span lang="EN">* generate=&quot;physical&quot;</span></p>
<p><span style="FONT-FAMILY: 宋体">然后，需要为</span><span lang="EN">user entity</span><span style="FONT-FAMILY: 宋体">增加它的几个相关的方法</span></p>
<p><span style="FONT-FAMILY: 宋体">在相关的地方修改这个抽象的类，修改后，红色为增加的部分：</span></p>
<p><span lang="EN">public abstract class User implements EntityBean {</span></p>
<p>&nbsp;</p>
<p><span lang="EN"><span></span>/** The entity context */</span></p>
<p><span lang="EN"><span></span>private EntityContext context;</span></p>
<p>&nbsp;</p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>* @ejb.persistence column-name = &quot;userId&quot;</span></p>
<p><span lang="EN"><span></span>* @ejb.pk-field</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @return</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract String getUserId();</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @param userId</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract void setUserId(String userId);</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>* @ejb.persistence column-name = &quot;userName&quot;</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @return</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract String getUserName();</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @param userName</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract void setUserName(String userName);</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>* @ejb.persistence column-name = &quot;Password&quot;</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @return</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract String getPassword();</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span>*</span></p>
<p><span lang="EN"><span></span>* @param password</span></p>
<p><span lang="EN"><span></span>*/</span></p>
<p><span lang="EN"><span></span>public abstract void setPassword(String Password);</span></p>
<p><span style="FONT-FAMILY: 宋体">好了，</span><span lang="EN">entitybean</span><span style="FONT-FAMILY: 宋体">修改成为这样以后就可以生成相关的接口和实现类了</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet12.jpg" border="0" height="487" alt="" width="650" /></span></p>
<p><span style="FONT-FAMILY: 宋体">如果运行正常，在控制台窗口中会出现如下提示：</span></p>
<p><span lang="EN">Buildfile: F:workspaceMyEJB.xdoclet-build.tmp.xml</span></p>
<p><span lang="EN">N65540:</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;remoteinterface/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Remote interface for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;localinterface/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Local interface for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;homeinterface/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Home interface for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;localhomeinterface/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Local Home interface for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;dataobject/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Data Object class for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;valueobject/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;entitypk/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;entitycmp/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating CMP class for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;entitybmp/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span><span></span>47<span> </span>) Running &lt;session/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;dao/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;utilobject/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating Util class for 'com.mycom.myejb.entity.ejb.User'.</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;deploymentdescriptor/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating EJB deployment descriptor (ejb-jar.xml).</span></p>
<p><span lang="EN">[ejbdoclet] (XDocletMain.start<span> </span>47<span> </span>) Running &lt;jboss/&gt;</span></p>
<p><span lang="EN">[ejbdoclet] Generating jboss.xml.</span></p>
<p><span lang="EN">[ejbdoclet] Generating jbosscmp-jdbc.xml.</span></p>
<p><span lang="EN">_xdoclet_generation_:</span></p>
<p><span lang="EN">BUILD SUCCESSFUL</span></p>
<p><span lang="EN">Total time: 8 seconds</span></p>
<p><span style="FONT-FAMILY: 宋体">如果你在运行中，出现了</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'">N65540:</span></p>
<p>&nbsp;</p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'">BUILD FAILED</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: 'Courier New'">java.lang.UnsupportedClassVersionError: xjavadoc/ant/XJavadocTask (Unsupported major.minor version 49.0)</span></p>
<p>&nbsp;</p>
<p><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的异常，建议你更换以下</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">eclipse</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">jre</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">环境。例如当我用</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">jdk1.4.2</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的时候就出现上述异常，更换为</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">jdk1.5</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">后即正常运行。</span></p>
<h3><font size="5"><span style="FONT-FAMILY: 宋体">生成</span><span lang="EN">SessionBean</span><span style="FONT-FAMILY: 宋体">代码</span></font></h3>
<p align="center" style="TEXT-ALIGN: center">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">修改生成的类为抽象的类</span></p>
<p><span lang="EN">public abstract class UserManager implements SessionBean {</span></p>
<p><span lang="EN">&hellip;&hellip;&hellip;&hellip;&hellip;.</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">修改</span><span lang="EN">UserManager</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">标签为：</span></p>
<p><span lang="EN">* @ejb.bean name=&quot;UserManager&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>display-name=&quot;Name for UserManager&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>description=&quot;Description for UserManager&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>jndi-name=&quot;ejb/UserManagerHome&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>type=&quot;Stateless&quot;</span></p>
<p><span lang="EN"><span></span>*<span> </span>view-type=&quot;both&quot;</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体">下面将增加一个</span><span lang="EN">login</span><span style="FONT-FAMILY: 宋体">的方法，将</span><span lang="EN">UserManager.java</span><span style="FONT-FAMILY: 宋体">移动到最下方，你会发现</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">已经给你创建了一个现有的方法：</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span><span></span>* An example business method</span></p>
<p><span lang="EN"><span></span><span></span>*</span></p>
<p><span lang="EN"><span></span><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span><span></span>* </span></p>
<p><span lang="EN"><span></span><span></span>* @throws EJBException Thrown if method fails due to system-level error.</span></p>
<p><span lang="EN"><span></span><span></span>*/</span></p>
<p><span lang="EN"><span></span>public void replaceWithRealBusinessMethod() throws EJBException {</span></p>
<p><span lang="EN"><span></span>// rename and start putting your business logic here</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span style="FONT-FAMILY: 宋体">根据你自己的需要修改这个方法，或者增加新的方法，不过一定要保留它的</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的标签</span></p>
<p><span style="FONT-FAMILY: 宋体">例如增加一个方法</span><span lang="EN">:</span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span><span></span>* @ejb.interface-method view-type = &quot;both&quot;</span></p>
<p><span lang="EN"><span></span><span></span>* </span></p>
<p><span lang="EN"><span></span><span></span>* @param username</span></p>
<p><span lang="EN"><span></span><span></span>* @param password</span></p>
<p><span lang="EN"><span></span><span></span>* @return</span></p>
<p><span lang="EN"><span></span><span></span>* @throws EJBException</span></p>
<p><span lang="EN"><span></span><span></span>*/</span></p>
<p><span lang="EN"><span></span>public boolean login(String username,String password) throws EJBException {</span></p>
<p><span lang="EN"><span></span>boolean loginresult = false;</span></p>
<p><span lang="EN"><span></span>if(username.equals(&quot;gary&quot;) &amp;&amp; password.equals(&quot;gzllm&quot;)){</span></p>
<p><span lang="EN"><span></span>System.out.println(&quot;</span><span style="FONT-FAMILY: 宋体">用户名与密码匹配</span><span lang="EN">,</span><span style="FONT-FAMILY: 宋体">允许登录系统</span><span lang="EN">&quot;);</span></p>
<p><span lang="EN"><span></span>loginresult = true;</span></p>
<p><span lang="EN"><span></span>}else{</span></p>
<p><span lang="EN"><span></span>System.out.println(&quot;</span><span style="FONT-FAMILY: 宋体">用户名与密码不匹配</span><span lang="EN">,</span><span style="FONT-FAMILY: 宋体">不登录失败</span><span lang="EN">&quot;);</span></p>
<p><span lang="EN"><span></span>loginresult = false;</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span lang="EN"><span></span>return loginresult;</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span style="FONT-FAMILY: 宋体">然后再次运行</span><span lang="EN">xdoclet</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet15.jpg" border="0" height="692" alt="" width="547" /></span></p>
<p><span style="FONT-FAMILY: 宋体">运行成功后会生成如下图所示结构的代码：</span></p>
<p>&nbsp;</p>
<p><span style="FONT-FAMILY: 宋体"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet16.jpg" border="0" height="417" alt="" width="319" /></span></p>
<p><span style="FONT-FAMILY: 宋体">这个时候就生成了最常用的</span><span lang="EN">SessionBean</span><span style="FONT-FAMILY: 宋体">的代码。</span></p>
<p>&nbsp;</p>
<h3><font size="5"><span style="FONT-FAMILY: 宋体">部署</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">程序</span></font></h3>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>1、<span> </span></span></span><span style="FONT-FAMILY: 宋体">部署</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">代码，首先需要设置你的应用程序服务器，以下我配置了一个</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的应用程序服务器。在</span><span lang="EN">eclipse</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">windows</span><span style="FONT-FAMILY: 宋体">菜单下选择</span><span lang="EN">preferences</span><span style="FONT-FAMILY: 宋体">，选择</span><span lang="EN">myeclipse</span><span style="FONT-FAMILY: 宋体">选项，选择你需要使用的服务器，并配置相关的路径，如下图所示：</span><span lang="EN"></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet17.jpg" border="0" height="511" alt="" width="525" /></span></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>2、<span> </span></span></span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN">Jboss</span><span style="FONT-FAMILY: 宋体">下面的进一步的选项中能够选择运行的模式，可以选择</span><span lang="EN">debug</span><span style="FONT-FAMILY: 宋体">模式和</span><span lang="EN">run</span><span style="FONT-FAMILY: 宋体">模式，建议现在选择</span><span lang="EN">debug</span><span style="FONT-FAMILY: 宋体">模式</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>3、<span> </span></span></span><span lang="EN">JDK</span><span style="FONT-FAMILY: 宋体">选用你正在使用的</span><span lang="EN">jdk</span><span style="FONT-FAMILY: 宋体">，点</span><span lang="EN">ok</span><span style="FONT-FAMILY: 宋体">配置结束</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>4、<span> </span></span></span><span style="FONT-FAMILY: 宋体">由于发布的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">程序需要用到</span><span lang="EN">mySQL</span><span style="FONT-FAMILY: 宋体">数据库，所以还需要配置一下</span><span lang="EN">JBoss</span><span style="FONT-FAMILY: 宋体">，首先拷贝</span><span lang="EN">mysql</span><span style="FONT-FAMILY: 宋体">的数据库配置文件，从</span><span lang="EN">C:jboss-4.0.3docsexamplesjcamysql-ds.xml</span><span style="FONT-FAMILY: 宋体">拷贝到需要发布的服务器中，修改配置文件数据库连接部分为：</span><span lang="EN"><br />
<span></span>&lt;jndi-name&gt;MyEJB&lt;/jndi-name&gt;</span></p>
<p><span lang="EN"><span></span>&lt;connection-url&gt;jdbc:mysql://192.168.2.26:3306/MyEJB&lt;/connection-url&gt;</span></p>
<p><span lang="EN"><span></span>&lt;driver-class&gt;com.mysql.jdbc.Driver&lt;/driver-class&gt;</span></p>
<p><span lang="EN"><span></span>&lt;user-name&gt;root&lt;/user-name&gt;</span></p>
<p><span lang="EN"><span></span>&lt;password&gt;root&lt;/password&gt;</span></p>
<p><span lang="EN"><span></span>&lt;connection-url&gt;jdbc:mysql://192.168.2.26:3306/MyEJB&lt;/connection-url&gt;</span><span style="FONT-FAMILY: 宋体">然后启动你自己的</span><span lang="EN">mysql</span><span style="FONT-FAMILY: 宋体">的数据库，并创建</span><span lang="EN">MyEJB</span><span style="FONT-FAMILY: 宋体">数据库以及相关的</span><span lang="EN">User</span><span style="FONT-FAMILY: 宋体">表。</span></p>
<p><span style="FONT-FAMILY: 宋体">另外，还需要将用到的数据库连接驱动程序</span><span lang="EN">mysql-connector-java-3.1.10-bin.jar</span><span style="FONT-FAMILY: 宋体">（我用的</span><span lang="EN">mysql</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">jdbc</span><span style="FONT-FAMILY: 宋体">驱动程序是</span><span lang="EN">mysql-connector-java-3.1.10</span><span style="FONT-FAMILY: 宋体">）拷贝到应用程序服务器的</span><span lang="EN">lib</span><span style="FONT-FAMILY: 宋体">目录中，我的目录是</span><span lang="EN">C:jboss-4.0.3serverdefaultlib</span><span style="FONT-FAMILY: 宋体">，否则在启动</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">的时候会报异常：</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">16:48:25,078 WARN<span> </span>[JBossManagedConnectionPool] Throwable while attempting to get a new connection: null</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">org.jboss.resource.JBossResourceException: Could not create connection; </span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">- nested throwable: (org.jboss.resource.JBossResourceException: Failed to register driver for: com.mysql.jdbc.Driver; </span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">- nested throwable: (java.lang.ClassNotFoundException: </span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">No ClassLoaders found for: com.mysql.jdbc.Driver))</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>5、<span> </span></span></span><span style="FONT-FAMILY: 宋体">在</span><span lang="EN">eclipse</span><span style="FONT-FAMILY: 宋体">的工具栏中找到如图所示的一个按钮</span><span lang="EN"></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet18.jpg" border="0" height="91" alt="" width="325" /></span></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>6、<span> </span></span></span><span style="FONT-FAMILY: 宋体">增加一个配置</span><span lang="EN"><br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet19.jpg" border="0" height="438" alt="" width="506" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>7、<span> </span></span></span><span style="FONT-FAMILY: 宋体">选择刚才配置的</span><span lang="EN">jboss</span><span style="FONT-FAMILY: 宋体">服务器</span><span lang="EN"></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet20.jpg" border="0" height="513" alt="" width="481" /></span></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>8、<span> </span></span></span><span style="FONT-FAMILY: 宋体">选择完成。</span><span lang="EN"><br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet21.jpg" border="0" height="513" alt="" width="481" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>9、<span> </span></span></span><span style="FONT-FAMILY: 宋体">部署完成</span><span lang="EN"></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet22.jpg" border="0" height="438" alt="" width="506" /></span></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>10、<span> </span></span></span><span style="FONT-FAMILY: 宋体">运行</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">，点击部署旁边的一个按钮：</span><span lang="EN"><br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet23.jpg" border="0" height="130" alt="" width="319" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'"><span>11、<span> </span></span></span><span lang="EN">Jboss</span><span style="FONT-FAMILY: 宋体">启动过程中，可以看到，刚才写的</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">部分已经发布成功。</span><span lang="EN"></span><span style="FONT-FAMILY: 宋体">在控制台的启动</span><span lang="EN">log</span><span style="FONT-FAMILY: 宋体">中，你可以看到类似以下语句：</span><span lang="EN"></span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:16,453 INFO<span> </span>[ConnectionFactoryBindingService] Bound ConnectionManager 'jboss.jca:name=MyEJB,service=DataSourceBinding' to JNDI name 'java:MyEJB'</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:17,312 INFO<span> </span>[EjbModule] Deploying User</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:17,812 INFO<span> </span>[EjbModule] Deploying UserManager</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:18,250 INFO<span> </span>[BaseLocalProxyFactory] Bound EJB LocalHome 'User' to jndi 'ejb/UserLocalHome'</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:18,328 INFO<span> </span>[ProxyFactory] Bound EJB Home 'User' to jndi 'ejb/UserHome'</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:22,796 INFO<span> </span>[BaseLocalProxyFactory] Bound EJB LocalHome 'UserManager' to jndi 'UserManagerLocal'</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:22,812 INFO<span> </span>[ProxyFactory] Bound EJB Home 'UserManager' to jndi 'ejb/UserManagerHome'</span></p>
<p><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">17:00:22,828 INFO<span> </span>[EJBDeployer] Deployed: file:/C:/jboss-4.0.3/server/default/deploy/MyEJB.jar/</span></p>
<p><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">说明</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">entitybean </span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">与</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">sessionbean </span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">部署运行成功。</span></p>
<p><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">在</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">JBoss</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的管理界面中，也可以找到如下的关于</span><span lang="EN" style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 'Courier New'">myejb.jar</span><span style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: 宋体">的部署说明：</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h3><font size="5"><span style="FONT-FAMILY: 宋体">测试</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">程序</span></font></h3>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>1、<span> </span></span></span><span style="FONT-FAMILY: 宋体">新建一个</span><span lang="EN">java project</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN">project name </span><span style="FONT-FAMILY: 宋体">为</span><span lang="EN">MyEJBTest<br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet25.jpg" border="0" height="500" alt="" width="500" /></span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet26.jpg" border="0" height="592" alt="" width="500" /><br />
</span><span style="FONT-FAMILY: 宋体">在项目的</span><span lang="EN">libraries</span><span style="FONT-FAMILY: 宋体">中，将</span><span lang="EN">J2EE</span><span style="FONT-FAMILY: 宋体">的包添加到项目中，另外还需要增加一个变量，如下图所示：</span><span lang="EN"><br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet27.jpg" border="0" height="191" alt="" width="398" /></span><span style="FONT-FAMILY: 宋体">然后将新增加的变量也增加到你的项目</span><span lang="EN">libories</span><span style="FONT-FAMILY: 宋体">中：</span><span lang="EN"><br />
<img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet28.jpg" border="0" height="592" alt="" width="500" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>2、<span> </span></span></span><span style="FONT-FAMILY: 宋体">在项目的构建路径中增加对</span><span lang="EN">MyEJB</span><span style="FONT-FAMILY: 宋体">项目的引用：</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet29.jpg" border="0" height="518" alt="" width="650" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>3、<span> </span></span></span><span style="FONT-FAMILY: 宋体">新建一个类</span><span lang="EN">Test</span><span style="FONT-FAMILY: 宋体">：</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet30.jpg" border="0" height="592" alt="" width="495" /></span> </p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>4、<span> </span></span></span><span style="FONT-FAMILY: 宋体">编辑生成的</span><span lang="EN">Test</span><span style="FONT-FAMILY: 宋体">的类，修改后的代码如下所示：</span><span lang="EN"><br />
package com.mycompany.myejb.test;</span></p>
<p>&nbsp;</p>
<p><span lang="EN">import java.rmi.RemoteException;</span></p>
<p><span lang="EN">import java.util.Properties;</span></p>
<p>&nbsp;</p>
<p><span lang="EN">import javax.ejb.CreateException;</span></p>
<p><span lang="EN">import javax.naming.Context;</span></p>
<p><span lang="EN">import javax.naming.InitialContext;</span></p>
<p><span lang="EN">import javax.naming.NamingException;</span></p>
<p><span lang="EN">import javax.rmi.PortableRemoteObject;</span></p>
<p>&nbsp;</p>
<p><span lang="EN">import com.mycom.myejb.session.interfaces.UserManager;</span></p>
<p><span lang="EN">import com.mycom.myejb.session.interfaces.UserManagerHome;</span></p>
<p>&nbsp;</p>
<p><span lang="EN">public class Test {</span></p>
<p><span lang="EN"><span></span>Properties properties;</span></p>
<p><span lang="EN"><span></span></span></p>
<p><span lang="EN"><span></span>public Test() {</span></p>
<p><span lang="EN"><span></span>properties = new Properties();</span></p>
<p><span lang="EN"><span></span>properties.put(&quot;java.naming.factory.initial&quot;,</span></p>
<p><span lang="EN"><span></span>&quot;org.jnp.interfaces.NamingContextFactory&quot;);</span></p>
<p><span lang="EN"><span></span>properties.put(&quot;java.naming.factory.url.pkgs&quot;,</span></p>
<p><span lang="EN"><span></span>&quot;org.jboss.naming:org.jnp.interfaces&quot;);</span></p>
<p><span lang="EN"><span></span>properties.put(&quot;java.naming.provider.url&quot;, &quot;jnp://localhost:1099&quot;);</span></p>
<p><span lang="EN"><span></span>properties.put(&quot;jnp.disableDiscovery&quot;, &quot;true&quot;);</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span lang="EN"><span></span></span></p>
<p><span lang="EN"><span></span>/**</span></p>
<p><span lang="EN"><span></span><span></span>* @param args</span></p>
<p><span lang="EN"><span></span><span></span>*/</span></p>
<p><span lang="EN"><span></span>public static void main(String[] args) {</span></p>
<p><span lang="EN"><span></span>// TODO Auto-generated method stub</span></p>
<p><span lang="EN"><span></span>Test t = new Test();</span></p>
<p><span lang="EN"><span></span>System.out.println(&quot;</span><span style="FONT-FAMILY: 宋体">登录测试结果</span><span lang="EN">:&quot; + t.testLogin(&quot;gary&quot;, &quot;gzllm&quot;));</span></p>
<p><span lang="EN"><span></span>System.out.println(&quot;</span><span style="FONT-FAMILY: 宋体">登录测试结果</span><span lang="EN">:&quot; + t.testLogin(&quot;errorUser&quot;, &quot;gzllm&quot;));</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span lang="EN"><span></span></span></p>
<p><span lang="EN"><span></span>public boolean testLogin(String username, String password) {</span></p>
<p><span lang="EN"><span></span>boolean loginresult = false;</span></p>
<p><span lang="EN"><span></span>Context ctx;</span></p>
<p><span lang="EN"><span></span>try {</span></p>
<p><span lang="EN"><span></span>ctx = new InitialContext(properties);</span></p>
<p><span lang="EN"><span></span>Object object = ctx.lookup(UserManagerHome.JNDI_NAME);</span></p>
<p><span lang="EN"><span></span>UserManagerHome userManagerHome = (UserManagerHome) PortableRemoteObject</span></p>
<p><span lang="EN"><span></span>.narrow(object, UserManagerHome.class);</span></p>
<p><span lang="EN"><span></span>UserManager userManager = userManagerHome.create();</span></p>
<p><span lang="EN"><span></span>loginresult = userManager.login(username, password);</span></p>
<p><span lang="EN"><span></span>} catch (NamingException e) {</span></p>
<p><span lang="EN"><span></span>e.printStackTrace();</span></p>
<p><span lang="EN"><span></span>} catch (RemoteException e) {</span></p>
<p><span lang="EN"><span></span>e.printStackTrace();</span></p>
<p><span lang="EN"><span></span>} catch (CreateException e) {</span></p>
<p><span lang="EN"><span></span>e.printStackTrace();</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span lang="EN"><span></span>return loginresult;</span></p>
<p><span lang="EN"><span></span>}</span></p>
<p><span lang="EN"><span></span></span></p>
<p><span lang="EN">}</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>5、<span> </span></span></span><span style="FONT-FAMILY: 宋体">如上的测试程序测试部署成功的</span><span lang="EN">myejb.jar</span><span style="FONT-FAMILY: 宋体">中的</span><span lang="EN">login</span><span style="FONT-FAMILY: 宋体">的方法，如果输入的用户名与密码为</span><span lang="EN">gary/gzllm</span><span style="FONT-FAMILY: 宋体">则返回</span><span lang="EN">true</span><span style="FONT-FAMILY: 宋体">，否则其他的就返回</span><span lang="EN">false</span><span style="FONT-FAMILY: 宋体">，运行生成的</span><span lang="EN">Test</span><span style="FONT-FAMILY: 宋体">，可以看到如下输出结果：</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><img src="http://dreamz.org/drlblog/images/dream4ever_org/gzllm/xdoclet31.jpg" border="0" height="242" alt="" width="650" /></span> </p>
<p><span style="FONT-FAMILY: 宋体">整个程序测试成功。</span></p>
<h3><span style="FONT-FAMILY: 宋体"><font size="5">总结与补充</font></span></h3>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>1.<span> </span></span></span><span style="FONT-FAMILY: 宋体">由于</span><span lang="EN">EJB</span><span style="FONT-FAMILY: 宋体">的一个最基本的设计模式</span><span lang="EN">Session Fa&ccedil;ade</span><span style="FONT-FAMILY: 宋体">，我并没有在测试程序中直接调用</span><span lang="EN">User</span><span style="FONT-FAMILY: 宋体">这个</span><span lang="EN">entitybean</span><span style="FONT-FAMILY: 宋体">，甚至为了简便，甚至生成了这个类以后就没有使用它。建议在</span><span lang="EN">SessionBean</span><span style="FONT-FAMILY: 宋体">中再调用</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">，也就是说，你可以在</span><span lang="EN">UserManager</span><span style="FONT-FAMILY: 宋体">这个</span><span lang="EN">sessionbean</span><span style="FONT-FAMILY: 宋体">中调用</span><span lang="EN">User</span><span style="FONT-FAMILY: 宋体">这个</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">进行进一步的读取数据库，验证输入的用户名称与密码是否和数据库表中的数据一致，具体的访问操作，在</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">中操作。</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>2.<span> </span></span></span><span lang="EN">Hibernate</span><span style="FONT-FAMILY: 宋体">的出现，给</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的使用带来了新的机遇，你可以生成</span><span lang="EN">hibernate</span><span style="FONT-FAMILY: 宋体">的相关对象，然后在</span><span lang="EN">SessionBean</span><span style="FONT-FAMILY: 宋体">的方法中不调用</span><span lang="EN">EntityBean</span><span style="FONT-FAMILY: 宋体">，而是直接调用</span><span lang="EN">Hibernate</span><span style="FONT-FAMILY: 宋体">的对象，进行数据库的访问。这将带来更大的灵活性，并能提高程序开发的效率</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>3.<span> </span></span></span><span style="FONT-FAMILY: 宋体">在测试程序中，可以使用</span><span lang="EN">Factory</span><span style="FONT-FAMILY: 宋体">模式，简化</span><span lang="EN">SessionBean</span><span style="FONT-FAMILY: 宋体">对象的创建，并能够提高重用。</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>4.<span> </span></span></span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">不止能够创建</span><span lang="EN">ejb</span><span style="FONT-FAMILY: 宋体">的代码，还能够产生</span><span lang="EN">hibernate</span><span style="FONT-FAMILY: 宋体">等很多代码，需要进行相关的配置即可，这需要对</span><span lang="EN">xdoclet</span><span style="FONT-FAMILY: 宋体">的文档进行进一步的查看与研究，另外还能够自定义</span><span lang="EN">tag</span><span style="FONT-FAMILY: 宋体">，例如生成</span><span lang="EN">javascript</span><span style="FONT-FAMILY: 宋体">的校验代码。</span><span lang="EN">Xdoclet</span><span style="FONT-FAMILY: 宋体">是个好东西，就是用起来很复杂。</span></p>
<p style="TEXT-INDENT: -18pt"><span lang="EN"><span>5.<span> </span></span></span><span lang="EN">eclipse</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">export</span><span style="FONT-FAMILY: 宋体">功能可以输出</span><span lang="EN">ant</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN">build.xml</span><span style="FONT-FAMILY: 宋体">文件，不过这个配置文件很基本，你可以根据生成的</span><span lang="EN">build</span><span style="FONT-FAMILY: 宋体">配置文件，进一步的扩充，使开发</span><span lang="EN">-</span><span style="FONT-FAMILY: 宋体">〉测试</span><span lang="EN">-</span><span style="FONT-FAMILY: 宋体">〉打包</span><span lang="EN">-</span><span style="FONT-FAMILY: 宋体">〉部署自动化，能提高开发效率。</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
</div>
<br />
          <br/>
          <span style="color:red;">
            <a href="http://dongivan.javaeye.com/blog/99515#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/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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jul 2007 22:57:37 +0800</pubDate>
        <link>http://dongivan.javaeye.com/blog/99515</link>
        <guid>http://dongivan.javaeye.com/blog/99515</guid>
      </item>
      <item>
        <title>工作流管理系统概述</title>
        <author>dongivan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dongivan.javaeye.com">dongivan</a>&nbsp;
          链接：<a href="http://dongivan.javaeye.com/blog/93964" style="color:red;">http://dongivan.javaeye.com/blog/93964</a>&nbsp;
          发表时间: 2007年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.&nbsp;&nbsp;概述<br />
<br />
企业在进行业务处理时，政府在进行公文审批时，都是以流程形式而进行的，在信息化的过程中，企业、政府也将这些业务处理、公文审批的过程信息化了，早期通常是通过程序硬编码的方式来处理这些业务、公文的流转，随着业务、公文的复杂的处理情况不断出现以及需求的不断变更，这种硬编码的方式显然已无法应对，这个时候工作流管理系统应运而生，掀起了一股工作流管理系统的热潮。<br />
<br />
那么到底工作流管理系统能够带来什么好处？工作流管理系统通过对业务、公文流转进行分析以及抽象，将不变和变化的部分进行划分，用户可轻松的通过可视化的工具对事项的流程、流程环节涉及的人员(角色)、流程环节的表单、流程环节的操作进行修改，从而到达了应对不断变化的需求的目的，而工作流管理系统通常提供的流程监控、查询统计模块更是极大程度的为用户优化流程提供支持，以提高企业、政府的工作效率。<br />
<br />
本文主要描述工作流管理系统通常的结构、参考模型以及通常使用的调度算法。<br />
<br />
二.&nbsp;&nbsp;构成<br />
<br />
工作流管理系统，简称WFMS，经过对业务、公文流转过程的分析以及抽象，工作流管理系统围绕业务交互逻辑、业务处理逻辑以及参与者三个问题进行解决，业务交互逻辑对应的为业务的流转过程，在工作流管理系统中对应的提出了工作流引擎、工作流设计器、流程操作来解决业务交互逻辑的问题，业务处理逻辑对应业务流转过程中的表单、文档等的处理，在工作流管理系统中对应的提出了表单设计器、与表单的集成来解决业务处理逻辑的问题，参与者对应到的为流转过程中环节对应的人或程序，在工作流管理系统中通过与应用程序的集成来解决参与者的问题。<br />
<br />
工作流管理系统为方便业务交互逻辑、业务处理逻辑以及参与者的修改，多数通过提供可视化的流程设计器以及表单设计器来实现，为实现工作流管理系统的扩展性，多数提供了一系列的API。<br />
<br />
一个完整的工作流管理系统通常由工作流引擎、工作流设计器、流程操作、工作流客户端程序、流程监控、表单设计器、与表单的集成以及与应用程序的集成八个部分组成。<br />
<br />
2.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作流引擎<br />
<br />
工作流引擎作为工作流管理系统的核心部分，主要提供了对于工作流定义的解析以及流程流转的支持。工作流定义文件描述了业务的交互逻辑，工作流引擎通过解析此工作流定义文件按照业务的交互逻辑进行业务的流转，工作流引擎通常通过参考某种模型来进行设计，通过调度算法来进行流程的流转(流程的启动、终止、挂起、恢复等)，通过各种环节调度算法(SPLIT、AND、OR等)来实现对于环节的流转(环节的合并、分叉、选择、条件性的选择等)。<br />
<br />
2.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作流设计器<br />
<br />
工作流设计器为可视化的流程设计工具，用户通过拖放等方式来绘制流程，并通过对于环节的配置来实现环节操作、环节表单、环节参与者的配置。<br />
<br />
工作流设计器为用户以及开发商提供了快速绘制、修改流程的方式，工作流设计器的好坏决定到工作流管理系统的易用性。<br />
<br />
2.3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;流程操作<br />
<br />
流程操作指所支持的对于流程环节的操作，如启动流程、终止流程、挂起流程、直流、分流(单人办理)、并流(多人同时办理)、联审等，象这些流程操作都是可直接基于引擎所提供的环节调度算法来直接支持的，而在实际的需求中，通常需要自由的对于流程进行干涉，如取回、回退、跳转、追加、传阅、传阅办理等，而这些流程操作对于工作流引擎来说是不合理的，因此必须单独的去实现。<br />
<br />
流程操作支持的好坏直接决定到一个工作流管理系统的实用性。<br />
<br />
2.4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;工作流客户端程序<br />
<br />
工作流客户端程序为工作流系统的表现形式，通常使用Web方式进行展现，通过提供待办列表、已办列表、执行流程操作、查看流程历史信息等来展现工作流系统的功能。<br />
<br />
2.5.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;流程监控<br />
<br />
流程监控通过提供图形化的方式来对流程执行过程进行监控，包括流程运转状况，每个环节所耗费的时间等等，而通过这些可相应的进行流程的优化，以提高工作效率。<br />
<br />
2.6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;表单设计器<br />
<br />
表单设计器为可视化的表单设计工具，用户通过拖放的方式来绘制业务所需的表单，并可相应的进行表单数据的绑定。<br />
<br />
表单设计器为客户以及开发商提供了快速修改表单的方法，表单设计器的易用与否以及功能的完善与否影响到工作流管理系统的易用性。<br />
<br />
2.7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与表单的集成<br />
<br />
通常业务流转需要表单来表达实际的业务，因此需要与表单进行集成来实现业务意义，与表单的集成通常包括表单数据的自动获取、存储、修改，表单域的权限控制、流程相关数据的维护以及流程环节表单的绑定。<br />
<br />
与表单的集成的好坏影响到工作流管理系统是否能提高开发效率。<br />
<br />
2.8.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;与应用程序的集成<br />
<br />
通过与应用程序的集成来完善工作流管理系统的业务意义，主要涉及到的是与权限系统以及组织机构的集成。流程环节需要相应的绑定不同的执行角色，而流程操作通常需要与权限系统、组织机构进行关联。<br />
<br />
三.&nbsp;&nbsp;参考模型<br />
<br />
工作流系统通常通过参考一些标准的模型来进行设计，主要的有WFMC和OMG，在这里主要介绍一下WFMC。<br />
<br />
3.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WFMC<br />
<br />
WFMC是国际工作流管理联盟，它于1993年成立，发布了一系列的工作流定义、软件接口的草案文本，是目前世界上公认的最具权威性的工作流标准制定机构，得到了广泛的支持和应用。<br />
<br />
2002年10月25日，WFMC发布了基于XML的流程定义语言1.0版的最终文本（Workflow&nbsp;Process&nbsp;Definition&nbsp;Interface----XML&nbsp;Process&nbsp;Definition&nbsp;Language&nbsp;&nbsp;文档编号：WFMC-TC-1025），以及此前发布的工作流应用软件接口规范WFMC-TC-1009,&nbsp;WFMC-TC-1013等系列文件，构成了工作流定义及系统的设计标准。<br />
<br />
为了实现不同工作流产品之间的互操作，WfMC在工作流管理系统的相关术语、体系结构及应用编程接口等方面制定了一系列标准。工作流管理联盟给出的工作流定义是：工作流是指整个或部分经营过程在计算机支持下的全自动或半自动化。在实际情况中可以更广泛地把凡是由计算机软件系统（工作流管理系统）控制其执行的过程都称为工作流。<br />
<br />
一个工作流包括一组活动及它们的相互顺序关系，还包括过程及活动的启动和终止条件，以及对每个活动的描述。工作流管理系统指运行在一个或多个工作流引擎上用于定义、实现和管理工作流运行的一套软件系统，它与工作流执行者（人、应用）交互，推进工作流实例的执行，并监控工作流的运行状态。<br />
<br />
WFMC主要提出了五个接口与工作流执行服务一起共同组成了工作流系统：<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口一(工作流定义交换)，用于在建模和定义工具与执行服务之间交换工作流定义。主要是数据交换格式和API。数据交换通过XPDL，API通过WAPI。<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口二(工作流客户端应用接口)，用于工作流客户端应用访问工作流引擎和工作列表，通过WAPI完成。<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口三(被调用的应用接口)，用于调用不同的应用系统。<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口四(工作流系统互操作接口)，用于不同工作流系统之间的互操作。<br />
<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;接口五(系统管理和监控)，用于系统管理应用访问工作流执行服务。<br />
<br />
四.&nbsp;&nbsp;核心调度算法<br />
<br />
通常流程引擎采用的核心调度算法主要有FSM以及PetriNet两种，基于调度算法来完成流程的流转。<br />
<br />
4.1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FSM(有限状态机)<br />
<br />
FSM的定义为包含一组状态集（states）、一个起始状态（start&nbsp;state）、一组输入符号集（alphabet）、一个映射输入符号和当前状态到下一状态的转换函数（transition&nbsp;function）的计算模型。当输入符号串，模型随即进入起始状态。它要改变到新的状态，依赖于转换函数。在有限状态机中，会有有许多变量，例如，状态机有很多与动作（actions）转换(Mealy机)或状态（摩尔机）关联的动作，多重起始状态，基于没有输入符号的转换，或者指定符号和状态（非定有限状态机）的多个转换，指派给接收状态（识别者）的一个或多个状态，等等。<br />
<br />
遵循FSM流程引擎通过状态的切换来完成流程的流转。<br />
<br />
4.2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PetriNet<br />
<br />
信息流的一个抽象的、形式的模型。指出一系统的静态和动态性质。petrinet通常表示成图。图中有两类用弧彼此相连的结点（称为地点和变换）和指示其动态性能的标记（称为记号）。<br />
<br />
遵循PetriNet流程引擎通过令牌来决定流程的流转。<br />
          <br/>
          <span style="color:red;">
            <a href="http://dongivan.javaeye.com/blog/93964#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/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Jun 2007 14:18:48 +0800</pubDate>
        <link>http://dongivan.javaeye.com/blog/93964</link>
        <guid>http://dongivan.javaeye.com/blog/93964</guid>
      </item>
      <item>
        <title>Hello, XWork Interceptor</title>
        <author>dongivan</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dongivan.javaeye.com">dongivan</a>&nbsp;
          链接：<a href="http://dongivan.javaeye.com/blog/83572" style="color:red;">http://dongivan.javaeye.com/blog/83572</a>&nbsp;
          发表时间: 2007年05月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="100%" cellpadding="0">
    <tbody>
        <tr>
            <td class="diarybody2" width="100%">
            <p><a href="http://www.opensymphony.com/xwork/">XWork</a>是一个通用的Command模式框架，对它的关注始于我对Interceptor结构了解的需要。对于起步而言，Hello World级的东西总是最为快捷的选择。</p>
            <p>在XWork中，Action用以处理核心的逻辑，下面就是一个：</p>
            <p><strong>HelloAction.java<br />
            </strong></p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.Action; &nbsp;&nbsp;</span></span> </li>
                <li class=""><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HelloAction&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Action&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;execute()&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Hello,&nbsp;World&quot;</span><span>); &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;SUCCESS; &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
                <li class=""><span>}&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>然后是调用这个Action，如果直接调用的话，一来代码显得没有多大意义，二来后面的戏就没法继续了。于是写出这样的代码：</p>
            <p><strong>Main.java<br />
            </strong></p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.ActionProxyFactory; &nbsp;&nbsp;</span></span> </li>
                <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.ActionProxy; &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Main&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionProxyFactory&nbsp;factory&nbsp;=&nbsp;ActionProxyFactory.getFactory(); &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionProxy&nbsp;proxy&nbsp;=&nbsp;factory.createActionProxy(</span><span class="string">&quot;&quot;</span><span>,&nbsp;</span><span class="string">&quot;hello&quot;</span><span>,&nbsp;</span><span class="keyword">null</span><span>); &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proxy.execute(); &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
                <li class=""><span>} &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>AcionProxy，我们可以将它看作Action的一个壳，它的调用最终会作用在Action身上，因此它拥有了&ldquo;proxy&rdquo;的美名。而ActionProxyFactory，名字就体现出了它的作用，制造AcitonProxy。<br />
            先别忙着运行程序，智慧如你一定会想到，这个proxy怎么和前面的HelloAction关联在一起。我们还需要一个配置文件：</p>
            <p><strong>xwork.xml<br />
            </strong></p>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span><!--CTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN"   </sp--></span></span></li>
                <li class=""><span>&nbsp;&quot;http://www.opensymphony.com/xwork/xwork-1.0.dtd&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">xwork</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">package</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;default&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hello&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;HelloAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">package</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
                <li class=""><span></span><span class="tag"><span class="tag-name">xwork</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>&ldquo;Hello&rdquo;，这样一个字符串起到&ldquo;一桥飞架南北，天堑变通途&rdquo;的作用，一端它在ActionProxyFactory创建ActionProxy时，作为传入参数连接起proxy，另一端它在配置文件中，与具体类型相连，找到了具体的Action。<br />
            既然困难已经排除，还等什么？就这样，&ldquo;Hello, World&rdquo;出现了。也许会有些无关大雅的警告，说明我们没有为HelloAction返回success进行处理，忽略它。</p>
            <p>blog的标题提醒我，终极目标是Interceptor。Interceptor是这样一种架构模式，它允许将服务透明地添加到框架之中，当我们关注的事件发生时，就会自动触发这个服务。JBoss之所以灵活，其核心架构就是Interceptor。对了，XWork的来源于WebWork，而WebWork的创造者便是大名鼎鼎的Rickard Oberg，而他正是JBoss灵活的架构正是出自他的手笔。J2EE开发者的工具箱中还有一件工具也采用了Interceptor的实现，它便是Servlet Filter。了解Interceptor对于理解AOP有着相当的好处，因为二者之间存在太多的相似，以致于有人专门站出来声明&ldquo;AOP != Interceptor&rdquo;。</p>
            <p>对于程序员而言，任何话语都没有代码来得实惠，下面就是一个Interceptor：</p>
            <p><strong>HelloInterceptor.java</strong><br />
            </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.interceptor.Interceptor; &nbsp;&nbsp;</span></span> </li>
                <li class=""><span></span><span class="keyword">import</span><span>&nbsp;com.opensymphony.xwork.ActionInvocation; &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;HelloInterceptor&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Interceptor&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;init()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;destroy()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception&nbsp;{ &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Hello,&nbsp;Interceptor&quot;</span><span>); &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;invocation.invoke(); &nbsp;&nbsp;</span> </li>
                <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
                <li class=""><span>} &nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>省略用以管理声明周期的init和destroy，我们把焦点放在intercept方法。除了一句将用以证明它存在的打印语句之外，这个方法中还有一条语句：<br />
            &nbsp;&nbsp;&nbsp; </p>
            <div class="code_title">java 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-j">
                <li class="alt"><span><span class="keyword">return</span><span>&nbsp;invocation.invoke();&nbsp;&nbsp;</span></span> </li>
            </ol>
            </div>
            <p><br />
            在通常的Interceptor实现中，各个Interceptor往往会形成一条链，这句invocation.invoke()就是把控制权交出的方式，调用便是沿着这条链一步步向后面走去，熟悉设计模式的朋友一眼便能看出，这是职责链的一种实现，而它恰恰是Interceptor架构的关键。</p>
            <p>为了让它发光发热，我们还需要在配置文件里做一些修改，先是加上一个Interceptor：<br />
            </p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;helloInterceptor&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;HelloInterceptor&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag"><span class="tag-name">interceptors</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p><br />
            接着，要让action知道它的存在，我们还要修改Action：<br />
            </p>
            <div class="code_title">xml 代码</div>
            <div class="dp-highlighter">
            <div class="bar"></div>
            <ol class="dp-xml">
                <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">action</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;hello&quot;</span><span>&nbsp;</span><span class="attribute">class</span><span>=</span><span class="attribute-value">&quot;HelloAction&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">interceptor-ref</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;helloInterceptor&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
                <li class="alt"><span></span><span class="tag"><span class="tag-name">action</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>至于主文件，就不再修改了，否则如何体现&ldquo;透明&rdquo;的添加服务呢！<br />
            再次运行程序，劳动成果得到了体现：<br />
            Hello, Interceptor<br />
            Hello, World</p>
            </td>
        </tr>
    </tbody>
</table>
<p>来自&nbsp;<font face="Arial">http://dreamhead.blogbus.com/logs/2004/12/549553.html</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://dongivan.javaeye.com/blog/83572#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/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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 May 2007 13:34:44 +0800</pubDate>
        <link>http://dongivan.javaeye.com/blog/83572</link>
        <guid>http://dongivan.javaeye.com/blog/83572</guid>
      </item>
  </channel>
</rss>