以下代码也是从网络上整理过来的,在这里记录一下。
首先如下图所示建立一个Web工程.
用到的lib列表如下:
activation.jar
bsh-1.2b7.jar
commons-logging.jar
designer.jar
mail.jar
oscore-2.2.5.jar
osuser-1.0-dev-2Feb05.jar
osworkflow-2.8.0.jar
propertyset-1.4.jar
quartz.jar
antlr-2.7.6.jar
asm.jar
cglib-2.1.3.jar
commons-beanutils.jar
commons-codec.jar
commons-collections-3.2.jar
commons-dbcp-1.2.jar
commons-lang.jar
commons-pool-1.3.jar
dom4j-1.6.1.jar
ehcache-1.2.3.jar
hibernate3.jar
jta.jar
jtds-1.2.2.jar
log4j-1.2.14.jar
spring.jar
代码如下所示:
AllowAction.java
- package tw.idv.idealist.actions;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import com.opensymphony.workflow.Workflow;
- import tw.idv.idealist.Leave;
- public class AllowAction extends HttpServlet {
- private static final long serialVersionUID = -8935624987243166064L;
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req, resp);
- }
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
- Workflow workflow = (Workflow)context.getBean("workflow");
- String workflowId = req.getParameter("workflowId");
- String actionId = req.getParameter("actionId");
- Leave leave = new Leave();
- leave.allow(workflow, Long.parseLong(workflowId), Integer.parseInt(actionId));
- resp.sendRedirect("completed.jsp");
- }
- }
LeaveAction.java
- package tw.idv.idealist.actions;
- import java.io.IOException;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import com.opensymphony.workflow.Workflow;
- import tw.idv.idealist.Leave;
- public class LeaveAction extends HttpServlet {
- private static final long serialVersionUID = 1376955339587565809L;
- public void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doPost(req, resp);
- }
- public void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
- Workflow workflow = (Workflow)context.getBean("workflow");
- Leave leave = new Leave();
- //String employee = req.getParameter("employee");
- long workflowId = leave.send(workflow);
- resp.sendRedirect("allow.jsp?workflowId=" + workflowId);
- }
- }
Leave.java
- package tw.idv.idealist;
- import com.opensymphony.workflow.InvalidActionException;
- import com.opensymphony.workflow.InvalidEntryStateException;
- import com.opensymphony.workflow.InvalidInputException;
- import com.opensymphony.workflow.InvalidRoleException;
- import com.opensymphony.workflow.Workflow;
- import com.opensymphony.workflow.WorkflowException;
- public class Leave {
- public long send(Workflow workflow) {
- long workflowId = -1;
- try {
- workflowId = workflow.initialize("leave", 0, null);
- workflow.doAction(workflowId, 1, null);
- } catch (InvalidActionException e) {
- e.printStackTrace();
- } catch (InvalidRoleException e) {
- e.printStackTrace();
- } catch (InvalidInputException e) {
- e.printStackTrace();
- } catch (InvalidEntryStateException e) {
- e.printStackTrace();
- } catch (WorkflowException e) {
- e.printStackTrace();
- }
- return workflowId;
- }
- public void allow(Workflow workflow, long workflowId, int actionId) {
- try {
- workflow.doAction(workflowId, actionId, null);
- } catch (InvalidInputException e) {
- e.printStackTrace();
- } catch (WorkflowException e) {
- e.printStackTrace();
- }
- catch (InvalidActionException e) {
- e.printStackTrace();
- }
- }
- }
Query.java
- package tw.idv.idealist;
- import java.util.List;
- import javax.servlet.ServletContext;
- import org.hibernate.SessionFactory;
- import org.springframework.web.context.WebApplicationContext;
- import org.springframework.web.context.support.WebApplicationContextUtils;
- import com.opensymphony.workflow.StoreException;
- import com.opensymphony.workflow.query.FieldExpression;
- import com.opensymphony.workflow.query.WorkflowExpressionQuery;
- import com.opensymphony.workflow.spi.WorkflowEntry;
- import com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore;
- public class Query extends SpringHibernateWorkflowStore{
- public Query(ServletContext sc) {
- WebApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(sc);
- SessionFactory sf = (SessionFactory)context.getBean("sessionFactory");
- setSessionFactory(sf);
- }
- public List<?> getCompleted() {
- FieldExpression fe = new FieldExpression(FieldExpression.STATE,
- FieldExpression.ENTRY, FieldExpression.EQUALS, new Integer(
- WorkflowEntry.COMPLETED));
- List<?> list = null;
- try {
- list = query(new WorkflowExpressionQuery(fe));
- } catch (StoreException e) {
- e.printStackTrace();
- }
- return list;
- }
- }
leave.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.6//EN"
- "http://www.opensymphony.com/osworkflow/workflow_2_8.dtd">
- <workflow>
- <initial-actions>
- <action id="0" name="开始">
- <results>
- <unconditional-result old-status="Finished"
- status="Queued" step="1" />
- </results>
- </action>
- </initial-actions>
- <steps>
- <step id="1" name="填假单">
- <actions>
- <action id="1" name="送出">
- <pre-functions>
- <function type="class">
- <arg name="class.name">
- com.opensymphony.workflow.util.Caller
- </arg>
- </function>
- </pre-functions>
- <results>
- <unconditional-result old-status="Finished"
- status="Queued" step="2" owner="User100" />
- </results>
- </action>
- </actions>
- </step>
- <step id="2" name="批假单">
- <actions>
- <action id="2" name="准许">
- <pre-functions>
- <function type="class">
- <arg name="class.name">
- com.opensymphony.workflow.util.Caller
- </arg>
- </function>
- </pre-functions>
- <results>
- <unconditional-result old-status="Finished"
- status="Queued" step="3" owner="${caller}" />
- </results>
- </action>
- <action id="3" name="驳回">
- <pre-functions>
- <function type="class">
- <arg name="class.name">
- com.opensymphony.workflow.util.Caller
- </arg>
- </function>
- </pre-functions>
- <results>
- <unconditional-result old-status="Finished"
- status="Queued" step="1" owner="${caller}" />
- </results>
- </action>
- </actions>
- </step>
- <step id="3" name="停止" />
- </steps>
- </workflow>
workflows.xml
- <workflows>
- <workflow name="leave" type="resource" location="leave.xml" />
- </workflows>
applicationContext.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <bean id="propertyConfigurer"
- class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
- <property name="location">
- <value>/WEB-INF/jdbc.properties</value>
- </property>
- </bean>
- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
- <property name="driverClassName">
- <value>${jdbc.driverClassName}</value>
- </property>
- <property name="url">
- <value>${jdbc.url}</value>
- </property>
- <property name="username">
- <value>${jdbc.username}</value>
- </property>
- <property name="password">
- <value>${jdbc.password}</value>
- </property>
- <property name="maxWait">
- <value>${jdbc.maxWait}</value>
- </property>
- <property name="removeAbandoned">
- <value>${jdbc.removeAbandoned}</value>
- </property>
- <property name="removeAbandonedTimeout">
- <value>${jdbc.removeAbandonedTimeout}</value>
- </property>
- <property name="logAbandoned">
- <value>${jdbc.logAbandoned}</value>
- </property>
- </bean>
- <bean id="sessionFactory"
- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource">
- <ref bean="dataSource" />
- </property>
- <property name="mappingResources">
- <list>
- <value>com/opensymphony/workflow/spi/hibernate/HibernateCurrentStep.hbm.xml</value>
- <value>com/opensymphony/workflow/spi/hibernate/HibernateHistoryStep.hbm.xml</value>
- <value>com/opensymphony/workflow/spi/hibernate/HibernateWorkflowEntry.hbm.xml</value>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">
- ${hibernate.dialect}
- </prop>
- <prop key="hibernate.show_sql">
- ${hibernate.show_sql}
- </prop>
- <prop key="hibernate.jdbc.batch_size">
- ${hibernate.jdbc.batch_size}
- </prop>
- <prop key="hibernate.generate_statistics">
- ${hibernate.generate_statistics}
- </prop>
- <prop key="hibernate.hbm2ddl.auto">
- ${hibernate.hbm2ddl.auto}
- </prop>
- </props>
- </property>
- <property name="eventListeners">
- <map>
- <entry key="merge">
- <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener" />
- </entry>
- </map>
- </property>
- </bean>
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory">
- <ref local="sessionFactory" />
- </property>
- </bean>
- <bean id="workflowStore" class="com.opensymphony.workflow.spi.hibernate3.SpringHibernateWorkflowStore">
- <property name="sessionFactory"><ref local="sessionFactory"/></property>
- <property name="propertySetDelegate">
- <bean id="propertySetDelegate" class="com.opensymphony.workflow.util.PropertySetDelegateImpl"/>
- </property>
- </bean>
- <bean id="workflowTypeResolver" class="com.opensymphony.workflow.util.SpringTypeResolver"/>
- <bean id="workflowFactory" class="com.opensymphony.workflow.spi.hibernate.SpringWorkflowFactory" init-method="init">
- <property name="resource"><value>workflows.xml</value></property>
- <property name="reload"><value>false</value></property>
- </bean>
- <bean id="osworkflowConfiguration" class="com.opensymphony.workflow.config.SpringConfiguration">
- <property name="store"><ref local="workflowStore"/></property>
- <property name="factory"><ref local="workflowFactory"/></property>
- </bean>
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager"><ref local="transactionManager"/></property>
- <property name="transactionAttributes">
- <props>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- <bean id="workflow" class="org.springframework.aop.framework.ProxyFactoryBean">
- <property name="proxyInterfaces">
- <value>com.opensymphony.workflow.Workflow</value>
- </property>
- <property name="interceptorNames">
- <list>
- <value>transactionInterceptor</value>
- <value>workflowTarget</value>
- </list>
- </property>
- </bean>
- <bean id="workflowTarget" class="com.opensymphony.workflow.basic.BasicWorkflow">
- <constructor-arg><value>shenbin</value></constructor-arg>
- <property name="configuration"><ref local="osworkflowConfiguration"/></property>
- </bean>
- </beans>
jdbc.properties
- #DataSource
- jdbc.driverClassName=net.sourceforge.jtds.jdbc.Driver
- jdbcjdbc.url=jdbc:jtds:sqlserver://localhost:1433/OSWorkflow
- jdbc.username=sa
- jdbc.password=sa
- jdbc.maxWait=10000
- jdbc.removeAbandoned=true
- jdbc.removeAbandonedTimeout=10000
- jdbc.logAbandoned=true
- #Hibernate
- hibernate.dialect=org.hibernate.dialect.SQLServerDialect
- hibernate.show_sql=false
- hibernate.jdbc.batch_size=20
- hibernate.generate_statistics=true
- hibernate.hbm2ddl.auto=create-drop
log4j.properties
- #Log4j
- log4j.rootLogger=ERROR, stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d %p %c - %m%n
- log4j.logger.org.hibernate.cache=DEBUG
web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <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">
- <context-param>
- <param-name>log4jConfigLocation</param-name>
- <param-value>/WEB-INF/log4j.properties</param-value>
- </context-param>
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/applicationContext.xml
- </param-value>
- </context-param>
- <listener>
- <listener-class>
- org.springframework.web.context.ContextLoaderListener
- </listener-class>
- </listener>
- <listener>
- <listener-class>
- org.springframework.web.util.Log4jConfigListener
- </listener-class>
- </listener>
- <servlet>
- <servlet-name>LeaveAction</servlet-name>
- <servlet-class>
- tw.idv.idealist.actions.LeaveAction
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>LeaveAction</servlet-name>
- <url-pattern>/LeaveAction</url-pattern>
- </servlet-mapping>
- <servlet>
- <servlet-name>AllowAction</servlet-name>
- <servlet-class>
- tw.idv.idealist.actions.AllowAction
- </servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>AllowAction</servlet-name>
- <url-pattern>/AllowAction</url-pattern>
- </servlet-mapping>
- <welcome-file-list>
- <welcome-file>leave.jsp</welcome-file>
- </welcome-file-list>
- </web-app>
allow.jsp
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <HTML>
- <HEAD>
- <%@ page language="java" contentType="text/html; charset=GBK"
- pageEncoding="GBK" %>
- <META http-equiv="Content-Type" content="text/html; charset=GBK">
- <META http-equiv="Content-Style-Type" content="text/css">
- <TITLE>批准假单</TITLE>
- <Script Language="JavaScript">
- function DoAction(actionId) {
- document.myForm.actionId.value = actionId;
- document.myForm.submit();
- }
- </Script>
- </HEAD>
- <BODY>
- <%
- String workflowId = request.getParameter("workflowId");
- %>
- <P>主管批假单</P>
- <form action="AllowAction" name="myForm">
- <input type="hidden" name="actionId" value="">
- 工作流编号: <input type="text" name="workflowId" value=<%= workflowId %>>
- <input type="button" value="准许" OnClick="DoAction(2)">
- <input type="button" value="驳回" OnClick="DoAction(3)">
- </form>
- </BODY>
- </HTML>
completed.jsp
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <HTML>
- <HEAD>
- <%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" %>
- <%@ page import="tw.idv.idealist.*" %>
- <%@ page import="java.util.*" %>
- <META http-equiv="Content-Type" content="text/html; charset=GBK">
- <META http-equiv="Content-Style-Type" content="text/css">
- <TITLE>completed.jsp</TITLE>
- </HEAD>
- <BODY>
- 已经完成的工作流程编号:<br>
- <%
- Query query = new Query(pageContext.getServletContext());
- List completed = query.getCompleted();
- for(int i=0; i<completed.size(); i++) {
- Long wfId = (Long) completed.get(i);
- out.println("workflow id => " + wfId + "<br>");
- }
- %>
- </BODY>
- </HTML>
leave.jsp
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <HTML>
- <HEAD>
- <%@ page language="java" contentType="text/html; charset=GBK"
- pageEncoding="GBK" %>
- <%@ page import="tw.idv.idealist.*" %>
- <META http-equiv="Content-Type" content="text/html; charset=GBK">
- <META http-equiv="Content-Style-Type" content="text/css">
- <TITLE>填写假单</TITLE>
- </HEAD>
- <BODY>
- <P>员工请假</P>
- <form action="LeaveAction">
- 员工代号: <input type="text" name="employee">
- <input type="submit" value="送出">
- </form>
- </BODY>
- </HTML>
配置好环境后启动Tomcat即可访问上诉例子。注意在MSSQL2000中建立一个名为OSWorkflow的数据库。表结构将有Hibernte 在每次启动时自行建立,不需要手工建立的。
更多资料:
http://blog.csdn.net/shipatrioc/archive/2006/06/29/852424.aspx
http://www.blogjava.net/pdw2009/archive/2006/04/18/41658.html