spring webflow getting start

概述

很多时候,我们写的流程都嵌在一大堆代码中,没有办法直观的管理。而spring webflow可以将流程抽出来,放到一个单独的xml文件中,这样流程就不会埋没在代码里了。

今天要做一个很简单的流程: 商品发布流程

Created with Raphaël 2.1.0开始显示“类别选择”页面显示“商品信息填写”页面结束

做出来后,大概就是下面这个样子:

“类别选择”页面:release_first.jsp

这里写图片描述

“商品信息填写”页面:release_second.jsp

这里写图片描述

项目的环境是 Spring MVC项目。

需要修改的文件:

  • spring-servlet.xml (spring MVC配置文件)
  • applicationContext.xml (spring 配置文件)
  • releasegoods-flow.xml (spring webflow 配置文件)
  • release_first.jsp
  • release_second.jsp

实现

spring-servlet.xml

 <bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping"><property name="flowRegistry" ref="flowRegistry" /></bean><!-- Define FlowHandlerAdapter to handle Spring Web Flow request call.This is the Controller class in Spring Web Flow --><bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter"><property name="flowExecutor" ref="flowExecutor" /></bean>
  • FlowHandlerMapping : 这个类会告诉DispatcherServlet,将匹配的请求发送给webflow处理(也就是发给FlowHandlerAdapter),匹配规则定义在flowRegistry里。

  • FlowHandlerAdapter :起到流程控制器的作用,处理所有进入webflow的请求

上面两个配置,其实都是在解决请求怎么进入到流程的问题,并不属于流程的一部分。

applicationContext.xml

<!-- webflow相关配置 --><!-- 流程执行器 --><flow:flow-executor id="flowExecutor" flow-registry="flowRegistry"></flow:flow-executor><!-- 流程注册表 --><flow:flow-registry id="flowRegistry"><flow:flow-location path="/WEB-INF/flows/releasegoods/releasegoods-flow.xml" id="viewgoodsclass"></flow:flow-location></flow:flow-registry>
  • <flow:flow-executor>:流程执行器,负责创建和执行流程
  • <flow:flow-registry :流程注册表,通过<flow:flow-location>的path属性指出流程定义的位置,通过id属性指出流程的访问地址。比如这里定义的流程,就可以通过:http://localhost:8080/viewgoodsclass 来打开。

releasegoods-flow.xml

<?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/webflowhttp://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd"><var name="goods" class="com.huanle.model.entity.GoodsEntity"/><view-state id="viewfirst" view="/views/user/releasegoods/release_first.jsp" model="goods"><transition on="submit" to="viewsecond"></transition></view-state> <view-state id="viewsecond" view="/views/user/releasegoods/release_second.jsp" model="goods"><transition on="submit" to="returntouserindex"></transition></view-state><end-state id="returntouserindex" view="/index.jsp"></end-state><global-transitions><transition on="cancel" to="returntouserindex"></transition></global-transitions></flow>

上面这个文件定义了流程:

  • <var> : 配置了一个变量,作用范围是整个流程,注意,这个变量的类要实现Serializable接口
  • <view-state> : 视图状态,流程在这个状态下会显示一个视图与用户交互。
  • <transition> : 定义跳转,比如这里的第一个transition标签的意思是:检测到submit事件就跳转到viewsecond状态。submit事件指的不是html form的submit事件,而是我们自定义的一个标记,可以随便取名。
  • <end-state> :终点状态。(也许会奇怪为什么没有开始状态,因为默认第一个状态就是开始状态)
  • <global-transitions> : 定义全局跳转,因为cancel在任何一个状态里都需要,所以配置为全局跳转。

release_first.jsp

<form:form action="${flowExecutionUrl}&_eventId=submit" method="post" commandName="goods"><input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}"/><div class="release"><input type="submit"  value="我已阅读以下规则,现在发布宝贝"/></div></form:form>
  • flowExecutionUrl :提交的url,通过这个地址可以和流程交互。一般就像上面这样用就可以了。
  • _eventId : 这个参数就是我们自定义的事件,状态根据这个事件参数跳转到不同的下一状态。
  • flowExecutionKey:这个隐藏域用来区分不同的流程实例,必须要加到表单中提交

