spring web flow起步

Spring Web Flow (SWF)是Spring Framework的一个脱离模块。这个模块是Spring Web应用开发模块栈的一部分,Spring Web包含Spring MVC。

Spring Web Flow的目标是成为管理Web应用页面流程的最佳方案。当你的应用需要复杂的导航控制,例如向导,在一个比较大的事务过程中去指导用户经过一连串的步骤的时候,SWF将会是一个功能强大的控制器。

项目结构:


jar包主要是springMVC,jstl,webflow


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>contextConfigLocation</param-name>
        <param-value>
            classpath:applicationContext.xml
        </param-value>
    </context-param>
    <!--ContextLoaderListener监听器的作用就是启动Web容器时,自动装配ApplicationContext的配置信息-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--防止spring 内存泄露-->
    <listener>
        <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>

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

</web-app>
        
application.xml内容:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop" xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
       default-lazy-init="true">

    <!-- 搜索 samples.webflow 包里的 @Component 注解,并将其部署到容器中 -->
    <context:component-scan base-package="samples.webflow"/>
    <!-- 启用基于注解的配置 -->
    <context:annotation-config/>

    <import resource="webflow-config.xml"/>
    <import resource="webmvc-config.xml"/>
</beans>
webflow-config 内容:

    <!-- FlowExecutor 是 Spring Web Flow 的一个核心接口,启动某个 flow ,都要通过这个接口来进行。
    从配置角度来说,只要保证有个 FlowExecutor 就可以了, Spring Web Flow 的默认行为已经足够 -->
    <!-- FlowExecutor 就是通过 id 来找出要执行的 flow 。至于这个 id ,则是要由用户来指定的。
        在默认配置情况下,如果客户端发送了如下URL请求:http://localhost:8080/CartApp/spring/shopping。
        则从 Spring Web Flow 的角度来看,这个 URL 就表示客户想要执行一个 id 为“ shopping ”的 flow ,
        于是就会在 FlowRegistry 中查找名为“ shopping ”的 flow,由FlowExecutor负责执行。 -->
    <webflow:flow-executor id="flowExecutor"/>

    <!-- 所有 flow的定义文件它的位置在这里进行配置, flow-builder-services 用于配置 flow 的特性 -->
    <!-- FlowRegistry 是存放 flow 的仓库,每个定义 flow 的 XML 文档被解析后,都会被分配一个唯一的 id ,并以 FlowDefinition 对象的形式存放在 FlowResigtry 中 -->
    <!-- 每个 flow 都必须要有 id 来标识,如果在配置中省略,那么该 flow 默认的 id 将是该定义文件(xml文件)的文件名去掉后缀所得的字符串
    (例如本例中如果去掉id="shopping",那么flow的id就是shopping.xml去掉后缀名.xml后的shopping作为id) -->

    <!--  flow-builder-services 属性的配置指明了在这个 flow-registry “仓库”里的 flow 的一些基本特性,
        例如,是用 Unified EL 还是 OGNL 、 model (模型)对象中的数据在显示之前是否需要先作转换,等等 -->

    <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices">
        <webflow:flow-location path="/WEB-INF/flows/shopping.xml" id="shopping"/>
    </webflow:flow-registry>

    <!--Web Flow 中的视图通过 MVC 框架的视图技术来呈现 -->

    <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator"/>

    <!-- 指明 MVC 框架的 view resolver ,用于通过 view 名查找资源 -->
    <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
        <property name="viewResolvers" ref="viewResolver"/>
    </bean>
</beans>

webmvc-config内容:

    <!-- 对转向页面的路径解析。prefix:前缀, suffix:后缀 -->
    <bean id="viewResolver"
          class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass"
                  value="org.springframework.web.servlet.view.JstlView">
        </property>
        <property name="prefix" value="/WEB-INF/jsp/">
        </property>
        <property name="suffix" value=".jsp">
        </property>
    </bean>

    <!--  如何根据http请求选择合适的controller是MVC中一项十分关键的功能,在Spring MVC中,HandlerMapping接口是这一活动的抽象 -->
    <!-- SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller -->
    <bean id="viewMappings"
          class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!-- /shopping.do 请求由 flowController 来处理 -->
        <!-- 不管设成 /shopping.do 还是设成 /shopping ,或者 /shopping.htm ,效果都是一样的, flowController 都会去找 id 为 shopping的flow来执行 -->
        <property name="mappings">
            <!--<value>/shopping.do=flowController</value>-->
            <props>
                <prop key="shopping.do">flowController</prop>
            </props>
        </property>
        <property name="defaultHandler">
            <!-- UrlFilenameViewController 会将 "/index" 这样的请求映射成名为 "index" 的视图 -->
            <bean class="org.springframework.web.servlet.mvc.UrlFilenameViewController"/>
        </property>
    </bean>

    <!-- 我们只要明白 FlowController 可根据客户端请求的结尾部分,找出相应的 flow 来执行。配置 FlowController只需指定FlowExecutor即可 -->
    <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor"/>
    </bean>
</beans>

shopping.xml内容:

<flow xmlns="http://www.springframework.org/schema/webflow"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://www.springframework.org/schema/webflow
 http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
    <!-- view-state中的view对应jsp文件夹中的jsp页面,on是触发事件,to对应state id -->
    <!-- 流程文件-2015年6月14日15:51:56 -->
    <!-- 根据排在第一位的顺序来执行 -->
    <view-state id="viewCart" view="viewCart">
        <transition on="submit" to="viewOrder">
        </transition>
    </view-state>
    <view-state id="viewOrder" view="viewOrder">
        <transition on="confirm" to="orderConfirmed">
        </transition>
    </view-state>
    <view-state id="orderConfirmed" view="orderConfirmed">
        <transition on="returnToIndex" to="returnToIndex">
        </transition>
    </view-state>
    <!--<end-state id="returnToIndex" view="externalRedirect:servletRelative:/index.jsp">-->
    <end-state id="returnToIndex" view="externalRedirect:/index.jsp">
    </end-state>
</flow>

----------------------------------------------------------

index.jsp

<a href="shopping.do">View Cart</a>
viewCart:
<a href="${flowExecutionUrl}&_eventId=submit">Submit</a>
viewOrder.jsp
<a href="${flowExecutionUrl}&_eventId=confirm">Confirm</a>
orderComfirmed.jsp
<a href="${flowExecutionUrl}&_eventId=returnToIndex">Return to
    index</a>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值