1.构建webflow2.3.3环境(2.0以上应该都可以)
导入webflow的jar包+springmvc的一些必须包,目录结构如下
2.配置webflow(spring-wf.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:webflow="http://www.springframework.org/schema/webflow-config" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/webflow-config http://www.springframework.org/schema/webflow-config/spring-webflow-config-2.0.xsd"> <!-- 流程注册器 隐含一句 flow-registry="flowRegistry" 默认表示引用bean id为 'flowRegistry'的流程注册表--> <webflow:flow-executor id="flowExecutor" /> <!-- 流程注册表 --> <webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices"> <webflow:flow-location path="/WEB-INF/flows/hello.xml" id="hello" /> </webflow:flow-registry> <!-- WebFlow 视图解析器 --> <bean id="flowViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"> </property> <property name="prefix" value="/WEB-INF/flowView/"> </property> <property name="suffix" value=".jsp"> </property> </bean> <!-- WebFlow 视图工厂构建服务 --> <webflow:flow-builder-services id="flowBuilderServices" view-factory-creator="mvcViewFactoryCreator" /> <!-- WebFlow 视图工厂创建器,表示使用视图解析器将流程配置(xml)中的逻辑视图交给视图解析器解析 → jsp --> <bean id="mvcViewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator"> <property name="viewResolvers" ref="flowViewResolver" /> </bean> <!-- 配置WebFlow 处理器映射器--> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <!-- 这个逻辑视图名的 前缀 必须与流程注册表中的 webflow:flow-location 的 id一致, 而 后缀 必须是当前DispatcherServlet匹配的地址,也就是 必须以.flow结束,否则不被前端控制器处理(视图名必须匹配*.flow) --> <!-- 这里代表将请求路径为hello.flow的url交给flowController处理 --> <prop key="hello.flow">flowController</prop> </props> </property> </bean> <!--WebFlow 处理器,根据逻辑视图名到流程执行器中找到对应的注册表,进而找到流程配置文件,转到不同的物理视图--> <!--主要工作就是负责将url转化成逻辑视图交给视图解析器解析 → jsp--> <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController"> <property name="flowExecutor" ref="flowExecutor" /> </bean> </beans>
3.配置WebFlow前端控制器(web.xml)
<servlet> <servlet-name>FlowServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> classpath:spring-wf.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>FlowServlet</servlet-name> <url-pattern>*.flow</url-pattern> </servlet-mapping>
拦截所有.flow结尾的请求交给springmvc前端控制器处理
至此,webflow需要的所有组件都已经配置完成,现在还有2步,配置流程文件+跳转页面
4.流程配置文件(hello.xml[/WEB-INF/flow])
<?xml version="1.0" encoding="UTF-8"?> <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 id="cart" view="cart"> <transition on="submit" to="order"> </transition> </view-state> <view-state id="order" view="order"> <transition on="confirm" to="finish"> </transition> </view-state> <view-state id="finish" view="finish"> <transition on="toindex" to="index"> </transition> </view-state> <end-state id="index" view="externalRedirect:index.jsp"> </end-state> </flow>
流程配置文件首先执行第一个状态标签。
5.跳转页面
index.jsp(根目录)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>index</title> </head> <body> <h2 align="center">Hello,WebFlow</h2> <br /> Item1:<a href="hello.flow">加入购物车</a><br /> Item2:<a href="hello.flow">加入购物车</a><br /> Item2:<a href="hello.flow">加入购物车</a> </body> </html>
cart.jsp(/WEB-INF/flowView/)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>购物车</title> </head> <body> <h2 align="center">购物车</h2> <br/> 衣服:<a href="${flowExecutionUrl}&_eventId=submit">买买买!!!</a> <br/> 裤子:<a href="${flowExecutionUrl}&_eventId=submit">买买买!!!</a> <br/> 鞋子:<a href="${flowExecutionUrl}&_eventId=submit">买买买!!!</a> </body> </html>
order.jsp(/WEB-INF/flowView/)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>订单</title> </head> <body> <h2 align="center">订单</h2> <br/> <a href="${flowExecutionUrl}&_eventId=confirm">确认支付</a> </body> </html>
finish.jsp(/WEB-INF/flowView/)
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>view order</title> </head> <body> <h2 align="center">确认支付</h2> <br/> <a href="${flowExecutionUrl}&_eventId=toindex">恭喜你,支付成功..</a> </body> </html>
${flowExecutionUrl}由webflow框架赋值,其中包含了flow各个状态的值(动态生成,每个状态不一样),以及对应的model数据
_eventId的值与本状态transition标签的on属性值对应,通过这个值跳转到不同的状态或者视图,实现转移