<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>JBPM @net</title>
    <description>工作流的运用越来越多，在Java领域最近异军突起的工作流非JBPM莫属了。可是在国内这方面的资料很少，希望可以通过JavaEye这个开源社区把JBPM普及开来！</description>
    <link>http://jbpm.group.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>为什么我在用jbpm的myeclipse流程设计器部署定义文件会出错?</title>
        <author>geekwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://geekwang.javaeye.com">geekwang</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/211846" style="color:red;">http://jbpm.group.javaeye.com/group/blog/211846</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我用mysql5.0做数据库的时候,用myeclipse的流程设计器插件部署流程定义文件是成功的,但是现在用sql server 2005做数据库,数据库连接是正确的,在jbpm-console页面上是可以看到数据库的数据的,但是就是不能部署流程定义文件,出现如下的错误.请问是什么原因?</p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/211846#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 12:52:15 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/211846</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/211846</guid>
      </item>
      <item>
        <title>JBPM  JPA  Spring  闹别扭了  ==============</title>
        <author>isky</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://isky.javaeye.com">isky</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/206646" style="color:red;">http://jbpm.group.javaeye.com/group/blog/206646</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp; <span style="font-size: medium; font-family: 楷体;">各位大家好，&nbsp; jbpm的ORM映射用的是Hibernate&nbsp;&nbsp;&nbsp; 如果我想整合到我现有的项目JPA+Spring，&nbsp; 那么该如何处理？</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/206646#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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 13:55:15 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/206646</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/206646</guid>
      </item>
      <item>
        <title>请问大虾门 为什么jbpm对mysql5.x的支持有问题？</title>
        <author>dengzi725</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dengzi725.javaeye.com">dengzi725</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/206432" style="color:red;">http://jbpm.group.javaeye.com/group/blog/206432</a>&nbsp;
          发表时间: 2008年06月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          请问大虾门 为什么jbpm对mysql5.x的支持有问题？
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/206432#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/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><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Jun 2008 18:24:56 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/206432</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/206432</guid>
      </item>
      <item>
        <title>Jbpm工作流与ssh框架集成</title>
        <author>shazhenzhong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shazhenzhong.javaeye.com">shazhenzhong</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/205831" style="color:red;">http://jbpm.group.javaeye.com/group/blog/205831</a>&nbsp;
          发表时间: 2008年06月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          目录<br /><br />简述<br /><br />使用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化配置插件<br /><br />部署jbpm的jar包和moudle的jar包<br /><br />部署hbm文件到项目<br /><br />设置大字段string-max<br /><br />配置configration、template<br /><br />过滤器的设置与建立<br /><br />编写发布流程定义xml的人机页面及程序<br /><br />写在最后<br /><br /> <br /><br /> <br /><br /><br /><br /> <br /><br /> <br /><br />简述<br />Jbpm工作流框架与现有ssh框架的集成工作其实很简单，但国内外的资料太小，所以会在集成时走入太多误区，本文是在struts1.2,spring2.5,hibernate3.2上集成成功的详细步骤。其中解决了,jbpm的访问数据库session与原有hibernate的session不同的问题，string-max大字段问题。完成了流程部署web及后台程序。利用spring-modules-0.8当中的spring31做为集成的桥梁（其实它已经做好了集成，但文档和实例实在是太简单）。<br /><br />使用jbpm-starters-kit-3.1.4生成数据库表及安装eclipse图形化配置插件<br />1下载jbpm-starters-kit-3.1.4到其网站，包含所有需要的工具及jar包。<br /><br />2数据库的安装以oracle为例，其它数据库可按此例修改。<br /><br />2.1创建所需用户及表空间，如果有了用户和表空间就不需要了。<br /><br />2.2 找到jbpm-starters-kit-3.1.4文件夹,在其下的jbpm文件夹的下级文件夹lib中加入oracle的驱动包ojdbc14.jar.<br /><br />2.3 在jbpm\src\resources文件夹下建立oracle文件夹, 将\jbpm\src\resources\hsqldb里的create.db.hibernate.properties和identity.db.xml文件copy到刚刚建立的oracle文件夹当中.<br /><br />2.4 修改create.db.hibernate.properties文件，修改目标数据库的连接属性如下:<br /><br /> <br /><br /># these properties are used by the build script to create <br /><br /># a hypersonic database in the build/db directory that contains <br /><br /># the jbpm tables and a process deployed in there<br /><br /> <br /><br />hibernate.dialect=org.hibernate.dialect.OracleDialect<br /><br />hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver<br /><br />hibernate.connection.url=jdbc:oracle:thin:@10.62.1.12:1521:oracle<br /><br />hibernate.connection.username=dpf<br /><br />hibernate.connection.password=dpf<br /><br />hibernate.show_sql=true<br /><br /> <br /><br />hibernate.cache.provider_class=org.hibernate.cache.HashtableCacheProvider<br /><br /> <br /><br />2.5 修改jbpm\src\config.files\hibernate.cfg.xml文件，同样是配置数据库的连接属性如下：<br /><br /><br /><br /> <br /><br /> <br /><br />    &lt;!-- jdbc connection properties --><br /><br />    &lt;property name="hibernate.dialect">org.hibernate.dialect.OracleDialect&lt;/property><br /><br />    &lt;property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver&lt;/property><br /><br />    &lt;property name="hibernate.connection.url">jdbc:oracle:thin:@10.62.1.12:1521:oracle&lt;/property><br /><br />    &lt;property name="hibernate.connection.username">dpf&lt;/property><br /><br />    &lt;property name="hibernate.connection.password">dpf&lt;/property><br /><br /> <br /><br />&lt;property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider&lt;/property><br /><br /> <br /><br />2.6 修改jbpm\build.deploy.xml文件.找到create.db项并进行如下修改：<br /><br />  &lt;!-- ============== --><br /><br />  &lt;!-- === SERVER === --><br /><br />  &lt;!-- ============== --><br /><br />  &lt;target name="create.db" depends="declare.jbpm.tasks, db.clean, db.start" description="creates a hypersonic database with the jbpm tables and loads the processes in there"><br /><br />    &lt;jbpmschema actions="create" <br /><br />                cfg="${basedir}/src/config.files/hibernate.cfg.xml" <br /><br />                properties="${basedir}/src/resources/oracle/create.db.hibernate.properties"/> <br /><br />    &lt;loadidentities file="${basedir}/src/resources/oracle/identity.db.xml"<br /><br />                cfg="${basedir}/src/config.files/hibernate.cfg.xml" <br /><br />                properties="${basedir}/src/resources/oracle/create.db.hibernate.properties"/> <br /><br />    &lt;ant antfile="build.xml" target="build.processes" inheritall="false" /> <br /><br />    &lt;deployprocess cfg="${basedir}/src/config.files/hibernate.cfg.xml" <br /><br />                   properties="${basedir}/src/resources/oracle/create.db.hibernate.properties"><br /><br />      &lt;fileset dir="build" includes="*.process" /><br /><br />    &lt;/deployprocess><br /><br />    &lt;antcall target="db.stop" /> <br /><br />  &lt;/target><br /><br /> <br /><br />2.7 配置ant,在jbpm目录执行 ant create.db –buildfile build.deploy.xml命令。<br /><br />会有一些小错误的提示，没有关系数据库的表已经建立完成。<br /><br /> <br /><br />2.8 eclipse的图形化配置插件安装文件可以到jbpm-starters-kit-3.1.4\jbpm-designer\<br /><br />jbpm-gpd-feature\eclipse下找到，需注意版本。<br /><br />部署jbpm的jar包和moudle的jar包<br />1 把如下jar包放入\WEB-INF\lib文件夹下, spring-modules-jbpm31.jar可以在<br /><br />spring-modules-0.8下找到,其它的都属于jbpm工具包。<br /><br />bsh-1.3.0.jar <br /><br />bsf.jar<br /><br />spring-modules-jbpm31.jar<br /><br />jbpm-webapp-3.1.4.jar<br /><br />jbpm-identity-3.1.4.jar<br /><br />jbpm-3.1.4.jar<br /><br /><br /><br />部署hbm文件到项目<br />1 在jbpm文件夹中找到所有的*.hbm.xml数据库映射文件。放到项目的一个文件夹当中。本例放到\com\gresoft\security\model\hbm文件夹中。并且在hibernate的sessionfactory建立时，设置为相关路径配置。 <br /><br /> <br /><br />2 此文件需在spring管理的hibernate配置文件下修改，本例为<br /><br />dataAccessContext-hibernate.xml，如下:<br /><br />&lt;!--Hibernate SessionFatory--><br /><br />    &lt;bean id="sessionFactory"<br /><br />       class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><br /><br />       &lt;property name="dataSource" ref="dataSource" /><br /><br />       &lt;property name="annotatedClasses"><br /><br />           &lt;list><br /><br /> <br /><br />           &lt;/list><br /><br />       &lt;/property><br /><br /> <br /><br />       &lt;property name="hibernateProperties"><br /><br />           &lt;props><br /><br />              &lt;prop key="hibernate.dialect"><br /><br />                  org.hibernate.dialect.Oracle9Dialect<br /><br />              &lt;/prop><br /><br />              &lt;prop key="hibernate.show_sql">true&lt;/prop><br /><br />              &lt;prop key="hibernate.cache.provider_class"><br /><br />                  org.hibernate.cache.EhCacheProvider<br /><br />              &lt;/prop><br /><br />              &lt;prop key="hibernate.cache.use_query_cache">true&lt;/prop><br /><br />           &lt;/props><br /><br />       &lt;/property><br /><br />       <br /><br />       &lt;property name="typeDefinitions"><br /><br />       &lt;ref bean="jbpmTypes" /> <br /><br />       &lt;/property>  <br /><br /> <br /><br />       &lt;property name="mappingDirectoryLocations"><br /><br />           &lt;list><br /><br />              &lt;value><br /><br />                  classpath*:/com/gresoft/security/model/hbm/ <br /><br />              &lt;/value>             <br /><br />           &lt;/list><br /><br />       &lt;/property><br /><br />    &lt;/bean><br /><br /> <br /><br />设置大字段string-max<br />1 此文件需在spring管理的hibernate配置文件下修改，本例为<br /><br />dataAccessContext-hibernate.xml，如下:<br /><br />&lt;!-- 处理大字段 --><br /><br />    &lt;bean id="jbpmTypes" class="org.springframework.orm.hibernate3.TypeDefinitionBean"> <br /><br />       &lt;property name="typeName" value="string_max" /> <br /><br />       &lt;property name="typeClass" value="org.jbpm.db.hibernate.StringMax" /> <br /><br />    &lt;/bean><br /><br />配置configration、template<br />说明: jbpmConfiguration是根据springmodules所提供的<br /><br />LocalJbpmConfigurationFactoryBean进行配置，其集成好对jbpmConfiguration的管理。在系统使用时JbpmConfiguration需调用jbpmTemplate的jbpmTemplate.getJbpmConfiguration()方法得到。<br /><br />1 此文件需在spring管理的hibernate配置文件下修改，本例为<br /><br />dataAccessContext-hibernate.xml，如下:<br /><br />&lt;!-- jBPM configuration-->  <br /><br />    &lt;bean id="jbpmConfiguration" class="org.springmodules.workflow.jbpm31.LocalJbpmConfigurationFactoryBean">  <br /><br />        &lt;property name="sessionFactory" ref="sessionFactory" />  <br /><br />        &lt;property name="configuration" value="classpath:/datasql/jbpm.cfg.xml" />  <br /><br />    &lt;/bean>  <br /><br />    <br /><br />    &lt;!-- jBPM template -->  <br /><br />    &lt;bean id="jbpmTemplate" class="org.springmodules.workflow.jbpm31.JbpmTemplate">  <br /><br />        &lt;constructor-arg index="0" ref="jbpmConfiguration" />   <br /><br />&lt;/bean>  <br /><br />2 增加类路径中jbpm.cfg.xml文件，可以根据<br /><br />jbpm-starters-kit-3.1.4\jbpm\src\java.jbpm\org\jbpm\default.jbpm.cfg.xml<br /><br />复制后修改。本例放到/datasql/jbpm.cfg.xml下。上面配置文件有相关配置。全部内容如下：<br /><br />&lt;jbpm-configuration><br /><br />&lt;!— - 增加如下内容 - à<br /><br />  &lt;jbpm-context><br /><br />    &lt;service name="persistence">  <br /><br />            &lt;factory>  <br /><br />                &lt;bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">  <br /><br />                    &lt;field name="isTransactionEnabled">  <br /><br />                        &lt;false />  <br /><br />                    &lt;/field>  <br /><br />                    &lt;field name="isCurrentSessionEnabled">  <br /><br />                       &lt;true />    <br /><br />                    &lt;/field>  <br /><br />                &lt;/bean>  <br /><br />            &lt;/factory>  <br /><br />        &lt;/service>  <br /><br /> <br /><br />    &lt;service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" /><br /><br />    &lt;service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" /><br /><br />    &lt;service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" /><br /><br />    &lt;service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" /><br /><br />  &lt;/jbpm-context><br /><br /> <br /><br />  &lt;!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar --><br /><br />&lt;!-- 不再使用&lt;string name="resource.hibernate.cfg.xml" value="hibernate.cfg.xml" />-->  <br /><br />  &lt;string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" /><br /><br />  &lt;string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" /><br /><br />  &lt;string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" /><br /><br />  &lt;string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" /><br /><br />  &lt;string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" /><br /><br />  &lt;string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" /><br /><br />  &lt;string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" /><br /><br /> <br /><br />  &lt;long   name="jbpm.msg.wait.timout" value="5000" singleton="true" /><br /><br />  &lt;int    name="jbpm.byte.block.size" value="1024" singleton="true" /><br /><br />  &lt;string name="mail.smtp.host" value="localhost" /> <br /><br />  &lt;bean   name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl" singleton="true" /><br /><br />  &lt;bean   name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" /><br /><br />  &lt;bean   name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" /><br /><br /> <br /><br />&lt;/jbpm-configuration><br /><br />过滤器的设置与建立<br />过滤器的建立是为了保证一个session的正常工作。<br /><br />1 web.xml中的修改<br /><br />本例中描述如下:<br /><br />    &lt;!-- 注入jbpm过滤器,使用统一的Session --> <br /><br />    &lt;filter><br /><br />    &lt;filter-name>JbpmContextFilter&lt;/filter-name>  <br /><br />    &lt;filter-class>com.gresoft.components.jbpm.JbpmContextHolder&lt;/filter-class><br /><br />    &lt;/filter><br /><br />2建立对应的类文件<br /><br />本例中描述如下:<br /><br />package com.gresoft.components.jbpm;<br /><br /> <br /><br />import java.io.IOException;<br /><br />import java.io.Serializable;<br /><br />import java.security.Principal;<br /><br /> <br /><br />import javax.servlet.Filter;<br /><br />import javax.servlet.FilterChain;<br /><br />import javax.servlet.FilterConfig;<br /><br />import javax.servlet.ServletException;<br /><br />import javax.servlet.ServletRequest;<br /><br />import javax.servlet.ServletResponse;<br /><br />import javax.servlet.http.HttpServletRequest;<br /><br /> <br /><br />import org.jbpm.JbpmConfiguration;<br /><br />import org.jbpm.JbpmContext;<br /><br />import org.springframework.web.context.WebApplicationContext;<br /><br /> <br /><br />public class JbpmContextHolder implements Filter, Serializable {<br /><br />         private static final long serialVersionUID = 1L;<br /><br /> <br /><br />         String jbpmConfigurationResource = null;<br /><br /> <br /><br />         String jbpmContextName = null;<br /><br /> <br /><br />         boolean isAuthenticationEnabled = true;<br /><br /> <br /><br />         public void init(FilterConfig filterConfig) throws ServletException {<br /><br />                   // get the jbpm configuration resource<br /><br />                   this.jbpmConfigurationResource = filterConfig<br /><br />                                     .getInitParameter("jbpm.configuration.resource");<br /><br />                   // get the jbpm context to be used from the jbpm configuration<br /><br />                   this.jbpmContextName = filterConfig<br /><br />                                     .getInitParameter("jbpm.context.name");<br /><br />                   if (jbpmContextName == null) {<br /><br />                            jbpmContextName = JbpmContext.DEFAULT_JBPM_CONTEXT_NAME;<br /><br />                   }<br /><br />                   // see if authentication is turned off<br /><br />                   String isAuthenticationEnabledText = filterConfig<br /><br />                                     .getInitParameter("authentication");<br /><br />                   if ((isAuthenticationEnabledText != null)<br /><br />                                     && ("disabled".equalsIgnoreCase(isAuthenticationEnabledText))) {<br /><br />                            isAuthenticationEnabled = false;<br /><br />                   }<br /><br />         }<br /><br /> <br /><br />         public void doFilter(ServletRequest servletRequest,<br /><br />                            ServletResponse servletResponse, FilterChain filterChain)<br /><br />                            throws IOException, ServletException {<br /><br />                   String actorId = null;<br /><br />                   // see if we can get the authenticated swimlaneActorId<br /><br />                   if (servletRequest instanceof HttpServletRequest) {<br /><br />                            HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;<br /><br />                            Principal userPrincipal = httpServletRequest.getUserPrincipal();<br /><br />                            if (userPrincipal != null) {<br /><br />                                     actorId = userPrincipal.getName();<br /><br />                            }<br /><br />                   }<br /><br />                   JbpmContext jbpmContext = getJbpmConfiguration(servletRequest)<br /><br />                                     .createJbpmContext(jbpmContextName);<br /><br />                   try {<br /><br />                            if (isAuthenticationEnabled) {<br /><br />                                     jbpmContext.setActorId(actorId);<br /><br />                            }<br /><br />                            filterChain.doFilter(servletRequest, servletResponse);<br /><br />                   } finally {<br /><br />                            jbpmContext.close();<br /><br />                   }<br /><br />         }<br /><br /> <br /><br />         /*<br /><br />          * 从spring获取JbpmConfiguration的bean加载方式<br /><br />          */<br /><br /> <br /><br />         protected JbpmConfiguration getJbpmConfiguration(<br /><br />                            ServletRequest servletRequest) {<br /><br />                   WebApplicationContext webApplicationContext = (WebApplicationContext) ((HttpServletRequest) servletRequest)<br /><br />                                     .getSession()<br /><br />                                     .getServletContext()<br /><br />                                     .getAttribute(<br /><br />                                                        WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);<br /><br />                   JbpmConfiguration jbpmConfiguration = (JbpmConfiguration) webApplicationContext<br /><br />                                     .getBean("jbpmConfiguration");<br /><br />// 得到业务Bean(在这里是你需要注入的bean)<br /><br />                   System.out.println("------------------------------------------------------------------------------------------");<br /><br />                   System.out.println("jbpmconfiguration对象化=" + jbpmConfiguration.toString());<br /><br />                   System.out.println("------------------------------------------------------------------------------------------");<br /><br /> <br /><br />                   return jbpmConfiguration;<br /><br /> <br /><br />         }<br /><br /> <br /><br />         <br /><br />         public void destroy() {<br /><br />         }<br /><br /> <br /><br />}<br /><br /> <br /><br />编写发布流程定义xml的人机页面及程序<br />1  JSP页面使用struts1.2,spring2.0,hibernate3.2框架。此为流程发布页面。<br /><br />&lt;%@ page contentType="text/html;charset=UTF-8"%><br /><br />&lt;html><br /><br />&lt;head><br /><br /> &lt;/head><br /><br />&lt;body><br /><br />&lt;form action="项目名/jbpmtest.do?method=deploy" name="formupload" method="post" enctype="multipart/form-data"><br /><br />       请选择要发布的流程文件&lt;input name="workflowfile" type="file" id="workflowfile" >  <br /><br />       &lt;input type="submit" name="submit"><br /><br />&lt;/form><br /><br />&lt;/body><br /><br />&lt;/html><br /><br /> <br /><br />2 后台对应类<br /><br />/*******************************************************************************<br /><br /> * 文件名: JbpmAction.java&lt;br><br /><br /> * 版本: &lt;br><br /><br /> * 描述:  &lt;br><br /><br /> * 版权所有: &lt;br><br /><br /> * //////////////////////////////////////////////////////// &lt;br><br /><br /> * 创建者: 沙振中 &lt;br><br /><br /> * 创建日期: Dec 27, 2007 &lt;br><br /><br /> * 修改者:  &lt;br><br /><br /> * 修改日期:  &lt;br><br /><br /> * 修改说明:  &lt;br><br /><br /> ******************************************************************************/<br /><br />package com.gresoft.security.web;<br /><br /> <br /><br />import java.io.InputStream;<br /><br /> <br /><br />import javax.servlet.http.HttpServletRequest;<br /><br />import javax.servlet.http.HttpServletResponse;<br /><br /> <br /><br />import org.apache.commons.beanutils.DynaBean;<br /><br />import org.apache.commons.logging.Log;<br /><br />import org.apache.commons.logging.LogFactory;<br /><br />import org.apache.struts.action.ActionForm;<br /><br />import org.apache.struts.action.ActionForward;<br /><br />import org.apache.struts.action.ActionMapping;<br /><br />import org.apache.struts.upload.FormFile;<br /><br />import org.jbpm.JbpmContext;<br /><br />import org.jbpm.graph.def.ProcessDefinition;<br /><br />import org.springmodules.workflow.jbpm31.JbpmTemplate;<br /><br /> <br /><br />import com.gresoft.commons.core.web.StrutsAction;<br /><br /> <br /><br />public class JbpmAction extends StrutsAction { <br /><br /> <br /><br />         private static Log log = LogFactory.getLog(JbpmAction.class);<br /><br /> <br /><br />         private JbpmTemplate jbpmTemplate;<br /><br /> <br /><br />         public void setjbpmTemplate(JbpmTemplate jbpmTemplate) {<br /><br />                   this.jbpmTemplate = jbpmTemplate;<br /><br />         }<br /><br /> <br /><br />    /**<br /><br />     * 进入上传流程主页面<br /><br />     * @param mapping<br /><br />     * @param form<br /><br />     * @param request<br /><br />     * @param response<br /><br />     * @return<br /><br />     */<br /><br />    public ActionForward index(ActionMapping mapping, ActionForm form,<br /><br />                            HttpServletRequest request, HttpServletResponse response) {    <br /><br /> <br /><br />                   return mapping.findForward("delpoyindex");<br /><br />         }<br /><br />    <br /><br />    /**<br /><br />     * 上传流程文件<br /><br />     * @param mapping<br /><br />     * @param form<br /><br />     * @param request<br /><br />     * @param response<br /><br />     * @return<br /><br />     */<br /><br />    public ActionForward deploy(ActionMapping mapping, ActionForm form,<br /><br />                            HttpServletRequest request, HttpServletResponse response)throws Exception {         <br /><br />             DynaBean dy = (DynaBean) form;<br /><br />                   FormFile file = (FormFile) dy.get("workflowfile");<br /><br />                            <br /><br />                  InputStream is = file.getInputStream(); <br /><br />                   JbpmContext jbpmContext = jbpmTemplate.getJbpmConfiguration().createJbpmContext();<br /><br />                   ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);<br /><br />                   //利用容器的方法将流程定义数据部署到数据库上 <br /><br />        jbpmContext.deployProcessDefinition(processDefinition);<br /><br />        // 关闭 jbpmContext <br /><br />        jbpmContext.close();<br /><br />                   <br /><br />        // 提交到数据库当中,使用统一的session<br /><br />                   jbpmTemplate.getHibernateTemplate().flush();<br /><br />                   log.info("流程部署成功!");<br /><br />                   return mapping.findForward("delpoyindex"); <br /><br />         }<br /><br />      <br /><br />}<br /><br /> <br /><br />注：相关ssh配置文件的设置需根据自己实际项目为准。<br /><br /> <br /><br /> <br /><br />写在最后<br />通过上述集成的工作，可以使你的项目中很好的集成jbpm。Jbpm流程的设置需根据实际业务相绑定。现在我们就可以在项目当中应用工作流了。
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/205831#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 19 Jun 2008 15:26:34 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/205831</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/205831</guid>
      </item>
      <item>
        <title>面试之谈</title>
        <author>zeng_love</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zeng-love.javaeye.com">zeng_love</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/203295" style="color:red;">http://jbpm.group.javaeye.com/group/blog/203295</a>&nbsp;
          发表时间: 2008年06月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          现在面试的时候多会问到一些框架上的问题,基本上是spring有什么好处和坏处,为什么要用到spring,用到spring给你们项目带来了什么好处之类的一些问题,大家能不能透露透露啊。。呵呵。。不止spring还有现在流行的一系列框架hibernate，struts等等。。
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/203295#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>Sat, 14 Jun 2008 19:32:48 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/203295</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/203295</guid>
      </item>
      <item>
        <title>【JAVA程序员必看】Ruby、Python不能威胁Java的13个理由</title>
        <author>looxiaohu</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://looxiaohu.javaeye.com">looxiaohu</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/201556" style="color:red;">http://jbpm.group.javaeye.com/group/blog/201556</a>&nbsp;
          发表时间: 2008年06月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近，到处可以看到大量的文章：Java将会消失取而代之的是脚本语言或其他汇编语言。不，那种情况是不会发生的。下面是我的论据，我们先看些数据。<br /><br />2008年5月的编程语言受欢迎度情况：虽然有些人并不喜欢Tiobe的基于搜索引擎的编程语言欢迎度调查，但是我认为还是有根据、公平的。<br /><br />从图中的数据发现和“C语法”相似语言占有较大的份额。<br />C (15.292) + C++ (10.484) + Java (20.176) + C# (3.963) = 49.915%<br />表明这四种语言占据了近一半的市场。如果我们在这里添加PHP （ 10.637% ）（在某种程度上采用了类似的语法）结果是60.552％。<br /><br />  <img src="http://littletutorials.com/images//java_old_age/tiobe20.gif" /><br /><br /> <br />因此，我们得到如下结论：<br />理由1 ：语法是非常重要，因为它是建立在以往的知识的基础上。类似的语法具有相近的概念。程序员不需要费很多时间和精力学习新语法。<br /> <br />让我们看看一组挑战语言：<br />Python (4.613) + Ruby (2.851) + Lisp/Scheme (0.449) + Lua (0.393) + SmallTalk (0.138) +<br />Haskell (0.137) + Groovy (0.131) + Erlang (0.110) + Caml (0.090) + Scala (0.073) = 8.985%<br />上面10种语言的总比例比VisualBasic（10.782％）的还少。<br /><br /><img src="http://littletutorials.com/images//java_old_age/tiobe20.gif" /><br /><br />原因2 ：大的难点是分心。程序员要学习这10种语言并且达到可以评价的水平需要付出很大的努力。况且，大部分的语言具有不同的语法和引入了不同的（有时是根本不同的）概念。<br /><br />最近7年来的趋势，我们可以看到大多数的语言流行起来。也有几个例外，如下降的Perl ，但没有真的是消失。有周期性的浮动，但在长远看来，没有什么改变。<br /> <br />这表明，虽然各种语言在短的时间内会使程序员着迷，但它们被放回到“架子”上也相当快速。这些语言失去了现实中开发项目的机会。 <br /> <br /><br /><img src="http://littletutorials.com/images//java_old_age/tiobetrend.gif" /><br /><br />原因3 ：缺乏让程序员转换的动力。市场是相当稳定，现有的语言工作的相当好，管理者也没有强制程序员学习新语言。<br /> <br />理由4 ：挑战语言似乎并没有抓住时机，创造一个应用于项目中的机会。或许跟它们发展和普及慢有关。<br />理由5 ：挑战语言社区没有做好吸引程序员的工作。<br />  <br />让我们看看现在就业市场发生了什么事。indeed.com提供的是我使用的工具和我比较了很多语言制作了下面的表格。<br /><br /><br /><img src="http://www.indeed.com/trendgraph/jobgraph.png?q=Java%2C+C%2C+C%2B%2B%2C+C%23%2C+Python%2C+Ruby%2C+PHP%2C+Scala" /><br /><br /><br />  <br /><br />理由6 ：短期内没有很大的诱因让程序员切换到挑战语言中，获得技能但不太可能转化为收入。<br /><br /><br />那么，我研究所有这些统计数字得到某些结论，但语言本身需要什么特性和外部条件如何将会受欢迎？<br /> <br />原因7 ：新的语言没有对程序员的生活和项目有非常大的推进作用。<br /> <br />理由8 ：没有竞争力的应用平台。<br /><br /><br />理由9 ：所有这些新的语言没有强大的赞助商和金钱在市场上推动他们。所有这些新语言诞生于大学和研究机构，或来自非常特殊的区域。<br /> <br />理由10 ：大部分的这些语言左右徘徊，没有果断地登上“语言”大舞台。 <br /><br />出于好奇心，这里是一个名单，谈到一些语言与他们的发布日期：<br /><br />Ruby (mid 1990s), Python (1991), Lisp (1958), Scheme (1970s), Lua (1993), Smalltalk (1969-1980), Haskell (1990), Erlang (1987), Caml (1985), OCaml (1996), Groovy (2003), Scala (2003) <br /><br /><br /><br />和成功的语言相比：<br /><br />C (1972), C++ (1983), Java (1995), C# (2001), BASIC (1964), Pascal (1970), FORTRAN (1957), Ada (1983), COBOL (1959)<br /> <br /><br />很明显，大部分这些“新”语言错过了成功的“列车”。<br /> <br />理由11 ：“特色”是大项目的灾难。目前的大项目不曾使用过新语言，很难没有些偏见的评价。偏见正是新语言生长的真正障碍。<br /> <br />理由12 ：非自然的概念（对大多数程序员而言）提高了入门的门槛。函数式编程使你的编码象在解数学方程。但有多少人热爱数学并能用它来编程呢？面向对象语言提供一个很大的优势：他们让程序员认为有想要的模式，而不是语言或机器。<br /> <br />理由13 ：没有先进的工具，面对大量的代码行缺乏重构程序员和开发团队的能力。<br /> <br />Java的危险并是不来自外部。这些新的（其实他们大多是相当老）的语言没有可能取代Java的。Java的危险来自于它具有太多的“功能”，如果想保留其他语言的一些概念和C＋＋的垃圾回收功能需要进行转化。
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/201556#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Jun 2008 20:21:44 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/201556</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/201556</guid>
      </item>
      <item>
        <title>myeclipse中部署jbpm流程定义文件时mysql出错的解决办法</title>
        <author>geekwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://geekwang.javaeye.com">geekwang</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/201339" style="color:red;">http://jbpm.group.javaeye.com/group/blog/201339</a>&nbsp;
          发表时间: 2008年06月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;&nbsp;&nbsp;&nbsp; 今天在部署fristFlow流程定义文件的时候发生一个mysql错误,从log中看，是Tomcat服务器与MySQL服务器之间失去连接。 在网上查了一下原因,在hibernate.cfg.xml文件中加了一个数据库连接池配置代码,就可以了,不过现在还不知道为什么.</p>
