分享
 
 
 

使用 WebFlowEditor 开发SWF应用

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

使用 WebFlowEditor 开发SWF应用 转自:http://www.nirvanastudio.org/nicholas/SWFEditor.htm

如果你还不了解Spring Web Flow,请参考Spring Web Flow这篇文章。

如果你已经开始对Spring Web Flow感兴趣了,那么我们开始着手了解如何独自开发SWF应用了。

首先,一个好的开发环境能够节省很多时间,这里我介绍一下如何使用Eclipse + WebFlowEditor开发SWF应用。

安装:下载Eclipse,我用的是3.1 M6版本。 下载Spring Framework和Spring Web Flow 安装plug-in,首先要装一个Spring IDE,之后要装Eclipse GEF,最后装Spring WebFlowEditor。 安装插件可以通过Help->Software Updates->Find and Install->Search for new festures to install->New Remote Site的办法,添加插件下载页的方式直接通过eclipse下载安装。

Spring IDE: http://springide.org/updatesite/

WebFlowEditor: http://springide.org/updatesite_dev

GET: 通过默认的Eclipse.org update site安装,或者直接从eclipse网站下载安装

配置:新建一个Java Project,在Package Explorer选中项目点右键选择Add Spring Project Nature 我认为是很重要的一点,很多朋友都很疑惑Spring IDE在哪里,其实默认情况下这个View并没有显示出来,我们在Window->Show View->Other里面添加它到开发界面上。其实Spring IDE和Spring WebFlow的最大特点也就是能够以图形的方式直观的给人一个大体的映像,这样一来就能很好的看清Beans之间的联系。 在Spring Beans和Spring WebFlow里面添加配置信息,主要就是设定applicationContext.xml和xxxFlow.xml(Web Flow 定义),一切配置好后,就可以Show Graph和Show WebFlow Editor的方式显示出图形界面。有图形界面做起来就方便多啦:-)

图1 - Spring IDE 视图

第一个应用:这个例子来源于Spring Web Flow发行包内的例子 - fileupload,这是一个很简单的例子,流程也很简单。它采用了Spring MVC,最后我尝试着将它转换成Struts MVC。

在WEB-INF下的upload-flow.xml如下:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE webflow PUBLIC "-//SPRING//DTD WEBFLOW//EN"

"http://www.springframework.org/dtd/spring-webflow.dtd">

<webflow id="upload" start-state="selectFile.view">

<view-state id="selectFile.view" view="selectFile.view">

<transition on="submit" to="bindAndValidate"/>

</view-state>

<action-state id="bindAndValidate">

<action bean="upload.process"/>

<transition on="success" to="confirmation.view"/>

<transition on="error" to="selectFile.view"/>

</action-state>

<view-state id="confirmation.view" view="confirmation.view">

<transition on="back" to="selectFile.view"/>

</view-state>

</webflow>

通过Spring Web Flow Editor生成的流程图如下:

图2- fileupload 流程

在这个应用里,所有的view都放在了WEB-INF/jsp里面,每个标单里面必须有这样一个隐藏域:

<INPUT type="hidden" name="_flowExecutionId" value="<%=request.getAttribute("flowExecutionId") %>">

用于SWF判断流程执行位置。

SelectFile.view ==> WEB-INF/jsp/selectFile.view.jsp,在这个View里面还有一个隐藏域:

<INPUT type="hidden" name="_eventId" value="submit">

这个用于表示事件ID,就是transition的on属性,这样标示就能让spring知道执行哪个transitioin了。

与Struts集成:Spring提供的例子是与Spring MVC集成的,我尝试将它换成了Struts。

1、在struts-config.xml里面加入Spring Plugin,并且定义SWF入口:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts-config PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"

"http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd">

<struts-config>

<form-beans>

<form-bean name="actionForm" type="org.springframework.web.struts.BindingActionForm"/>

</form-beans>

<global-forwards>

<forward name="confirmation.view" path="/WEB-INF/jsp/confirmation.view.jsp" />

<forward name="selectFile.view" path="/WEB-INF/jsp/selectFile.view.jsp" />

</global-forwards>

<action-mappings>

<action path="/upload"

type="org.springframework.web.flow.struts.FlowAction"

name="actionForm" scope="request"

className="org.springframework.web.flow.struts.FlowActionMapping">

<set-property property="flowId" value="upload" />

</action>

</action-mappings>

<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">

<set-property property="contextConfigLocation" value="/WEB-INF/applicationContext.xml"/>

</plug-in>

</struts-config>

关于view的映射需要使用action forwards,典型的做法是定义成全局的(SWF JavaDocs上介绍)。

定义SWF入口是最重要的,如果不定义,SWF是无法启动的。同时要启动一个Web流程,你需要传递一个flowId给控制器,这里FlowAction包含了一个全局的控制器(详细内容查SWF JavaDocs)。upload这个属性值很重要,他是你的webflow的id号,你可能有多个webflow,用它标示你需要启动的那个。当然还有其他的启动办法,另外的例子上有介绍。

3、编写完整的applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

<bean id="upload" class="org.springframework.web.flow.config.FlowFactoryBean">

<property name="flowBuilder">

<bean class="org.springframework.web.flow.config.XmlFlowBuilder">

<property name="resource" value="/WEB-INF/upload-flow.xml"/>

</bean>

</property>

</bean>

<bean id="upload.process" class="org.springframework.samples.fileupload.web.flow.ProcessUploadAction">

<property name="formObjectName" value="file"/>

<property name="formObjectClass" value="org.springframework.samples.fileupload.web.flow.FileUploadBean"/>

</bean>

</beans>

4、编写web.xml以加载Struts和Spring:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app id="WebApp">

<servlet>

<servlet-name>action</servlet-name>

<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

<init-param>

<param-name>config</param-name>

<param-value>/WEB-INF/struts-config.xml</param-value>

</init-param>

<init-param>

<param-name>debug</param-name>

<param-value>2</param-value>

</init-param>

<init-param>

<param-name>detail</param-name>

<param-value>2</param-value>

</init-param>

<load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>action</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>

org.springframework.web.context.ContextLoaderServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

</web-app>

结论:由于没有细看SWF提供的例子,birthdate就是一个Struts + Spring的例子,害得我捉摸了半天......

birthday的例子中提供了Spring MVC和Struts的配置的对比,就是没有讲解,也让人看得很郁闷。

SWF与Struts是两个独立的模块,SWF设计者的初衷是实现最大程度的重用,也就是说SWF开发和Struts开发是相对独立的。不仅是Struts,包括Spring MVC和Spring Portlet MVC都是与之独立的。使用Struts仅仅是作为一个启动WebFlow的入口,就像Spring MVC一样,与之不同的是Struts使用struts-config.xml配合applicationContext配置启动WebFlow入口,而Spring MVC只需要直接定义在applicationContext配置里面,因为Spring都是一家子的东西嘛。

从前一篇翻译的文章里可以看到,Action State的实现是继承org.springframework.web.flow.action包里面的类,而不是针对特定的MVC框架,那么他们是如何通讯的呢。那就是Context对象模式(Context Object Pattern),属于J2EE的表现层模式,可以参考J2EE Core Pattern这个书,上面介绍的详细。这个Context对象提供了在一个全局应用中使用的与协议无关的封装后的对象。这样就为了把SWF和MVC框架分开。

作者:Nicholas@NirvanaStudio

2005-5-28

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有