release_second.jsp

跟release_first.jsp 类似。

就这样,一个流程定义好了,可以通过:http://localhost:8080/viewgoodsclass 来打开这个流程

参考文档


Spring Web Flow Basics

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pythonvim编辑教程_Pycharm学习教程(6) Pycharm作为Vim编辑器使用

Pycharm作为Vim编辑器使用&#xff0c;具体内容如下1、主题如果你是Vim的粉丝&#xff0c;并且不打算使用其他类型的编辑器&#xff0c;那么这篇教程将会比较适合你。这里将会详细介绍如何在Pycharm IdeaVim插件的帮助下下载、安装、使用Vim。至于有关Python编程以及Vim的用法&…

什么是cname a记录

https://support.dnsimple.com/articles/cname-record/ CNAME就是别名记录&#xff0c;就是负责跳转&#xff0c;比如你给某个地址设置了一个cname,那当访问那个cname的时候&#xff0c;就会跳转到那个某个地址 a记录就是一个ip地址所对应的地址。可以理解为a记录就是一个连接器…

Spring上传时报Invalid CSRF Token错误解决方案

概述 使用spring security之后&#xff0c;默认上传文件会报这个错&#xff0c;解决方案有下面两个&#xff1a; 解决方案一&#xff1a; 将 MultipartFilter 放在 springSecurityFilterChain 前面 修改web.xml文件&#xff1a; <!-- 文件上传过滤器&#xff0c;过滤上传…

windows 修改nginx端口号_分享Nginx搭建图片服务器简单实现

第一步&#xff1a;安装vsftpd提供ftp服务https://www.cnblogs.com/lyq159/p/12070791.html第二步&#xff1a;安装Nginx提供http服务1.安装准备&#xff1a;安装Nginx环境a) gcc      安装nginx需要先将官网下载的源码进行编译&#xff0c;编译依赖gcc环境&#xff0c;如…

C#学习笔记-数据的传递(公共变量)以及Dictionary

看的代码越多&#xff0c;写的代码越多&#xff0c;就越是享受这些字符&#xff0c;终于渐渐懂得了那种传闻中的成就感&#xff0c;特别是自己从看不懂然后一步一步学&#xff0c;一个代码一个代码地敲&#xff0c;最后哪怕只是完成了一个小功能&#xff0c;也都是特别自豪的&a…

spring webflow : 上传单个文件实例

准备 如果你项目中使用了spring security的话&#xff0c;参考上一篇文章&#xff0c;使用上篇的第二种方法&#xff0c;并去掉MultipartFilter&#xff08;如果有配置的话&#xff09;&#xff0c;否则得不到文件流程中的变量&#xff08;如用var标签定义的变量&#xff09;&…

pythonopencv图像形态_Python+OpenCV图像处理之其他形态学操作

顶帽(Top Hat)&#xff1a;原图像与开操作之间的差值图像&#xff0c;突出原图像中比周围亮的区域黑帽(Black Hat)&#xff1a;闭操作图像与原图像的差值图像, 突出原图像中比周围暗的区域形态学梯度(Gradient)&#xff1a;基础梯度&#xff1a;基础梯度是用膨胀后的图像减去腐…

Spring webflow:上传多个文件

上篇讲了上传单个文件&#xff0c;在上篇的基础上稍作修改就可以上传多个文件了。 实现 首先&#xff0c;实体类要修改&#xff0c;使用List来存储多个文件&#xff1a; Component public class GoodsEntity implements Serializable{private static final long serialVersi…

csv格式清洗与转换python_实例详解Python中 CSV格式清洗与转换

Python中 CSV格式清洗与转换的实例代码题目&#xff1a;CSV格式清洗与转换描述附件是一个CSV格式文件&#xff0c;提取数据进行如下格式转换&#xff1a;‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪…

斐波那契数列通项公式

1.对于斐波那契数列来说&#xff0c;存在通项公式&#xff0c;f[n] 2、Hdu练习题1568&#xff1b; 大意求斐波那契数列中的某一项&#xff0c;n很大&#xff0c;只能在O(1)时间求出&#xff0c;并且只要前四位 当n很大时最后一项几乎为零转载于:https://www.cnblogs.com/dlut-l…