<p>为hibernate配置连接池，推荐用c3p0，然后配置c3p0的反空闲设置idle_test_period，只要小于MySQL的wait&nbsp;timeout即可。 <br />在hibernate.cfg.xml中增加下面几项：</p>
<div class="TableBorder2 TableBody1" style="padding: 10px;">&lt;!--&nbsp;configuration&nbsp;pool&nbsp;via&nbsp;c3p0--&gt; <br />&lt;property&nbsp;name="hibernate.connection.provider_class"&gt;org.hibernate.connection.C3P0ConnectionProvider&lt;/property&gt; <br />&lt;property&nbsp;name="c3p0.min_size"&gt;5&lt;/property&gt; <br />&lt;property&nbsp;name="c3p0.max_size"&gt;30&lt;/property&gt; <br />&lt;property&nbsp;name="c3p0.time_out"&gt;1800&lt;/property&gt;&nbsp;&lt;!--&nbsp;seconds&nbsp;--&gt;&lt;!--&nbsp;default:&nbsp;0&nbsp;--&gt; <br />&lt;property&nbsp;name="c3p0.max_statement"&gt;50&lt;/property&gt;&nbsp;&lt;!--&nbsp;default:&nbsp;0&nbsp;--&gt; <br />&lt;property&nbsp;name="c3p0.acquire_increment"&gt;1&lt;/property&gt;&nbsp;&lt;!--&nbsp;default:&nbsp;1&nbsp;--&gt; <br />&lt;property&nbsp;name="c3p0.idle_test_period"&gt;120&lt;/property&gt;&nbsp;&nbsp;&lt;!--&nbsp;seconds&nbsp;--&gt;&lt;!--&nbsp;default:&nbsp;0&nbsp;--&gt; <br />&lt;property&nbsp;name="c3p0.validate"&gt;true&lt;/property&gt;<br /></div>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/201339#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 08 Jun 2008 15:20:32 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/201339</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/201339</guid>
      </item>
      <item>
        <title>jBPM中的变量浅析</title>
        <author>macrochen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://macrochen.javaeye.com">macrochen</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/200072" style="color:red;">http://jbpm.group.javaeye.com/group/blog/200072</a>&nbsp;
          发表时间: 2008年06月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在jbpm主要有两类变量, 一种是流程实例范围的变量, 另一种是任务实例范围的变量. 而在流程实例氛围中的变量又分为两种:一种是瞬时变量(transient variable), 另一种是普通的变量, 瞬时变量通过setTransientVariable()方法来设置, 该变量不会持久化到jbpm_variableinstance表中, 它只能在当前流程实例的整个生命周期中存在, 一旦流程实例结束之后, 该变量将不复存在. 而另一种是通过setVariable()和setVariableLocally()方法进行保存,通过getVariable()访问的变量, 这种变量是在整个流程实例中都可访问的, 因为它会保存到jbpm_variableinstance表中. <br /><br />流程实例变量还是很好理解的, 任务实例变量则相对复杂一些. <br />任务实例变量还可以直接访问实例变量, 这可以按照java程序中变量的作用范围来理解, 任务实例变量相当于局部变量, 仅在当前流程实例中可见, 流程实例变量相当于全局变量, 在整个流程中可见. 当通过任务实例查找一个流程时, 如果在当前的任务实例中没有找到, 将继续到流程实例中去找. 比如通过ContextInstance.setVariable("foo", "foo")创建的流程实例变量, 那么任务实例可以直接通过TaskInstance.getVariable("foo")访问到.<br /><br />而如果要在TaskInstance中修改流程实例变量, 则需要通过Task Controller. 在定义流程文件的时候, 我们会在task节点下使用这样的配置:<br /><pre name="code" class="xml">&lt;controller>
	&lt;variable access="read,required" name="foo">&lt;/variable>
