<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>java民工的天堂</title>
    <description></description>
    <link>http://fjilyfe.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>SSH标准配置</title>
        <author>fjilyfe</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fjilyfe.javaeye.com">fjilyfe</a>&nbsp;
          链接：<a href="http://fjilyfe.javaeye.com/blog/194102" style="color:red;">http://fjilyfe.javaeye.com/blog/194102</a>&nbsp;
          发表时间: 2008年05月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近啊现在公司面试可能会有一些的上机题出现了，不过还好，不是很难，都是一些SSH配置然后做一个很简单的小功能啊什么的。那么这个大家平常的SSH都是怎么配的呢，如果让你上网还好，如果不让你上网是不是当时就蒙了呢。<br /><br />    其实不让你上网那我们就自己弄吧，没什么大不了的。熟悉一两次就好了，面试的时候千万不能让那些没有技术含量的东西给卡下来了，那可真就太不值得了。<br /><br />    如果只给你hibenrate包,spring包和struts包,那么让你将这三个框架配置起来做以<br />个登陆,那么你应该怎么去集成呢?这几个配置文件怎么去弄呢?<br />    <br />    1.首先拷贝jar包,<br />    a)那么struts中的jar包都需要拷贝什么呢?将struts中的所有的包都拷贝过来,一共是八个.然后就是jstl的包也要拷过来.所以struts的jar包一共是十个.<br />    b)然后是hibernate包的拷贝.hibernate的拷贝比较简单,一个lib下面是38个,然后还有以个核心包hibernate3.jar,所以一共是39个jar包.<br />    c)然后就是spring的配置了,spring比较麻烦一点点,它一共有四个,以个是核心包spring.jar,一个是lib\aspectj下面的两个jar包,以个是junit测试包lib\junit下的junit.jar.<br />    d)最后就是mysql的包了,那么你用哪个数据库就自己往里面加哪个数据库的包吧.<br /><br />    2.当jar包拷贝完了之后呢我们开始写配置文件了,首先我们从底层来写这个配置文件,从hibernate.cfg.xml开始.这个文件我们可以从我们下的hibernate的jar包里面找到. 我们可以在hibernate-3.2.0\etc里面找到hibernate.cfg.xml这个文件,然后我们拷贝到我们的src中,然后我们删掉其中没有用的东西,只留下下面这些.<br /><pre name="code" class="java">    &lt;!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

&lt;hibernate-configuration>
	&lt;session-factory>
		
	&lt;/session-factory>
&lt;/hibernate-configuration></pre><br /><br />    3.紧接着我们开始陪上一层的配置文件,这是以个spring的配置文件,这个spring的配置文件一共有三个,第一个就是applicationContext-common.xml,它是负责我们的事务的配置,我们要保持事务,那么就要用spring来给我们管理session,那么我们的sessionFactory就是由spring来创建的,而且在这个里面我们需要配置事务的传播特性,哪些方法要使用事务,事务的传播特性.这个xml文件前面的头部信息可以从另外一个文件(spring-framework-2.0\samples\jpetstore\war\WEB-INF)里面拷过来,这样这个头文件就有了,注意其他的applicationContext拷贝过来它的头部信息可能会少一些,那么有可能影响我们的程序的运行,所以我们用这个里面的头文件.<br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;beans xmlns="http://www.springframework.org/schema/beans"
	     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	     xmlns:aop="http://www.springframework.org/schema/aop"
	     xmlns:tx="http://www.springframework.org/schema/tx"
	     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
	&lt;!-- 配置sessionFactory -->
	&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		&lt;property name="configLocation">
			&lt;value>classpath:hibernate.cfg.xml&lt;/value>
		&lt;/property>	
	&lt;/bean>         
	
	&lt;!-- 配置事务管理器 -->
	&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
		&lt;property name="sessionFactory">
			&lt;ref bean="sessionFactory"/>
		&lt;/property>
	&lt;/bean>
	
	&lt;!-- 配置事务的传播特性 -->
	&lt;tx:advice id="txAdvice" transaction-manager="transactionManager">
		&lt;tx:attributes>
			&lt;tx:method name="add*" propagation="REQUIRED"/>
			&lt;!-- 
			&lt;tx:method name="del*" propagation="REQUIRED"/>
			-->
			&lt;tx:method name="*" read-only="true"/>
		&lt;/tx:attributes>
	&lt;/tx:advice>
	
	&lt;!-- 配置哪些类的哪些方法使用事务 -->
	&lt;aop:config>
		&lt;aop:pointcut id="allManagerMethod" expression="execution(* com.xxxx.xxxx.xxxx.*.*(..))"/>
		&lt;aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
	&lt;/aop:config>
