DispatcherServlet与base-path、流程id、流程定义文件

/WEB-INF/flows/regist/regist-flow.xml,

/WEB-INF/flows/是我们上面配置的base-path,

/regist/regist-flow.xml是/流程id/流程定义文件, 流程点以文件命名为”流程id-flow.xml”,

这样我们访问regist请求时,如果DispatcherServlet找不到对应的处理器,就会交给Web Flow,这样Web Flow就会按照流程定义开始流程。

xml 流程定义

view-state,action-state,decision-state,end-state,subflow-state

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <flow xmlns="http://www.springframework.org/schema/webflow"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/webflow
  5. http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">
  6. <!-- flow作用域的变量,我们这个流程的模型对象 -->
  7. <var name="user"
  8. class="com.yjp.springmvc.blog.beans.model.User"/>
  9. <!-- 欢迎界面,默认找welcome.jsp -->
  10. <view-state id="welcome">
  11. <transition on="register" to="register"/>
  12. </view-state>
  13. <!-- 注册界面,默认找register.jsp -->
  14. <view-state id="register" model="user">
  15. <transition on="doRegist" to="doRegist"/>
  16. </view-state>
  17. <!-- 使用registAction判断是否注册成功,执行跳转 -->
  18. <decision-state id="doRegist">
  19. <if test="registAction.regist(user)"
  20. then="complete"
  21. else="register" />
  22. </decision-state>
  23. <!-- 完成界面,默认找complete.jsp -->
  24. <view-state id="complete" model="user">
  25. <transition on="login" to="end"/>
  26. </view-state>
  27. <!-- 结束状态-->
  28. <end-state id="end" view="externalRedirect:/"/>
  29. <!-- 全局转移 -->
  30. <global-transitions>
  31. <transition on="cancel" to="end" />
  32. </global-transitions>
  33. </flow>

使用了view-state,decision-state和end-state,通过转移将他们串联起来。

<global-transitions>全局转移,无论哪个状态以cancel终结,都会进入到end-state。如下图:

Spring MVC-web flow - 图1

decision-state decision-state中使用的action类

  1. package com.yjp.springmvc.blog.web.flowaction;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.stereotype.Component;
  4. import com.yjp.springmvc.blog.beans.model.User;
  5. import com.yjp.springmvc.blog.beans.service.UserService;
  6. @Component
  7. public class RegistAction {
  8. private UserService userService;
  9. @Autowired
  10. public RegistAction(UserService userService) {
  11. this.userService = userService;
  12. }
  13. public boolean regist(User user) {
  14. return userService.saveUser(user);
  15. }
  16. }

模板文件

welcome.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page isELIgnored="false" %>
  4. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>欢迎</title>
  10. </head>
  11. <body>
  12. <h1>欢迎您选择简微</h1>
  13. 如果您喜欢我们的简微,请点击下一步,开始您的旅程<br><br>
  14. <sf:form>
  15. <input type="hidden" name="_flowExecutionKey"
  16. value="${flowExecutionKey} }"/>
  17. <input type="submit" name="_eventId_register"
  18. value="下一步"/>
  19. <input type="submit" name="_eventId_cancel"
  20. value="取消"/>
  21. </sf:form>
  22. </body>
  23. </html>

Spring的标签库中的form标签:

eventId事件: 以表明点击该按钮触发的事件,这会用在流程中transition的on属性,用来判断下一步的流程走向。其他的没有特殊的。

register.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
  4. <!DOCTYPE html>
  5. <html>
  6. <head>
  7. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  8. <title>注册</title>
  9. </head>
  10. <body>
  11. <h1>会员注册</h1>
  12. <sf:form commandName="user">
  13. <input type="hidden" name="_flowExecutionKey"
  14. value="${flowExecutionKey} }"/>
  15. <table style="background-color:#cccccc">
  16. <tr>
  17. <td>邮件地址:</td>
  18. <td><sf:input type="emil" path="email" size="25" maxlength="100" cssErrorClass="error"/></td>
  19. </tr>
  20. <tr>
  21. <td>名称(最大16字符):</td>
  22. <td><sf:input type="text" path="username" size="25" maxlength="16" cssErrorClass="error"/></td>
  23. </tr>
  24. <tr>
  25. <td>密码(6到16字符):</td>
  26. <td><sf:input type="password" path="password" size="25" maxlength="16" cssErrorClass="error"/></td>
  27. </tr>
  28. <tr>
  29. <td>确认密码:</td>
  30. <td><input type="password" name="confirmedPasswd" size="25" maxlength="16"></td>
  31. </tr>
  32. <tr>
  33. <td align="center"><input type="submit" name="_eventId_doRegist" value="注册"></td>
  34. <td align="center"><input type="submit" name="_eventId_cancel" value="取消"></td>
  35. </tr>
  36. </table>
  37. </sf:form>
  38. </body>
  39. </html>

complete.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. pageEncoding="UTF-8"%>
  3. <%@ page isELIgnored="false" %>
  4. <%@ taglib prefix="sf" uri="http://www.springframework.org/tags/form" %>
  5. <!DOCTYPE html>
  6. <html>
  7. <head>
  8. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  9. <title>注册完成</title>
  10. </head>
  11. <body>
  12. <h1>恭喜 ${user.username} 完成注册</h1>
  13. <a href="${flowExecutionUrl}&_eventId=login">去登陆</a>
  14. </body>
  15. </html>