&lt;/controller></pre> <br />Task Controller会在创建一个任务实例时, 根据Controller下配置的variable, 先找是否存在同名的流程实例变量, 如果存在, 那么将用流程实例变量的值来创建属于当前任务实例变量, 在任务结束的时候, 将任务实例变量的值保存到同名的流程实例变量中.如果在流程实例中不存在同名的流程变量, 那么会创建一个同名的流程变量, 比如上面的配置, 将同时创建一个名为foo的流程实例变量和任务实例变量.如果指定了mapped-name属性, 那么name指的是流程实例变量名, mapped-name指的是任务实例变量名,比如: <br /><pre name="code" class="xml">&lt;controller>
	&lt;variable access="read,required" name="foo" mapped-name = "bar">&lt;/variable>
&lt;/controller></pre> <br />该配置将在任务实例变量bar和流程实例变量foo之间建立映射关系, 变量值将在这两个变量之间传递.至于access属性, 我自己试验了一下, 设置为read, required, write不同的组合值好像没有什么区别.<br /><br />流程实例变量的设置也有一些要注意的地方, 如果变量没有在task controller中作映射, 当使用TaskInstance.setVariable("foo", "bar")的时候, 则保存到jbpm_variableinstance表中的taskinstance_字段是空的, 也就是只能做为流程实例变量访问, 而无法通过任务实例变量访问到, 如何才能通过任务实例来访问该变量呢? 回答是使用TaskInstance.setVariableLocally("foo", "bar")来设置流程实例变量, 这样保存到jbpm_variableinstance表会同时任务实例id设置为taskinstance_字段的值, 同时它还创建了一个同名的流程实例变量(不知道jbpm为什么要这么做).<br /><br />其实关于变量的内容还有很多, 目前的项目中还没有碰到, 这里不做一一分析.
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/200072#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 04 Jun 2008 13:51:31 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/200072</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/200072</guid>
      </item>
      <item>
        <title>jBPM中JbpmContext.close()一个值得注意的问题</title>
        <author>macrochen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://macrochen.javaeye.com">macrochen</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/199590" style="color:red;">http://jbpm.group.javaeye.com/group/blog/199590</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在使用jBPM做开发的过程中, JbpmContextFilter 是一个非常方便的过滤器, 从源代码中我们可以看到:<br /><pre name="code" class="java">  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    String actorId = null;

    // see if we can get the authenticated swimlaneActorId
    if (servletRequest instanceof HttpServletRequest) {
      HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
      Principal userPrincipal = httpServletRequest.getUserPrincipal();
      if (userPrincipal != null) {
        actorId = userPrincipal.getName();
      }
    }

    JbpmContext jbpmContext = getJbpmConfiguration().createJbpmContext(jbpmContextName);
    try {
      if (isAuthenticationEnabled) {
        jbpmContext.setActorId(actorId);
      }
      filterChain.doFilter(servletRequest, servletResponse);
    } finally {
      jbpmContext.close();
    }
  }
