kapok

          垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks

          使用 WebFlowEditor 開發(fā)SWF應(yīng)用

          http://blog.csdn.net/zmxj/archive/2005/05/31/384946.aspx

          轉(zhuǎn)自:http://www.nirvanastudio.org/nicholas/SWFEditor.htm

          如果你還不了解Spring Web Flow,請(qǐng)參考Spring Web Flow這篇文章。

          如果你已經(jīng)開始對(duì)Spring Web Flow感興趣了,那么我們開始著手了解如何獨(dú)自開發(fā)SWF應(yīng)用了。

          首先,一個(gè)好的開發(fā)環(huán)境能夠節(jié)省很多時(shí)間,這里我介紹一下如何使用Eclipse + WebFlowEditor開發(fā)SWF應(yīng)用。

          安裝:

          1. 下載Eclipse,我用的是3.1 M6版本。
          2. 下載Spring Framework和Spring Web Flow
          3. 安裝plug-in,首先要裝一個(gè)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: 通過默認(rèn)的Eclipse.org update site安裝,或者直接從eclipse網(wǎng)站下載安裝

          配置:

          1. 新建一個(gè)Java Project,在Package Explorer選中項(xiàng)目點(diǎn)右鍵選擇Add Spring Project Nature
          2. 我認(rèn)為是很重要的一點(diǎn),很多朋友都很疑惑Spring IDE在哪里,其實(shí)默認(rèn)情況下這個(gè)View并沒有顯示出來,我們?cè)赪indow->Show View->Other里面添加它到開發(fā)界面上。其實(shí)Spring IDE和Spring WebFlow的最大特點(diǎn)也就是能夠以圖形的方式直觀的給人一個(gè)大體的映像,這樣一來就能很好的看清Beans之間的聯(lián)系。
          3. 在Spring Beans和Spring WebFlow里面添加配置信息,主要就是設(shè)定applicationContext.xml和xxxFlow.xml(Web Flow 定義),一切配置好后,就可以Show Graph和Show WebFlow Editor的方式顯示出圖形界面。有圖形界面做起來就方便多啦:-)

          圖1 - Spring IDE 視圖

          第一個(gè)應(yīng)用:

          這個(gè)例子來源于Spring Web Flow發(fā)行包內(nèi)的例子 - fileupload,這是一個(gè)很簡(jiǎn)單的例子,流程也很簡(jiǎn)單。它采用了Spring MVC,最后我嘗試著將它轉(zhuǎn)換成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 流程

          在這個(gè)應(yīng)用里,所有的view都放在了WEB-INF/jsp里面,每個(gè)標(biāo)單里面必須有這樣一個(gè)隱藏域:

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

          用于SWF判斷流程執(zhí)行位置。

          SelectFile.view ==> WEB-INF/jsp/selectFile.view.jsp,在這個(gè)View里面還有一個(gè)隱藏域:

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

          這個(gè)用于表示事件ID,就是transition的on屬性,這樣標(biāo)示就能讓spring知道執(zhí)行哪個(gè)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>
          

          關(guān)于view的映射需要使用action forwards,典型的做法是定義成全局的(SWF JavaDocs上介紹)。

          定義SWF入口是最重要的,如果不定義,SWF是無法啟動(dòng)的。同時(shí)要啟動(dòng)一個(gè)Web流程,你需要傳遞一個(gè)flowId給控制器,這里FlowAction包含了一個(gè)全局的控制器(詳細(xì)內(nèi)容查SWF JavaDocs)。upload這個(gè)屬性值很重要,他是你的webflow的id號(hào),你可能有多個(gè)webflow,用它標(biāo)示你需要啟動(dòng)的那個(gè)。當(dāng)然還有其他的啟動(dòng)辦法,另外的例子上有介紹。

          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>

          結(jié)論:

          由于沒有細(xì)看SWF提供的例子,birthdate就是一個(gè)Struts + Spring的例子,害得我捉摸了半天......

          birthday的例子中提供了Spring MVC和Struts的配置的對(duì)比,就是沒有講解,也讓人看得很郁悶。

          SWF與Struts是兩個(gè)獨(dú)立的模塊,SWF設(shè)計(jì)者的初衷是實(shí)現(xiàn)最大程度的重用,也就是說SWF開發(fā)和Struts開發(fā)是相對(duì)獨(dú)立的。不僅是Struts,包括Spring MVC和Spring Portlet MVC都是與之獨(dú)立的。使用Struts僅僅是作為一個(gè)啟動(dòng)WebFlow的入口,就像Spring MVC一樣,與之不同的是Struts使用struts-config.xml配合applicationContext配置啟動(dòng)WebFlow入口,而Spring MVC只需要直接定義在applicationContext配置里面,因?yàn)镾pring都是一家子的東西嘛。

          從前一篇翻譯的文章里可以看到,Action State的實(shí)現(xiàn)是繼承org.springframework.web.flow.action包里面的類,而不是針對(duì)特定的MVC框架,那么他們是如何通訊的呢。那就是Context對(duì)象模式(Context Object Pattern),屬于J2EE的表現(xiàn)層模式,可以參考J2EE Core Pattern這個(gè)書,上面介紹的詳細(xì)。這個(gè)Context對(duì)象提供了在一個(gè)全局應(yīng)用中使用的與協(xié)議無關(guān)的封裝后的對(duì)象。這樣就為了把SWF和MVC框架分開。

          作者:

          Nicholas@NirvanaStudio

          2005-5-28

          posted on 2005-07-27 12:20 笨笨 閱讀(406) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALL
          主站蜘蛛池模板: 佛教| 新安县| 崇信县| 樟树市| 德安县| 屏东市| 正镶白旗| 隆子县| 赞皇县| 团风县| 电白县| 永年县| 鄂托克旗| 宜黄县| 正阳县| 高密市| 青浦区| 天镇县| 凤山市| 南丹县| 孝昌县| 南城县| 报价| 河南省| 宁城县| 峨眉山市| 贵溪市| 汉沽区| 连州市| 临江市| 邻水| 盈江县| 于都县| 桃园市| 铁岭市| 双鸭山市| 石首市| 沅陵县| 山阳县| 错那县| 皮山县|