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,一经查实,立即删除!

相关文章

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…

斐波那契数列通项公式

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

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

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

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

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

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

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

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

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

AutoLayout--masonry使用

[label1 mas_makeConstraints:^(MASConstraintMaker *make) { //使左边间距为 make.left.equalTo(self.view.mas_left).offset(11); //顶部间距 make.top.equalTo(self.view.mas_top).offset(70); //高度 make.height.equalTo(30); }]; [label2 mas_makeConstraints:^(MASConst…

matplotlib 热力图_5分钟入门 Seaborn 热力图可视化

Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matplotlib的基础上进行了更高级的API封装&#xff0c;从而使得作图更加容易&#xff0c;不需要经过大量的调整就能使你的图变得精致。注&#xff1a;所有代码均在IPy…

Linq(拓展方法+select())

拓展方法&#xff1a; 目的&#xff1a;对于已存在类型的行为进行拓展 注意事项&#xff1a; 1&#xff1a;扩展方法必须是一种特殊的静态方法 2&#xff1a;扩展方法必须是在静态类中 3: 扩展方法的优先级低于同名类的方法 4&#xff1a;扩展方法只在特定的命名空间内有效 5&a…

手机全部零件名称图片_【直播课】一条记录中显示多张图片

↑点击上方“Access软件网”免费订阅温馨提示这是一节免费课&#xff0c;干货太多&#xff0c;强烈推荐&#xff01;今天(2019年1月10日)晚上8点&#xff0c;准时开讲&#xff0c;欢迎大家前来听课&#xff01;点击文章末尾左下角的原 理本课示例是显示某个零件的图片&#xf…

snmp获取交换机日志_日志审计系统和数据库审计系统的区别

今天就易混淆的日志审计系统与数据库审计系统进行辨析。从日志审计系统和数据库审计系统的技术特点和原理来切入&#xff0c;来分析日志审计系统与数据库审计系统的异同。01、日志审计系统系统日志系统日志是记录系统中硬件、软件和系统问题的信息&#xff0c;同时还可以监视系…

java web开发基础学习

由于以前很少用java开发&#xff0c;至于连myEclipse都不怎么熟悉。 1、使用myEclipse生成部署网站步骤。 选tomcat后点击右边的Redeploy 这样便在tomcat目录下生成了一个部署网站文件。 2、使用myEclipse调试web步骤 将project下拉中所有项目的server全部remove. 留下需要调试…

装B指南之使用浏览器播放电影

家里断网了&#xff0c;女票说要看电影。电影之前早已下好&#xff0c;奈何播放器不给力&#xff0c;播放不了rmvb格式&#xff0c;怎么办&#xff1f; 办法很简单&#xff0c;使用浏览器来播放&#xff01;现在的浏览器都内置了视频的解码器&#xff0c;直接将视频拖进浏览器…

C#链接mysql 新手容易出错的问题

1.Access denied for user rootDESKTOP-AN72KEI (using password: YES) 出现这个问题的原因是因为mysql的自带用户root理论上是不允许对外访问的&#xff0c;只能本地访问&#xff0c;如果需要访问该用户&#xff0c;需要修改一些mysql的配置文件&#xff0c;最好是使用自己新建…

TCP笔记

TCP笔记 概念 MTU&#xff1a;maximum transmission unit最大传输单元 每种网络都不一样&#xff0c;以太网是1500。最小46字节。当数据块大于MTU时&#xff0c;将在发送端IP层进行分片&#xff0c;接收端IP层进行重组。IP分组在网络中传输中出现丢包时&#xff0c;由于IP层没有…

微信语音怎么转发给别人听_微信分付怎么邀请别人 微信分付如何才能被邀请开通...

阅读本文前&#xff0c;请您先点击上面蓝色字体&#xff0c;再点关 注这样您就可以继续免费收到文章了&#xff0c;每天都有分享&#xff0c;完全是“免费订阅”&#xff0c;请放心关注注&#xff1a;本文转载自网络&#xff0c;如有侵权&#xff0c;请在后台留言联系我们进行删…

Javascript事件委托

Javascript事件通过冒泡传递&#xff0c;事件最初发生在某个元素&#xff0c;然后传递给该元素的父元素&#xff0c;父元素再传给父元素&#xff0c;如此一级一级往上传递。如果事件发生的元素不处理事件&#xff0c;而是让事件传递到祖先元素&#xff0c;让祖先元素处理&#…

Cmd Markdown 简明语法手册

转自地址&#xff1a; https://www.zybuluo.com/mdeditor?urlhttps://www.zybuluo.com/static/editor/md-help.markdown『Cmd 技术渲染的沙箱页面&#xff0c;点击此处编写自己的文档』Cmd Markdown 简明语法手册 Cmd-Markdown 1. 斜体和粗体 使用 * 和 ** 表示斜体和粗体。 示…

【poj3070】Fibonacci

矩乘快速幂入门 题目已经把题解讲得很清楚了 1 #include<cstdio>2 #include<cstring>3 #include<cassert>4 #include<algorithm>5 using namespace std;6 #define p 100007 #define N 108 #define ll long long9 struct matrix{ 10 int n,m; 11 …