</pre><br />它主要做了两个事情: 一个是在流程继续执行之前为我们创建了一个JbpmContext; 另一个工作就是流程执行之后完成jbpmContext的关闭. 而如果不使用这个Filter的话, 那么在我们的流程处理中,就需要自己做这两件事. 接着我们再看org.jbpm.JbpmContext.close()的代码:<br /><pre name="code" class="java">public void close() {
    log.debug("closing jbpmContext " + toString());
    try {
      if (services!=null) {
        try {
          autoSave();
        } finally {
          services.close();
        }
      }
    } finally {
      if (jbpmConfiguration!=null) {
        jbpmConfiguration.jbpmContextClosed(this);
      }
    }
  }
</pre><br />在关闭之前都会执行自动保存.<br />从上面的分析我们可以看到, jbpm似乎没有提供我们处理流程内部异常的地方,它不管是否出现异常, 都会将我们的流程操作节点持久化到对应的jbpm数据库表中.本人就因为这个原因导致流程出现问题, 在我的一个流程运行过程中, 在某个审核步骤完成, 进入下一个task node的时候, 该Task节点的AssignmentHandler不幸抛出了异常, 按照我们的理解, 流程应该停留在前一步审核阶段, 但实际情况是审核节点已经被设置成完成状态, 而下一个task node的taskInstance也已经持久化到jbpm_taskinstance表中(只是处于未完成状态), 因为是在assign的时候出现的问题, 因此这个新创建的任务节点将成为一个无人处理的节点, 所有人都无法见不到它了. <br />出现上面的情况一点也不奇怪, 因为在TaskMgmtInstance的createTaskInstance方法中中有这样的代码:<br /><pre name="code" class="java">// create the task instance
taskInstance.create(executionContext);

// if this task instance is created for a task, perform assignment
if (task!=null) {
  taskInstance.assign(executionContext);
}
</pre><br />它先创建taskInstance, 完成taskInstance的属性设置, 然后执行assign动作(异常就出现在这里), 在出现异常之后程序会回到JbpmContextFilter中,然后执行JbpmContext的close方法(该方法中完成所有新建和修改对象的持久化工作).<br /><br />为了解决这个问题,就需要我们自己来处理jbpm引擎内部抛出的异常, 这一点jbpm做的非常好, 因为jpbm抛出的异常都是继承自JbpmException, 所以我们只要捕获该异常就可以了.而我们结束流程操作一般都是出现在这样几个地方:调用TaskInstance.end(), ProcessInstance.signal()以及相关的同名方法, 因此只要在调用这些方法的地方对异常进行捕获就可以了.<br />我将这几个方法放到工具类, 以方便调用:<br /><pre name="code" class="java">
public static void end(TaskInstance ti) {
	end(ti, (Transition) null);
}