Spring MVC 生成文件类型响应

图片控制器代码如下&#xff1a; Controller RequestMapping("/") public class WebController {RequestMapping(methodRequestMethod.GET,path"/img/{imgNo}")public void getImg(HttpServletResponse response,int index) throws IOException{ //读取图…

服务器驱动精灵_驱动精灵真的可以帮你安装驱动吗?别再无脑装驱动了

之前和大家讲过一期安装官方纯净系统的方法&#xff0c;戳我查看然后很多人就说重装之后显卡驱动掉了打游戏卡的跟PPT一样。于是很多人在重装系统或是进行了重大硬件更新后&#xff0c;一般会采用第三方驱动管理软件来进行硬件的更新&#xff0c;实际上这是一种自杀式行为&…

(原创)网吧桌面背景添加文字,转载注明出处!

很简单的小工具&#xff0c;可用于公告等。 下载地址&#xff1a;http://pan.baidu.com/s/1i5dPQTJ 密码&#xff1a;sfw7 博客地址&#xff1a;http://www.cnblogs.com/flybox/ 如有必要&#xff0c;后续可添加功能&#xff1a;远端配置文字内容等&#xff0c;方便多网吧统一…

MongoDB 操作范例

查询 查询嵌套文档 比如&#xff0c;有商品文档goods&#xff0c;结构如下&#xff1a; {"name":"牙刷","class":{"classNo": 111,"name":"日用品"} } 现在要查找所有 classNo111的商品&#xff0c;怎么查&am…

前端vue适配不同的分辨率_前端面试时,被问到项目中的难点有哪些?

在每个前端求职者的面试过程中&#xff0c;一定都有过被面试官问到项目中的难点&#xff0c;而答不上来的情况。为了让大家在前端面试前准备得更加充足&#xff0c;小编准备了一些易被忽视且难度较高的前端面试题&#xff0c;希望可以帮助大家更加顺利完成求职&#xff0c;找到…

web语义化与h5新增标签

Web语义化就是html告诉我们也告诉机器这一块是什么内容&#xff0c;例如&#xff1a;“这行是一个标题&#xff0c;这几行组成一个段落&#xff0c;这是一个列表&#xff0c;那是一个链接。”Web语义化有三个阶段&#xff1a;1、h1~h6、thead、ul、ol等HTML标签。这些标签用于在…

在jsp页面里动态生成EL表达式的key

如图&#xff0c;页面中有n个商品列表需要加载&#xff0c;这个列表的名字分别是list1、list2…listn&#xff0c;总之不是写死的。 在Ctroller里面&#xff0c;可见参数名师动态生成的&#xff1a; RequestMapping(method RequestMethod.GET) public String showIndex(Model…

python做马尔科夫模型预测法_通过Python的Networkx和Sklearn来介绍隐性马尔科夫模型...

Python部落(python.freelycode.com)组织翻译&#xff0c;禁止转载&#xff0c;欢迎转发。文章梗概马尔科夫是何人&#xff1f;马尔科夫性质是什么&#xff1f;马尔科夫模型是什么&#xff1f;是什么让马尔科夫模型成为隐性的&#xff1f;一种能够用于条件检测的马尔科夫模型结论…

给JAVA初学者的50个忠告

给JAVA初学者的50个忠告 摘自: http://wenku.baidu.com/link?urlp5vDKt5bKzUXxG_hAsB9XopHJRROeovOGGh4jnXGZXiUedR-fNOLO7zb6ddENo5UhJTjRS9KdugEBL_7t13Nz5vZnvCmLRbHrwwjfGSi8XC 给JAVA初学者的50个忠告   1.把JAVA当成一门新的语言学习&#xff08;和其他语言没啥关系&a…

换乐网redis应用分析

没听过换乐网&#xff1f;没错&#xff0c;它在我的电脑里 用法用途 在项目中&#xff0c;redis主要用作缓存。而在作为缓存&#xff0c;意义最大的是缓存计算结果&#xff0c;因为有些计算是一个很耗时间和资源的过程&#xff0c;而计算的结果不会经常改变&#xff0c;这时使…