&lt;/beans></pre><br /><br />    4.然后我们还要准备以个applicationContext-bean.xml文件,这个文件里面我们要放一些我们的业务逻辑类的配置,因为我们所有的业务逻辑类的创建都是由spring替我们完成的,那么我们就应该将所有的xxxManager都放到这个spring里面来配置,那么这个文件里面放置的都是xxxManager的配置.<br />    5.然后我们还要准备以个applicationContext-action.xml来放置struts的action的配置,也就是我们的path对应的处理类是要在这个里面去配置的.<br />    6.这三个文件我们建立完成了我们开始建立struts-config.xml文件,这个文件里面我们只需要留下最外层的框架就可以了.而且这个文件我们直接可以从struts-1.2.9-bin\webapps\struts-blank\WEB-INF这个里面去找到,然后把中间所有的东西都删掉.剩下的就就像这样:<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="ISO-8859-1" ?>

&lt;!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

&lt;struts-config>	
&lt;/struts-config></pre><br /><br /><br />    7.然后我们开始配置我们的web.xml文件,这个文件的配置是最麻烦的,因为我们要控制session的打开和关闭,我们用到了openSessionInView,这个文件可以先从这个地方拿到tomcat\server\webapps\admin\WEB-INF,然后我们把这个文件里面没有用的东西都给它拿掉,留下这些内容:<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>
&lt;web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  &lt;welcome-file-list>
    &lt;welcome-file>index.jsp&lt;/welcome-file>
  &lt;/welcome-file-list>
  
  &lt;!-- Standard Action Servlet Configuration (with debugging) -->
  &lt;servlet>
    &lt;servlet-name>action&lt;/servlet-name>
    &lt;servlet-class>org.apache.struts.action.ActionServlet&lt;/servlet-class>
    &lt;init-param>
      &lt;param-name>config&lt;/param-name>
      &lt;param-value>/WEB-INF/struts-config.xml&lt;/param-value>
    &lt;/init-param>
    &lt;init-param>
      &lt;param-name>debug&lt;/param-name>
      &lt;param-value>2&lt;/param-value>
    &lt;/init-param>
    &lt;init-param>
      &lt;param-name>detail&lt;/param-name>
      &lt;param-value>2&lt;/param-value>
    &lt;/init-param>
    &lt;load-on-startup>2&lt;/load-on-startup>
  &lt;/servlet>


  &lt;!-- Standard Action Servlet Mapping -->
  &lt;servlet-mapping>
    &lt;servlet-name>action&lt;/servlet-name>
    &lt;url-pattern>*.do&lt;/url-pattern>
  &lt;/servlet-mapping>
  
	&lt;context-param>
    	&lt;param-name>contextConfigLocation&lt;/param-name>
    	&lt;param-value>/WEB-INF/applicationContext-*.xml,classpath*:applicationContext-*.xml&lt;/param-value>
 	 &lt;/context-param>
 	 
 	&lt;listener>
        &lt;listener-class>org.springframework.web.context.ContextLoaderListener&lt;/listener-class>
    &lt;/listener>
  
	&lt;filter>
    	&lt;filter-name>hibernateFilter&lt;/filter-name>
    	&lt;filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class>
    &lt;/filter>
 	
 	&lt;filter-mapping>
    	&lt;filter-name>hibernateFilter&lt;/filter-name>
    	&lt;url-pattern>/*&lt;/url-pattern>
  	&lt;/filter-mapping> 
  
	&lt;filter>
    	&lt;filter-name>Spring character encoding filter&lt;/filter-name>
    	&lt;filter-class>org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class>
    	&lt;init-param>
    		&lt;param-name>encoding&lt;/param-name>
    		&lt;param-value>GBK&lt;/param-value>
    	&lt;/init-param>
  	&lt;/filter>
 	&lt;filter-mapping>
    	&lt;filter-name>Spring character encoding filter&lt;/filter-name>
    	&lt;url-pattern>/*&lt;/url-pattern>
  	&lt;/filter-mapping>
  
&lt;/web-app></pre><br /><br />    8.现在我们的配置文件写完了,我们的任务完成了.<br />    9.值得注意的是现在的公司越来越倾向与让你用ssh框架来做一个小的登陆系统,那么这个时候我们就要迅速的不加思索的知道我们要干什么,我们应该怎么去做,不要再在那想上一回,然后再去做,这个东西要相当相当的熟了才行啊.<br />    10.在这个里面我们主要就是要记住spring的jar包都要加入哪些,然后我们要知道这个事务管理怎么去配置,然后我们要知道这些文件都要在哪个里面去拷贝.
          <br/>
          <span style="color:red;">
            <a href="http://fjilyfe.javaeye.com/blog/194102#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 May 2008 16:30:42 +0800</pubDate>
        <link>http://fjilyfe.javaeye.com/blog/194102</link>
        <guid>http://fjilyfe.javaeye.com/blog/194102</guid>
      </item>
      <item>
        <title>工作流与JBPM开发实例精解（二）</title>
        <author>fjilyfe</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fjilyfe.javaeye.com">fjilyfe</a>&nbsp;
          链接：<a href="http://fjilyfe.javaeye.com/blog/193241" style="color:red;">http://fjilyfe.javaeye.com/blog/193241</a>&nbsp;
          发表时间: 2008年05月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前几天发了一篇文章，没几个人看也没人留言，看来我这功夫差的还是远啊，今天来一个实际点的吧。可能上回的废话太多。说说这个jbpm应该怎么来用。<br /><br />    首先当你想学一个框架的时候一定是你要有项目来用他了，OK，那么你项目当中的流程是什么你应该清楚吧，那么当你清楚了这些的时候我们就开始我们这个最简单的例子吧。<br /><br />    假如我们现在有这么一个例子，公司员工想报销点出差费，那么他要将他的申请提交给他的第一级领导——部门主管去审批，然后部门主管审批完了之后还要交给这个部门主管的上级公司老总进行审批。那么针对这个简单的流程，我们应该从哪里下手呢？<br /><br />    首先第一件事情就是写流程定义文件，那么这个文件我们用什么来写呢，他就是一个符合某个语法的xml文件，幸运的是jbpm给我们提供了一个集成的开发环境让我们来用。<br /><br />    首先去官网上下一个jbpm-jpdl-suite-3.2.GA包，解压后你会发现他里面有一个designer文件夹，那个里面就是我们写流程定义文件的开发环境，他是一个eclipse的插件，但是好像他给我们的那个eclipse版本有问题，建议大家从新下一个eclipse-SDK-3.2.1-win32.zip这个版本的eclipse，然后覆盖他给我们提供的那个。<br /><br />    准备工作做完了，那么我们就开始吧，首先我们打开解压目录下的designer文件夹中的designer.bat文件，他弹出一个eclipse，然后我们就用这个东西来开发我们的流程定义文件了。<br /><br />    打开之后你就会看见一个他的小例子，不过我们不去用他，我们自己新建一个工程。右键-new-other-jBoss jbpm-process project。这个时候你会看见他弹出一个对话框，输入你的工程名字，然后点击next，这个时候你会发现他已经把jbpm加载进去了，记住要选中Generate simple ......。<br /><br />    工程建立完了，我们开始建立我们的流程定义文件。在工程里面你会发现src/main/jpdl这个source folder，然后你会看见他里面已经有了一个流程定义文件了，但是我们不去用他的，我们自己建立一个，右键src/main/jpdl，然后new-other-jBoss jbpm-process definition。这个时候他就会弹出一个对话框，起一个你要写的流程定义文件的名字输入进去，OK，可以了。这个时候你打开你建立的那个文件夹，里面就有processdefinition.xml文件，ok，打开他。<br /><br />    在右面的图里面你就可以看到一张什么都没有的白纸，我们看看这部分左面的那些东西，什么start啊，end啊，tasknode啊，fork啊，join啊。那我们来解释一下这是个什么东西呢，我们看看我们的需求，员工要写一个报销单，然后交给部门主管来处理，那么部门主管就应该算是一个tasknode，他就是一个任务节点。start和end其实就是一个虚状态，当我们写完报销单的时候我们就提交了，这个时候他就到了第一个tasknode这个节点了。然后他审批完了还要交给总经理审批，那么他又是一个tasknode，然后总经理审批完了结束，ok，是一个end。<br /><br />    start--》tasknode（部门主管审批）--》tasknode（总经理审批）--》end。<br /><br />    如果觉得看的有点模糊可以看看我传上来的那个图。然后你在这个试图框的下面可以看到有个source，点击一下，就会发现他已经自动的给你生成xml代码了。但是这样还是有点不够，我们只是定义了一个tasknode节点，并没有定义tasknode节点的任务由谁来做。那么我们还要定义一个tasknode节点是由谁来做的：<br />    那么这段代码是这么写的：<br /><br /><pre name="code" class="java">&lt;?xml version="1.0" encoding="UTF-8"?>

&lt;process-definition
  xmlns=""  name="test1">
   &lt;start-state name="start">
      &lt;transition name="" to="部门经理审批">&lt;/transition>
   &lt;/start-state>
   &lt;task-node name="部门经理审批">
      &lt;task>
      	&lt;assigment actorId="部门经理">&lt;/assigment>
      &lt;/task>
      &lt;transition name="" to="总经理审批">&lt;/transition>
   &lt;/task-node>
   &lt;task-node name="总经理审批">
      &lt;task>
      	&lt;assigment actorId="总经理">&lt;/assigment>
      &lt;/task>
      &lt;transition name="" to="end1">&lt;/transition>
   &lt;/task-node>
   &lt;end-state name="end1">&lt;/end-state>
&lt;/process-definition></pre><br />    这样的话我们的流程定义文件就定义完了，但是这只是把文件定义完了，系统并不知道啊，所以我们还要把我们的文件部署到系统中去，那么这个过程是这样的：<br /><br />    首先我们在src/main/java里面新建立一个包，然后建立一个class，随便起个名字，就叫TestJBPM_01吧，那么在这个类里面我们要做的是什么呢？我们要先导入表，因为jbpm要运行就要用到很多个表，ok，那么我们这个里面导入表和hibernate导入表是差不多的，它的代码是这样的：<br /><pre name="code" class="java">package com.jbpm.test;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;

public class TestJbpm_01 extends TestCase {
	
	public void testJbpm(){
		
		//创建jbpm数据库表。他就像hibernate里面的哪个export一样。实际上他就是hibernate里面的哪个export。
		//应为他映射了很多个表，所以我们就能创建那么多个表。
		JbpmConfiguration.getInstance().createSchema();
		
	}
}</pre><br />然后呢我们就开始部署我们的流程定义文件，我们将这个文件当中的内容呢放到数据库当中去，当我们以后再用的时候呢我们就随时的将它加载出来。<br /><br /><pre name="code" class="java">package com.jbpm.test;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;

public class TestJbpm_02 extends TestCase {
	
	//jbpmConfiguration对象的创建
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	public void testJbpm(){
		
		//然后我们把processDefinition里面相关的对象持久化到数据库里面去。
		//流程定义文件里面有很多个概念，他有node，有transition，还有processDefinition，那么我们不需要一个
		//一个保存，jbpm把保存这么多对象的方法封装成一个接口，叫做deployProcessDefinition。我们只要调用这个
		//方法，传一个processDefinition对象，我们就能将他们存入到数据库里面去。
		
		//这个首先第一步我们要得到一个processDefinition对象，然后我们把他部署到流程中去。
		ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("testJBPM/testJbpm.xml");
		//我们要存就必须获得一个session对象，而jbpm已经把session对象封装到一个JbpmContext对象里面了。
		//那么这个jbpmContext对象是怎么得到的呢，我们要先有一个jbpmConfiguration对象，我们要对数据库进行
		//操作的时候一定要有jbpmConfiguration这个对象，用他来创建一个类似于hibernate当中的session一样的
		//对象——jbpmContext。他是我们对数据库所有的操作的一个接口。
		JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
		try{
			//然后部署的操作已经由jbpmContext给我们创建好了，我们只需要调一下他的一个方法就可以了。
			jbpmContext.deployProcessDefinition(processDefinition);
		}finally{
			//最后我们还要对他close一下，就像我们用hibernate的时候要close session一样。
			jbpmContext.close();
		}
	}
}</pre><br />Ok，第二步我们也做完了，那么现在我们开始做第三步，也就是说，我们流程定义文件写好了，现在我们的系统当中有了这样一个报销流程，那么就开始实际的去用她吧，一个人小报销了，那么她就要写一个报销的申请，但是这个报销的申请写完了存到数据库当中了还不能算完了，应该和我们的这个流程关联起来啊，那么她应该怎么去关联呢，嘿嘿，是这样地：我们在建立这个申请单这个类的时候应该定义一个processInstanceId属性，她是一个long型的，她就记录这我们的这个流程实例的id，那么什么是流程实例（processInstance）呢，她是我们工作流当中第二重要的概念，他和流程定义的关系就相当于对象和类之间的关系，类是一个抽象的东西，她定义完了是什么也干不了的，要想用她内部定义的东西我们就要new出一个实例来，当然这个里面也是这样的。<br /><br />那么也就是说，当我们创建这个报销申请的时候我们就要先根据这个流程‘new’出一个流程实例来存到数据库当中，然后在把她的id传给报销申请对象然后再将这个报销申请对象存到数据库当中。那么这个代码是这样的：<br /><pre name="code" class="java">package com.jbpm.test;

import junit.framework.TestCase;

import org.hibernate.Session;

public class TestJbpm_03 extends TestCase {
	
	public void testJbpm(){
		Session session = null;
		try{
			session = HibernateUtil.getSession();
			session.beginTransaction();
			
			Document doc = new Document();
			doc.setTitle("title3");
			doc.setContent("this is content3");
			session.save(doc);						
			session.getTransaction().commit();
		}catch(Exception e){
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtil.closeSession(session);
		}
	}
}</pre><br /><pre name="code" class="java">package com.jbpm.test;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
/**
/*
/*将申请单和流程实例绑定
/*
public class TestJbpm_04 extends TestCase {
	
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	public void testJbpm(){
		
		JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
		jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());
		try {
			ProcessDefinition processDefinition = jbpmContext.getGraphSession().findLatestProcessDefinition("testJbpm");
			ProcessInstance processInstance = new ProcessInstance(processDefinition);
			jbpmContext.save(processInstance);  
			
			
			//将我们的document和instance绑定。
			long processInstanceId = processInstance.getId();
			Document document = (Document)jbpmContext.getSession().load(Document.class,1);
			document.setProcessInstanceId(processInstanceId);
			jbpmContext.getSession().update(document);
			processInstance.getContextInstance().setVariable("document", document.getId());
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			jbpmContext.close();
		}
		
	}
}</pre><br /><br />现在我们的申请已经和实例关联起来了，那么接下来的下一步就开始用啦，就是让这个申请流转起来吧，那么她应该怎么去流转呢，嘿嘿，jbpm给我们提供一个signal方法，每当执行一次这个方法的时候她就流转一下到下一个节点，你可以打印出当前节点试一下，看看是不是执行一次你的当前节点就换一下。这段代码是这样的：<br /><pre name="code" class="java">package com.jbpm.test;

import junit.framework.TestCase;

import org.jbpm.JbpmConfiguration;
import org.jbpm.JbpmContext;
import org.jbpm.graph.exe.ProcessInstance;

public class TestJbpm_05 extends TestCase {
	
	static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();
	
	public void testJbpm(){
		JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
		jbpmContext.setSessionFactory(HibernateUtil.getSessionFactory());
		try{
			
			Document document = (Document)jbpmContext.getSession().load(Document.class, 3);
			long processInstanceId = document.getProcessInstanceId();
			ProcessInstance processInstance = jbpmContext.getProcessInstance(processInstanceId);
			processInstance.signal();
		}finally{
			jbpmContext.close();
		}
	}
}</pre><br /><br />好啦，jbpm的简单例子就到这里了，有什么问题大家可以给我留留言，还请大家多多指教小弟啊。后面我还会写点更具体的一些问题，比如说列出提交到这个人这还没有审批的公文啊，还有如果有多个分支的话应该怎么去做啊等等等等。
          <br/>
          <span style="color:red;">
            <a href="http://fjilyfe.javaeye.com/blog/193241#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 May 2008 12:28:56 +0800</pubDate>
        <link>http://fjilyfe.javaeye.com/blog/193241</link>
        <guid>http://fjilyfe.javaeye.com/blog/193241</guid>
      </item>
      <item>
        <title>献给java初学者，浅谈工作流及JBPM（一）</title>
        <author>fjilyfe</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://fjilyfe.javaeye.com">fjilyfe</a>&nbsp;
          链接：<a href="http://fjilyfe.javaeye.com/blog/192327" style="color:red;">http://fjilyfe.javaeye.com/blog/192327</a>&nbsp;
          发表时间: 2008年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          时下越来越流行工作流了，几乎是每一个项目都会涉及到工作流的应用，那么我们今天就来谈谈工作流。让初学者彻底了解工作流。<br />    <br />    首先我们来看看什么叫做工作流，假如现在张三在公司写了一个请假单，如果天数是一天，他直接要交给他的上级李四来审批审批就可以了，如果天数多余一天，那么李四审批完了还要交给王五去审批。那么整个的这个流程就称之为工作流。<br /><br />    概念谁都能理解，但是要去实现这个工作流，就是很麻烦的一件事情，对于刚才我讲的那个例子来说，张三创建了一个请假单，然后要交给他的上级李四来处理，OK，我们可以把这个请假单和他要交给谁来审批也就是李四都存到数据库中，然后在李四登录的时候，就能够查看到有哪些请假单需要他来审批。这个是很好实现的，但是接下来就麻烦了，当这个请假单请假的天数是一天的时候，他有权利审批。但是如果多余一天的话，他还要交给他的上级王五去审批了。那么这个时候我们首先就要做一系列的判断，请假单是不是多余一天啊，多余一天的话李四要请示的上级是谁啊。而且如果李四要请示的上级是多个人的话我们还应该列出都由哪些上级等等等等。<br /><br />    我们现在只针对这一个需求就要这么麻烦的设计，如果公司有多种需求呢，审批请假单是一种流程，审批报销单也是一种流程，根据需求他的流程成百上千，很明显我们应该设计一个工作流的管理系统来管理这个工作流，然他能适合各种各样的工作流需求。<br /><br />    如果让我们自己去设计这个工作流的管理系统，那么我们首先应该抓住他的核心，其实工作流就是一些信息在不同的人之间的一种流动，根据不同的需求他有着不同的定义规则。那么这个系统要给用户提供这么样的一个接口，能够让用户自己去定义一个流程的规则，当用户定义了这个规则并交给这个系统的时候，他就能够读懂用户定义的这个规则并把他保存起来，并给他一个名字，以后当一个公文要流转的时候，他就根据这个公文上面写的工作流名称，把这个工作流的流向规则拿出来，根据这个规则让这个公文一步一步的流转下去。<br /><br />    所有的工作流管理系统都是这样来实现的，这就是他的原理，他的核心，当你理解了原理之后，其他的针对工作流的框架学习起来也就比较容易了。我们现在就来学习一种工作流引擎，也就是工作流的管理系统——JBPM。<br /><br />    <br />   初步认识JBPM<br /><br />    我最讨厌研究什么框架的意义啊、框架的好处啊、我们刚开始就是要学习这个东西怎么去用。只要你会用就可以了，谁管你知不知道历史，知不知道好处。所以这个里面我们就不再去赘述那些繁琐且没意思的套话了。<br /><br />    说了这么多的废话，该给你们看点实际性的东西了，现在就开始一个最简单的例子。<br /><br />    要想用工作流我们第一件要做的事情一定是定义某种流程规则，也就是你这个请假单是怎么走的。然后才开始部署流程。然后是将自定义的公文转到流程中去。然后就是jbpm替你来管理你的流程了，你只需要告诉他走和不走就可以了。
          <br/>
          <span style="color:red;">
            <a href="http://fjilyfe.javaeye.com/blog/192327#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 12 May 2008 18:42:10 +0800</pubDate>
        <link>http://fjilyfe.javaeye.com/blog/192327</link>
        <guid>http://fjilyfe.javaeye.com/blog/192327</guid>
      </item>
  </channel>
</rss>