public static void end(final TaskInstance ti, final String transitionName) {
	new JbpmOperation() {
		@Override
		void doExecute(JbpmContext ctx) {
			ti.end(transitionName);
		}
	}.execute();
}

public static void end(final TaskInstance ti, final Transition transition) {
	new JbpmOperation() {
		@Override
		void doExecute(JbpmContext ctx) {
			ti.end(transition);
		}
	}.execute();
}

public static void signal(final ProcessInstance pi) {
	new JbpmOperation() {
		@Override
		void doExecute(JbpmContext ctx) {
			pi.signal();
		}
	}.execute();
}
</pre><br /><br />然后定义了一个回调的操作类用来处理在遇到JbpmException异常的时候告诉JbpmContext进行rollback:<br /><pre name="code" class="java">
/**
 * 用来处理流程异常, 如果流程本身出现异常(这些异常可能来自我们定义的各种assignmentHandler, actionHandler,
 * decisionHandler等),通过设置rollbackOnly来阻止其持久化
 * 
 * @author Macro Chen
 * @since Jun 3, 2008
 */
abstract class JbpmOperation {
	void execute() {
		JbpmContext ctx = JbpmUtils.getJbpmContext();
		try {
			doExecute(ctx);
		} catch (JbpmException e) {
			// 通过该方法让ctx提交的时候rollback
			ctx.setRollbackOnly();
			throw e;
		} finally {
			// 在filter中close
			// ctx.close();
		}
	}

	abstract void doExecute(JbpmContext ctx);

}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/199590#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/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Jun 2008 01:49:56 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/199590</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/199590</guid>
      </item>
      <item>
        <title>一次部署多个jbpm 流程定义文件</title>
        <author>macrochen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://macrochen.javaeye.com">macrochen</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/198736" style="color:red;">http://jbpm.group.javaeye.com/group/blog/198736</a>&nbsp;
          发表时间: 2008年05月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          通常我们在部署流程定义文件都需要借助jbpm的eclipse plugin,但是该插件有一个问题,就是每次打开一个流程文件非常的慢,而且一次只能deploy一个流程定义文件,如果有多个流程的话,就需要我们在插件中同时打开多个流程定义文件,这让人感觉非常麻烦.于是我们对流程部署进行了一下改进.<br />在插件中部署一个流程定义,其实就是将processdefinition.xml文件上传到一个指定的servlet,这个servlet就是org.jbpm.web.ProcessUploadServlet, 而对应的url地址是web.xml中定义的:<br /><pre name="code" class="xml">
&lt;servlet>
	&lt;servlet-name>UploadServlet&lt;/servlet-name>
	&lt;servlet-class>
		org.jbpm.web.ProcessUploadServlet
	&lt;/servlet-class>
&lt;/servlet>
&lt;servlet-mapping>
	&lt;servlet-name>UploadServlet&lt;/servlet-name>
	&lt;url-pattern>/upload&lt;/url-pattern>
&lt;/servlet-mapping>
</pre><br />因此我们只需要自己写一个jsp页面,将要上传的文件提交到该url(http://myhost:myport/myapp/upload)即可.<br />通过参看ProcessUploadServlet的源代码,我们发现,它要求上传的文件必须是经过压缩的:<br /><pre name="code" class="java">
    if (fileItem.getContentType().indexOf("application/x-zip-compressed") == -1) {
	log.debug("Not a process archive");
	return "Not a process archive";
    }
    try {
	log.debug("Deploying process archive " + fileItem.getName());
	ZipInputStream zipInputStream = new ZipInputStream(fileItem.getInputStream());
	JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
	log.debug("Preparing to parse process archive");
	ProcessDefinition processDefinition = ProcessDefinition.parseParZipInputStream(zipInputStream);
	log.debug("Created a processdefinition : " + processDefinition.getName());
	jbpmContext.deployProcessDefinition(processDefinition);
	zipInputStream.close();
	return "Deployed archive " + processDefinition.getName() + " successfully";
    } catch (IOException e) {
	return "IOException";
    }
</pre><br />也就是说,我们在上传流程定义文件之间必须将其压缩成zip文件(而且还不能嵌套其他的文件夹,zip里只能包含processdefinition.xml), 因此我们需要对其进行改造一下,能让我们直接上传流程定义xml文件:<br /><pre name="code" class="java">
private String handleRequest(HttpServletRequest request) {
        //check if request is multipart content
        log.debug("Handling upload request");
        if (!FileUpload.isMultipartContent(request)) {
            log.debug("Not a multipart request");
            return "Not a multipart request";
        }
        String result = "";
        try {
            DiskFileUpload fileUpload = new DiskFileUpload();
            List list = fileUpload.parseRequest(request);
            log.debug("Upload from GPD");
           
            for (Iterator it = list.iterator(); it.hasNext();) {
				FileItem fileItem = (FileItem) it.next();

	            if (fileItem.getContentType() == null || fileItem.getContentType().indexOf("text/xml") == -1) {
	                log.debug("Not a process archive");
	                continue;
	            }
	            try {
	                log.debug("Deploying process archive " + fileItem.getName());
	                InputStream is = fileItem.getInputStream();
	                JbpmContext jbpmContext = JbpmContext.getCurrentJbpmContext();
	                log.debug("Preparing to parse process archive");
	                ProcessDefinition processDefinition = ProcessDefinition.parseXmlInputStream(is);
	                log.debug("Created a processdefinition : " + processDefinition.getName());
	                jbpmContext.deployProcessDefinition(processDefinition);
	                is.close();
	                if (StringUtils.isNotEmpty(result)) {
	                	result += ",";
	                }
	                result += processDefinition.getName();
	            } catch (IOException e) {
	                return "IOException";
	            }
			}
        } catch (FileUploadException e) {
            e.printStackTrace();
            return "FileUploadException";
        }
        
        if (StringUtils.isEmpty(result)) {
        	log.debug("No process file in the request");
            return "No process file in the request";
        }
        
		return "Deployed process [" + result + "] successfully";
    }
</pre><br /><br />接下来是写jsp文件:<br /><pre name="code" class="html">
&lt;%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
&lt;html>
	&lt;head>
		&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		&lt;title>Upload Process Definition Xml files&lt;/title>
		&lt;script src="upload.js" type="text/javascript">&lt;/script>
		&lt;style>
fieldset {
	border: 1px solid #eee;
	padding: 5px 10px;
	margin: 0;
}

fieldset ul {
	list-style: none;
	margin: 0 0 1.5em 0;
	padding: 0;
}

fieldset ul li {
	list-style: none;
	margin: 0 0 0.5em 0;
	padding: 0;
}
&lt;/style>
	&lt;/head>
	&lt;body>
	&lt;body>
		&lt;form action="&lt;%=request.getContextPath()%>/upload" enctype="multipart/form-data"
			id="process_form" method="post">
			&lt;fieldset>
				&lt;ul>
					&lt;li>
						&lt;label>
							新增流程定义文件
						&lt;/label>
						&lt;input type="file" id="process_upload" />
					&lt;/li>
					&lt;li style="text-align: center">
						&lt;input class="submit" id="submit_button" name="commit"
							type="submit" value="提交" />
					&lt;/li>
				&lt;/ul>
			&lt;/fieldset>
		&lt;/form>
		&lt;script type="text/javascript">
  var multiple_upload_process_counter = 0;	
  multiple_upload_process($("process_upload"));
&lt;/script>
	&lt;/body>
&lt;/html>
</pre><br />这里我借鉴了一下javaeye的application.js来添加多个上传文件:)
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/198736#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/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, 30 May 2008 16:42:27 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/198736</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/198736</guid>
      </item>
      <item>
        <title>BPEL本质论</title>
        <author>hongsoft</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://hongsoft.javaeye.com">hongsoft</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/196188" style="color:red;">http://jbpm.group.javaeye.com/group/blog/196188</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 10pt; font-family: 宋体;">根据最近两周对几个</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">BPEL</span>
<span style="font-size: 10pt; font-family: 宋体;">产品的研究，根据以前对</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">XPDL/BPEL</span>
<span style="font-size: 10pt; font-family: 宋体;">的了解，分析了</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">BPEL</span>
<span style="font-size: 10pt; font-family: 宋体;">与</span>
<span lang="EN-US" style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;">XPDL</span>
<span style="font-size: 10pt; font-family: 宋体;">在业务目标方面的主要区别。</span>
</p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/196188#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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 May 2008 17:04:06 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/196188</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/196188</guid>
      </item>
      <item>
        <title>最近的jBPM项目总结</title>
        <author>macrochen</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://macrochen.javaeye.com">macrochen</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/196057" style="color:red;">http://jbpm.group.javaeye.com/group/blog/196057</a>&nbsp;
          发表时间: 2008年05月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ★使用jbpm提供的eclipse plugin在画流程图的时候, 一般的步骤是先画各种节点(我画流程图的顺序是这样的:start node, end node, task node, common node....),然后保存关闭,再打开继续添加transition,因为插件设计器有一个缺点就是第一次就画好transition之后再打开会"惨不忍睹", 各种node会摆放的乱七八糟.<br /><br />★一般我们认为未命名的那个transtion是默认要执行的transtion,其实不是这样的,通过看源代码:<br /><pre name="code" class="java">public Transition getDefaultLeavingTransition() {
    Transition defaultTransition = null;
    if ( (leavingTransitions!=null)
         && (leavingTransitions.size()>0) ) {
      defaultTransition = (Transition) leavingTransitions.get(O);
    } else if ( superState!=null ){
      defaultTransition = superState.getDefaultLeavingTransition();
    }
    return defaultTransition;
  }
</pre><br />我们可以看出,实际上第一个transtion才是默认的transition,所以在画流程图的时候要注意这一点,为了让未命名的transtion作为默认的transtion,必须将其放在第一个.<br /><br />★jbpm数据表结构分析<br />不管是task变量还是process变量,都保存在jbpm_variableinstance表中,从该表中我们可以看出, 只能存取byte, date, double, long和string这几种类型的变量,所以如果你设置的变量类型为int类型,那么实际上取出来的是long类型的,所以在使用getVariable()方法要取得int类型变量,注意要造型为long.<br /><br />★不管是task变量还是process变量, 如果要取变量值, 有两种方式, 一种是通过中间表jbpm_tokenvariablemap和jbpm_moduleinstance, jbpm使用hibernate就是通过该方式来取得的, 另一种是通过jbpm_variableinstance表的processinstantce_字段来取得, 一般如果我们手工来获取的话,可以通过该字段来取得.<br /><br />★ContextInstance实例对应的表是jbpm_moduleinstance,ProcessInstance实例对应的表是jbpm_processintance<br /><br />★进入子流程之前的事件是subprocess-created而不时node-enter<br /><br />★token类是一个非常底层的东东,在实际的工作流中很少用到,而用到最多的就是task node以及附加在各个节点上的action handler, 因为只有task node才是人能参与流程的地方, 而jBPM工作流的主要任务就是通过人的操作来让流程运行, 如果在很多地方使用token,那说明你的流程不是人在操作,而是机器在操作.所以大部分我看到的使用token的地方都是在测试中,因为需要通过代码来让流程自动运行.<br /><br />★state node会将当前的流程挂起,这跟org.jbpm.graph.node.State类有关:<br /><pre name="code" class="java">public class State extends Node {
  
  private static final long serialVersionUID = 1L;

  public State() {
    this(null);
  }
  
  public State(String name) {
    super( name );
  }

  public void execute(ExecutionContext executionContext) {
  }
}
</pre><br />因为它的execute()方法为空, 而其他的节点的execute方法中都会调用leave()方法继续流程的执行,跑到下一个节点,也别指望在state node中通过ProcessInstance.signal()方法来启动流程,因为没有地方提供你放该执行代码,即使通过在event的actionhandler中来让流程继续执行也不行,因为在执行execute方法之前有一个流程锁定的动作,而在execute方法执行之后则有一个解锁的处理,而位于action中execute方法中的signal方法也会检查当前节点是否锁定,因为在执行execute方法之前已经锁定所以会抛出node被锁定的异常.而要让流程继续执行需要在流程之外通过调用ProcessInstance.signal()方法让流程继续执行.<br /><br />★一般流程图的画法, 一般按照流程的顺序遵循从上到下,从左到右的原则<img src="http://macrochen.javaeye.com/upload/picture/pic/14941/61a7b9f3-29e3-322a-9d76-9b927bec236e.jpg " /><br />★申请界面可能千差万别,但是审核页面都基本类似:审核内容,审核历史,审核意见, 所以我做成了通用的页面<img src="http://macrochen.javaeye.com/upload/picture/pic/14945/b3966fb3-2a30-331e-b40a-4fec6cdd9316.png " /><br /><br />★为了将业务表单数据挂到jBPM流程引擎上,一般需要使用一个全局的流程实例变量(我一般采用FORM_ID)将指定的业务表单记录主键保存,这样在流程中的不同节点就可以取得所需要的业务数据,并交给不同的操作对象(Actor)进行处理.<br /><br />★为了使用指定的页面来处理每个流程任务节点,需要将页面的url保存为任务节点变量, 这样就将jsp页面跟jBPM流程的任务节点联系起来了.而这个工作是放在AssignmentHandler中来处理的.在本人的项目中这是一个通用的做法,所以写了一个AssignmentHandler抽象类:<br /><pre name="code" class="java">/**
 * 审核任务节点对应的分配处理handler 主要设置处理当前审核任务的actor和审核操作页面, 默认的审核页面不能对审核内容进行编辑
 * 
 * @author Macro Chen
 * @since Apr 18, 2008
 */
public abstract class BaseAssignmentHandler implements AssignmentHandler {

	public void assign(Assignable assignable, ExecutionContext ctx)
			throws Exception {
		addContextInstanceVariables(ctx.getContextInstance());
		String employeeId = getActorId(assignable, ctx);
		assignable.setActorId(employeeId);
		addTaskInstanceVariables(assignable, ctx);
	}

	/**
	 * 添加task instance变量
	 * 
	 * @param assignable
	 * @param ctx
	 */
	protected void addTaskInstanceVariables(Assignable assignable,
			ExecutionContext ctx) {
		TaskInstance ti = (TaskInstance) assignable;
		String url = getOperationUrl(assignable, ctx);
		url += (url.indexOf("?") != -1 ? "&" : "?") + "taskId=" + ti.getId();
		ti.setVariable(JbpmConstants.TIV_OPERATION_URL, url);
	}

	/**
	 * 根据业务需要添加其他的流程变量
	 * 
	 * @param ci
	 */
	protected void addContextInstanceVariables(ContextInstance ci) {
	}

	/**
	 * 执行任务操作的页面 默认情况下使用通用的审核页面(不可对审核内容进行修改), 子类可以根据需要开发自己的审核页面(如可对审核内容进行修改)
	 * 
	 * @return
	 */
	protected String getOperationUrl(Assignable assignable, ExecutionContext ctx) {
		return "/workflow/common/common_audit.jsp";
	}

	/**
	 * 设置当前任务节点的执行者
	 * 
	 * @param assignable
	 * @param ctx
	 * @return
	 * @throws Exception
	 */
	protected abstract String getActorId(Assignable assignable,
			ExecutionContext ctx) throws Exception;

}</pre><br /><br />★以下是本人总结的一些公共的,方便的jBPM静态方法,在整个项目中通用:<br /><pre name="code" class="java">/**
 * @author Macro Chen
 * @since Apr 8, 2008
 */
public class JbpmUtils {

	public static Long getLongVariableOfProcess(IJbpmProvider provider,
			String name) {
		ContextInstance ci = provider.getContextInstance();
		if (ci == null) {
			return (long)0;
		}
		return (Long)ci.getVariable(name);
	}

	public static JbpmContext getJbpmContext() {
		JbpmConfiguration config = JbpmConfiguration.getInstance();
		return config.getCurrentJbpmContext();
	}

	/**
	 * 新建一个pi
	 * 
	 * @param name
	 * @return
	 */
	public static ProcessInstance newProcessInstance(String name) {
		ProcessDefinition pd = getJbpmContext().getGraphSession()
				.findLatestProcessDefinition(name);
		return new ProcessInstance(pd);
	}

	/**
	 * 根据taskId取得pi
	 * 
	 * @param taskId
	 * @return
	 */
	public static ProcessInstance getProcessInstanceByTaskId(String taskId) {
		TaskInstance ti = getTaskInstance(taskId);
		return ti.getTaskMgmtInstance().getProcessInstance();
	}

	public static ProcessInstance getProcessInstanceByTaskId(Long taskId) {
		TaskInstance ti = getTaskInstance(taskId);
		return ti.getTaskMgmtInstance().getProcessInstance();
	}

	public static ContextInstance getContextInstance(String name) {
		return newProcessInstance(name).getContextInstance();
	}

	public static ContextInstance getContextInstanceByTaskId(String taskId) {
		TaskInstance ti = getTaskInstance(taskId);
		if (ti == null)
			return null;

		return ti.getTaskMgmtInstance().getProcessInstance()
				.getContextInstance();
	}

	public static ContextInstance getContextInstanceByTaskId(Long taskId) {
		TaskInstance ti = getTaskInstance(taskId);
		if (ti == null)
			return null;
		return ti.getTaskMgmtInstance().getProcessInstance()
				.getContextInstance();
	}

	public static TaskInstance createStartTaskInstance(ProcessInstance pi) {
		return pi.getTaskMgmtInstance().createStartTaskInstance();
	}

	public static Session getSession() {
		return getJbpmContext().getSessionFactory().openSession();
	}

	public static List getQueryList(String hql) {
		return getSession().createQuery(hql).list();
	}

	public static TaskMgmtSession getTaskMgmt() {
		return getJbpmContext().getTaskMgmtSession();
	}

	public static TaskInstance loadTaskInstance(long taskId) {
		return getTaskMgmt().loadTaskInstance(taskId);
	}

	public static TaskInstance getTaskInstance(String taskId) {
		if (StringUtils.isEmpty(taskId))
			return null;
		return getJbpmContext().getTaskInstance(Long.parseLong(taskId));
	}

	public static TaskInstance getTaskInstance(long taskId) {
		return getJbpmContext().getTaskInstance(taskId);
	}

	public static List&lt;TaskInstance> findTaskInstances(String actorId) {
		return getTaskMgmt().findTaskInstances(actorId);
	}

	public static List&lt;TaskInstance> findPooledTaskInstances(String actorId) {
		return getTaskMgmt().findPooledTaskInstances(actorId);
	}

	public static void saveTaskInstance(TaskInstance ti) {
		getJbpmContext().save(ti);
	}

	public static String getTaskId() {
		return DoradoUtils.getRequestParameter(JbpmConstants.TASK_ID);
	}

}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/196057#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 May 2008 13:23:45 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/196057</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/196057</guid>
      </item>
      <item>
        <title>感动瞬间</title>
        <author>betafox</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://betafox.javaeye.com">betafox</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/195065" style="color:red;">http://jbpm.group.javaeye.com/group/blog/195065</a>&nbsp;
          发表时间: 2008年05月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p>　5月16日，中共中央总书记、国家主席、中央军委主席胡锦涛乘飞机抵达四川绵阳南效机场，慰问灾区干部群众，看望抗震救灾一线的部队官兵和医护人员。国务院总理温家宝到机场迎接胡锦涛。 <br />　　走下舷梯的胡锦涛快步走向温家宝，两人的手紧紧地握在了一起，并互相用力摇着对方的手。胡锦涛右手紧握温家宝的右手，左手托着温家宝的右手前臂，双眼凝视着温家宝，而温家宝也同样以坚定的目光凝视着胡锦涛，此时两人内心的万千思绪只有他们自己知道。但我们分明能够感受得到，在他们紧握的手掌与对望的目光之中传递着的是无限的信任与深情的问候，以及一定要战胜困难的决心和信念！<br />　　执手相望时，两人皆无语，但此时，无语胜似千言万语！<br />　　这不禁让我想起战争年代峥嵘岁月里的毛泽东与周恩来，还有毛泽东与朱德：老战友们因革命战争的需要而分开（长征途中，毛北上，朱留红四军；抗日战争时期，毛坐镇延安，周远在重庆；解放战争时期，毛转战陕北，朱东渡黄河），历经险阻又在战争中重逢，老战友双手紧相握！双目相凝望！历史已经证明，他们每一次重逢，都意味着他们的事业进入了一个全新的时期！<br />　　也许大家会认为我牵强附会，但我们需要这样的期待！而且也一定可以期待！一定值得期待！</p>
<p><br /><img src="http://img1.qq.com/news/pics/10483/10483346.jpg" height="363" alt="" width="500" /><img src="http://laiba.tianya.cn/laiba/images/38923/12107719360949269244/A/1/m.jpg" height="361" alt="" width="550" /><img src="http://i0.sinaimg.cn/dy/c/p/2008-05-12/U397P1T1D15523753F21DT20080512201029.jpg" height="366" alt="" width="550" /></p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/195065#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/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><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, 21 May 2008 00:55:08 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/195065</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/195065</guid>
      </item>
      <item>
        <title>JBPM如何支持用户自定义流程(讨论)</title>
        <author>zhxp791008</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://zhxp791008.javaeye.com">zhxp791008</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/192828" style="color:red;">http://jbpm.group.javaeye.com/group/blog/192828</a>&nbsp;
          发表时间: 2008年05月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上次搞了个spring与jpbm的集成后.就一直放下没有继续深入研究..<br />现在想研究下JBPM如何支持用户自定义流程.想学习下大家的思路和经验..<br />欢迎大家发表...
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/192828#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 May 2008 09:32:42 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/192828</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/192828</guid>
      </item>
      <item>
        <title>【转】流程定义的四个层次</title>
        <author>Luzifer</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://luzifer.javaeye.com">Luzifer</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/190712" style="color:red;">http://jbpm.group.javaeye.com/group/blog/190712</a>&nbsp;
          发表时间: 2008年05月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我刚开始学习jBPM，慢慢学习做学习笔记，向各位大侠学习：）<br />------------------------------------------<br />  【转】  在下面这部分，我尝试回答这样的问题“什么是流程定义包括的内容？”。这是从各种规范和工具所使用模型的原则和概念中总结得来的，反映了大部分模型中通用的基本思想。流程定义的内容可以分为四个不同的层次：状态（state）、上下文（context）、程序逻辑（programming logic）和用户界面（UI）。 <br /><strong>状态层</strong><br />    所有状态和控制流的表述，都属于业务流程的状态层。标准编程语言中的控制流来源于Von Neuman体系。控制流定义了必须被执行的指令的顺序，控制流由我们书写的命令、if语句、循环语句等确定。在业务流程中的控制流基本与此一致。但在业务流程中不是使用命令而是使用状态作为基本元素。<br /><br />    在流程中，状态 (或者说等待状态)代表了一种对外部参与者（actor）的依赖。状态的意思就像“现在X系统或某某人必须作某些事，在此等待直到参与者通知这些任务已完成”。状态定义了一种对外部提供结果的依赖。状态典型的例子是批准步骤（step）。<br /><br />    流程定义中的状态也指定了执行依赖于哪个参与者。在活动图中，泳道（swimlanes）的标注代表这些参与者的名字。工作流系统使用这些信息构建任务列表，这是一般工作流系统都有的功能。如前所述，参与者可以是人也可以是系统。对于需要人参与的状态，工作流系统必须在运行时计算出具体的个人。这样的计算使工作流系统必须依赖于组织结构信息。关于这方面的一篇非常有趣的文章是在further reading section提到的“工作流应用中的组织管理”（ 'Organizational Management in Workflow Applications'）。<br /><br />    流程定义的控制流包含一组状态和它们之间的关系。状态之间的逻辑关系描述了哪些执行路径可以同时执行，那些不可以。同步执行路径用分叉（forks）和联合（joins）建模，异步执行路径用判断（decisions）和合并（ merges）建模。注意在大多数模型中，在每个状态之前都有一个隐式合并。<br /><br />    UML活动图经常被用来做业务流程建模。作为一种直观和通用的表达，活动图在图形表述上有一个主要问题，就是没有区分状态和动作，它们都用活动来表示。缺少这种区分（导致状态概念的缺失）是学术派对UML活动图的主要批评。UML活动图的第二个问题是在UML2.0版中引入的。当多个迁移（transitions）到达一个活动时，以前的版本规定这是一个缺省合并（merge），在2.0版中规定这是一个需要同步的缺省联合（join）。在我看来，UML活动图的图形部分仍旧可以用来对业务流程状态层次建模，只要使用时对两条构建语义作如下的变化： <br /><br />    1.在用图形表述业务流程时，只建模状态层（状态和控制流），不要包括动作。这意味着图形中的矩形都是状态而不是活动<br />    2.如果多个迁移到达一个状态，缺省定义为不需要同步的合并（merges） <br />    在流程运行过程中，工作流系统用一个令牌（token）作为指针跟踪流程的状态。这相当于Von Neuman体系中的程序计数器。当令牌到达一个状态时，它被分配给工作流系统等待的外部参与者。外部参与者可以是个人、组织或者计算机系统。我们定义流程运行的执行人或系统为“参与者”（actor）。只有在工作流系统将令牌分配给一个参与者时，才需要访问组织结构信息。工作流系统通过分配令牌构建任务列表。<br /><br /><strong>上下文层</strong><br />    流程上下文变量（process context variable） ，或简称变量，是与流程实例相关的变量。流程开发人员可以使用流程变量存储跨越流程实例整个生命周期的数据。一些工作流管理系统有固定数目的数据类型，另一些你可以定义自己的数据类型。<br /><br />    注意变量也可以用来存放引用（ references）。一个变量可以引用如数据库中的记录、网络上的文件。什么时候使用引用，取决于使用引用数据的其他应用。<br /><br />    和流程变量相关的另一个令人感兴趣的方面是：工作流系统如何将数据转化为信息。工作流是用于组织内部跨越各种异构系统实现任务和数据协同的。对于业务流程中人工执行的任务，工作流系统负责从其他相关系统，如SAP、数据库、CRM系统、文档管理系统收集数据。在业务流程的每一个人工步骤，只有相关联的数据项被从异构系统中收集和计算。通过这种方式，从不同系统来的数据被转换并展现为信息。<br /><br /><strong>程序逻辑层</strong><br />    如前所述，动作是在流程运行过程中，工作流系统响应指定的事件（event）执行的一段程序逻辑（programming logic）。程序逻辑可以是二进制或源代码形式的、用任何语言或脚本编写的软件。程序逻辑层是所有这些软件片断和关于在什么事件发生时调用它们的信息的组合。程序逻辑的例子包括发Email、通过消息代理发消息、从ERP系统中拿数据和更新数据库。<br /><br /><strong>用户界面层</strong><br />    一个参与者通过向流程变量中填充数据的事件，来触发结束一个状态。比如，在请假的例子中，老板提供“同意”或“不同意”数据到流程中。某些工作流系统允许指定哪些数据可以填充到流程中，以及它们如何在流程变量中存储。通过这些信息，可以生成从用户收集信息的UI表单。基于流程定义生成用户提交表单的Web应用例子，可以访问the jBpm online demo。
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/190712#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 May 2008 21:03:04 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/190712</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/190712</guid>
      </item>
      <item>
        <title>补充《ERStudio逆向工程从sql server 2000中导出jbpm数据库的idef1x图》</title>
        <author>dapeng1525</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://dapeng1525.javaeye.com">dapeng1525</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/186937" style="color:red;">http://jbpm.group.javaeye.com/group/blog/186937</a>&nbsp;
          发表时间: 2008年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div id="bc513597">
<div class="comment_title"><a href="../../" target="_blank"><span style="color: #108ac6;">dapeng1525</span></a> 2008-04-11 </div>
<div class="comment_content">你先看一下我的相册里的截图吧，参考一下，回头我再详细写一下导出过程</div>
</div>
<div id="bc511618">
<div class="comment_title"><a href="http://jeffrey-leexf.javaeye.com/" target="_blank"><span style="color: #108ac6;">Jeffrey_leexf</span></a> 2008-04-09 </div>
<div class="comment_content">您好,我现在想从SQL 2000中返向导成ERStudio 模型.不知道要怎么导.您能否指点一下.本人不胜感激.</div>
</div>
<div id="bc509079">
<div class="comment_title"><a href="../../" target="_blank"><span style="color: #108ac6;">dapeng1525</span></a> 2008-04-07 </div>
<div class="comment_title">说的有道理，晚上把这段给补上</div>
</div>
<div id="bc508953">
<div class="comment_title"><a href="http://jeffrey-leexf.javaeye.com/" target="_blank"><span style="color: #108ac6;">Jeffrey_leexf</span></a> 2008-04-07 </div>
<div class="comment_content">怎么个逆向法呀.</div>
<div class="comment_content">以上是我的博客文章《ERStudio逆向工程从sql server 2000中导出jbpm数据库的idef1x图》的评论，前段时间一直在忙着论文中期检查，所以一直没抽出时间来把&ldquo;这段&rdquo;给补上，在此向Jeffrey_leexf郑重道歉，今天把这段给补上。</div>
<div class="comment_content">首先，打开ERStudio。</div>
<div class="comment_content"><img src="../../upload/picture/pic/11377/10e4bf1f-630b-3f21-a325-78af57fc5f81.jpg " height="213" alt="" width="554" /></div>
<div class="comment_content">点击左上角的带＋号的图标，出现如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11375/b72caf2d-5e81-37e9-83f2-8c6324b275b7.jpg " height="284" alt="" width="527" /></span></a></div>
<div class="comment_content">选择Reverse-engineer an existing database，Login，进入如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11373/f49be4fc-2852-38a3-905a-503cf29136e4.jpg " height="475" alt="" width="583" /></span></a></div>
<div class="comment_content">建立ODBC，点击Setup....，进入如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11371/459b5eef-a9c7-39cb-9f23-07175ba1cb6e.jpg " height="408" alt="" width="508" /></span></a></div>
<div class="comment_content">点击 添加。。。，进入如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11369/9344a4e3-8f68-3654-b0b8-a691e7af5163.jpg " height="406" alt="" width="642" /></span></a></div>
<div class="comment_content">选择SQL Server，完成，进入如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11387/1e834aa7-a83f-3455-b583-7a2c5ba2a95a.jpg " height="407" alt="" width="576" /></span></a></div>
<div class="comment_content">输入数据源名称，图上是我自己的设置，可以依据自己的情况更改，服务器我选择(local)，下一步，下一步（一共两个下一步）到了如下界面：<img src="../../upload/picture/pic/12919/76847fd3-957b-3f59-a960-8c1666597568.jpg " alt="" /></div>
<div class="comment_content">更改默认数据库，我的数据库名是jbpm，根据自己的更改，下一步，完成，测试数据源，进入如下界面：</div>
<div class="comment_content"><a href="../../" target="_blank"><span style="color: #108ac6;"><img src="../../upload/picture/pic/11393/4492d0ee-ab90-30e8-bac5-e1d22a71e407.jpg " height="389" alt="" width="604" /></span></a></div>
<div class="comment_content">确定，确定，再确定，进入如下界面</div>
<div class="comment_content"><img src="../../upload/picture/pic/12921/222f5f23-61d5-37d2-9546-e647e0639a89.bmp" alt="" /></div>
<div class="comment_content">选择刚配置的数据源，添好数据库的用户名和密码，下一步，一路下一步，最后Finish，即可。</div>
<div class="comment_content">然后选菜单里的Modle&nbsp;-&gt; Modle Options....-&gt;Notition里选IDEF1X，OK。</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/186937#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/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 21:44:27 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/186937</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/186937</guid>
      </item>
      <item>
        <title>6个好习惯让孩子享用一生</title>
        <author>liwei888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liwei888.javaeye.com">liwei888</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/185614" style="color:red;">http://jbpm.group.javaeye.com/group/blog/185614</a>&nbsp;
          发表时间: 2008年04月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">我国著名青少年教育家孙云晓先生曾说：</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">好习惯对儿童来说是命运的主宰，是成功的轨道，是终身的财富，是人生的格调</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">。因此，作为父母，一定要在孩子的习惯培养上下大功夫。培养孩子的良好习惯可从以下几个方面做起：</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: small;"><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>(</strong></span><strong><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">一</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">生活习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;"><span style="font-size: small;">　　生活是人生第一课，也是最基本的课程，生活习惯的好坏，不仅影响幼儿的身心健康而且也是幼儿综合素质的体现。它包括饮食、起居、排便、卫生等习惯，做到按时睡眠、起床、安静睡眠并有正确的睡姿，不挑食、不偏食、细嚼慢咽，饭前便后正确洗手、早晚刷牙，饭后漱口等。父母要根据孩子的年龄特点，适当为孩子立规矩，如：玩具玩完后必须放回原处，逐渐养成自己的东西自己整理和爱清洁，讲卫生，有条理的好习惯。</span></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /><span style="font-size: small;">&nbsp; &nbsp;&nbsp;&nbsp;<strong>(</strong></span></span><span style="font-size: small;"><strong><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">二</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">文明礼貌习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　　礼貌看起来是种外在行为的表现，实际上它反映着人的内心修养，体现一个人自尊和尊重他人的意识。父母要教育孩子，学习使用文明礼貌用语，如</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">您好</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">、</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">请</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">、</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">谢谢</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">、</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">对不起</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">、</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&ldquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">请原谅</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">&rdquo;</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">。同时，要注意培养孩子的文明举止，见人要热情打招呼，别人问话要先学会倾听，并有礼貌地回答，保持服装整洁，站有站相，坐有坐相。</span></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　<strong>　</strong></span><strong><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">(</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">三</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">道德习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;"><span style="font-size: small;">　　养成良好的道德习惯，幼儿才能和别人友好相处，积极追求美好的事物，自觉遵守社会行为规范，具有高度责任感，将来才能成为社会上成熟可敬的人。它包括各种行为规则，尊敬关爱长辈，不随地地大小便、不损坏花草、树木、爱护公共财务，遵守交通规则，能换位思考、团结友爱等等。</span></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　<strong>　</strong></span><strong><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">(</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">四</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">学习习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">良好的学习习惯对幼儿的学习兴趣与学习成绩有很大的影响，与幼儿的成材直接相关。它包括自主学习、合作学习、探究性学习。学习好的孩子学习习惯都比较好，而学习不好的孩子多数并不是因为脑子笨，而是没有良好的学习习惯。如：不长时间看电视、玩电脑游戏，不需要父母的督促、陪伴能自觉完成学习任务，学习专心认真，经常进行广泛的阅读，知道珍惜时间，什么时间做什么事情等。</span><span style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"> </span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　　</span></span></p>
<p class="MsoNormal" align="left" style="margin: 0cm 0cm 0pt; text-align: left; mso-pagination: widow-orphan;"><span style="font-size: small;"><strong><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">(</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">五</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">思维习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;"><span style="font-size: small;">　　良好的思维习惯有助于孩子从正确的角度和方面思考问题，有助于孩子能力的锻炼，知识的获取以及运用所学的知识灵活的解决问题。如：感觉接触了解新鲜事物，善于观察，勤于动脑，遇到问题能独立思考和解决。特别是要具有创新精神和创新能力。</span></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　<strong>　</strong></span><strong><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">(</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">六</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;">)</span><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">劳动习惯</span></strong></span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"><br /></span><span style="font-size: small;"><span style="color: #333333; font-family: 宋体; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-ascii-font-family: Tahoma; mso-hansi-font-family: Tahoma; mso-bidi-font-family: Tahoma;">　　培养孩子爱惜劳动成果，孩子劳动不是为了创造物质和精神财富，而是为了培养初步的劳动习惯，促进孩子身心健康成长。要求自己能做的事情自己做，自己穿脱衣服、学着铺床叠被等，另外帮父母干些家务活，如：帮助摆碗筷、擦桌、扫地、倒垃圾等等。</span><span lang="EN-US" style="color: #333333; font-family: Tahoma; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt;"></span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US"><span style="font-size: small; font-family: Times New Roman;">&nbsp;</span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/185614#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Apr 2008 19:59:01 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/185614</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/185614</guid>
      </item>
      <item>
        <title>PowerDesigner深入体验</title>
        <author>liwei888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liwei888.javaeye.com">liwei888</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/185079" style="color:red;">http://jbpm.group.javaeye.com/group/blog/185079</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>PowerDesigner深入体验</strong></p>
<p><strong>&nbsp;&nbsp;&nbsp;</strong> 最近有空买了本PowerDesigner书,对他的功能进行了比较深入的了解;觉得PowerDesigner的功能太强了,在设计的过程中的内容只要是你想到的基本上都能完成.以前用他主要是用来创建一下数据表,整个设计过程基本上都是面向过程;面向数据流的,只是在开发的过程中,把有些内容用面向对象的语言来实现的.一直以来没有找到一个比较合适的设计工具,通过对PowerDesigner的深入了解,发现这么好的工具就在我身边.</p>
<p>&nbsp;&nbsp; 我的学习过程是这样的,首先通过对概念的理解:BPM,CDM,PDM,OOM,Report(报表),testData(测试数据)对前面几个概念不清楚的人可以查阅相关PowerDesigner的资料;软件系统设计一般都是从概念模型(CDM)开始.然后通过概念模型转化为对象模型(OOM);通过对象模型转化物理模型(PDM).通过物理模型(PDM)生成测试数据.系统设计报表,可以方便的在开发的过程中使用.通过OOM生成代码本部分的功能没有去做深入的研究,因为现在有很多代码生成的工具可以利用.</p>
<p>&nbsp;&nbsp; 通过系统的学习PowerDesiger,我会在以后的工作过程利用这个工具来逐步的改变现有的系统设计模式.把面向过程的设计推向面向对象的分析设计.</p>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/185079#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 17:11:04 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/185079</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/185079</guid>
      </item>
      <item>
        <title>实现动态文件内容的下载</title>
        <author>liwei888</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://liwei888.javaeye.com">liwei888</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/185066" style="color:red;">http://jbpm.group.javaeye.com/group/blog/185066</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          web.xml文件中定义   <br />&lt;servlet><br />    &lt;description>This is the description of my J2EE component&lt;/description><br />    &lt;display-name>This is the display name of my J2EE component&lt;/display-name><br />    &lt;servlet-name>Attachment&lt;/servlet-name><br />    &lt;servlet-class>Attachment&lt;/servlet-class><br />  &lt;/servlet><br /><br />  &lt;servlet-mapping><br />    &lt;servlet-name>Attachment&lt;/servlet-name><br />    &lt;url-pattern>/servlet/Attachment&lt;/url-pattern><br />  &lt;/servlet-mapping><br />java 文件。<br />public class Attachment extends HttpServlet {<br /><br />	private static final long serialVersionUID = 1L;<br />	public void doGet(HttpServletRequest request, HttpServletResponse response)<br />			throws ServletException, IOException {<br />		response.setContentType("application/x-msdownload()");<br />		response.addHeader("Content-Disposition", "attachment;filename=test.txt");<br />		ServletOutputStream sos = response.getOutputStream();<br />		sos.write("测试一".getBytes());<br />		sos.write("sdfksdjfkljsdklfjlskdjflksd".getBytes());<br />		sos.close();<br /><br />	}<br /><br />}<br />jsp中引用：<br />&lt;a href="servlet/Attachment">下载附件&lt;/a>
          <br/>
          <span style="color:red;">
            <a href="http://jbpm.group.javaeye.com/group/blog/185066#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/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 16:52:58 +0800</pubDate>
        <link>http://jbpm.group.javaeye.com/group/blog/185066</link>
        <guid>http://jbpm.group.javaeye.com/group/blog/185066</guid>
      </item>
      <item>
        <title>Oracle </title>
        <author>yang52081</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yang52081.javaeye.com">yang52081</a>&nbsp;
          链接：<a href="http://jbpm.group.javaeye.com/group/blog/184746" style="color:red;">http://jbpm.group.javaeye.com/group/blog/184746</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          select * from JbpmWfms w  start with w.WId='40288234196e791c0