【问题标题】:Spring Web Flow: Can't get second viewSpring Web Flow:无法获得第二个视图
【发布时间】:2014-05-28 19:44:21
【问题描述】:

我正在使用 Spring Web Flow 进行注册过程。我完美地拥有了流程的第一页,但是当我单击应该将您带到第二页的按钮时,我再次获得了流程的第一页。正如您将在代码中看到的那样,我在标签上有 flowExecutionKey,当我单击按钮时它从 e1s1 变为 e2s1,因此我认为它不会引导我进入流程的第二个视图,而是开始一个新流程.

代码如下:

所以,我有这个 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/webflow
    http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd" start-state="inicio">
    <var name="proyecto" class="myPackage.MyModelClass"/>
<view-state id="inicio" view="inicio" model="proyecto">
    <binder>
        <binding property="titulo"/>
        <binding property="descripcion"/>
        <binding property="ciudad"/>

    </binder>
    <transition on="gotoPageTwo" to="flow2"></transition>

</view-state>
<view-state id="flow2" view="flow2" model="proyecto">
    <transition on="gotoPageThree" to="flow3"></transition>
    <transition on="goBack" to="inicio"></transition>
</view-state>
<view-state id="flow3" view="flow3" model="proyecto">
    <transition on="gotoPageFour" to="fin"></transition>
    <transition on="goBack" to="flow2"></transition>
</view-state>
<end-state id="fin" view="final">
</end-state>

这是我的 inicio.jsp:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page session="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<link href="/myapp/resources/css/main.css" rel="stylesheet" type="text/css">
<link href="/myapp/resources/css/tcal.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="/myapp/resources/scripts/tcal.js"></script>
<title>Paso 1</title>
</head>
<body>
<form method="post" action="inicio.do">
<input type="hidden" name="_flowExecutionKey" value="${flowExecutionKey}">
<label>flowExecutionKey: ${flowExecutionKey}</label>
<table>
<tr>
    <td>
        <label class="textform">Título del proyecto</label>
    </td>
    <td>
        <input type="text" name="titulo">
    </td>
</tr>
<tr>
    <td>
        <label class="textform">Descripción</label>
        </td>
    <td>
        <input type="text" name="descripcion">
    </td>
</tr>
<tr>
    <td>
        <label class="textform">Ciudad del proyecto</label>
    </td>
    <td>
        <input type="text" name="ciudad">
    </td>
</tr>

<tr>
    <td>
      <input type="submit" value="Siguiente" name="_eventId=gotoPageTwo">
    <%--<a href="${flowExecutionUrl}&_eventId=gotoPageTwo&_flowExecutionKey=${flowExecutionKey}"> Siguiente página</a> 
         <input type="submit" value="Siguiente" name="eventId=gotoPageTwo">
          <input type="submit" value="Siguiente" name="${flowExecutionUrl}&_eventId=gotoPageTwo">--%>
    </td>
</tr>

如您所见,我尝试发送 gotoPageTwo 的 eventId,如 flow.xml 中所述。

和 servlet-context.xml 上的 Spring web Flow 相关 bean:

<beans:bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

    <beans:property name="mappings">
    <beans:value>inicio.do=flowController</beans:value>
    </beans:property>
    <beans:property name="alwaysUseFullPath" value="true"></beans:property>
</beans:bean>
<beans:bean id="flowcontroller" class="org.springframework.webflow.mvc.servlet.FlowController">
<beans:property name="flowExecutor" ref="flowExecutor"></beans:property>
</beans:bean>
<webflow:flow-executor id="flowExecutor" flow-registry="flowRegistry"/>
<webflow:flow-registry id="flowRegistry" flow-builder-services="flowBuilderServices"> 
        <webflow:flow-location id="inicio" path="/WEB-INF/flujos/flow.xml"/> 
</webflow:flow-registry>   
<webflow:flow-builder-services id="flowBuilderServices" 
        view-factory-creator="viewFactoryCreator"/>
        <beans:bean id="viewFactoryCreator" class="org.springframework.webflow.mvc.builder.MvcViewFactoryCreator">
        <beans:property name="viewResolvers">
        <beans:list>
            <beans:ref bean="viewResolver"/>
        </beans:list>
        </beans:property>
        </beans:bean>
 <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/views/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

为什么会这样?我的错误在哪里? cmets 中的第一个链接有效并呈现第二个视图,但我认为它不发送表单,所以我没有数据,它是一个链接,而不是一个按钮:

<a href="${flowExecutionUrl}&_eventId=gotoPageTwo&_flowExecutionKey=${flowExecutionKey}"> Siguiente página</a>

其他的cmet都是我试过的,没用。

谢谢!

【问题讨论】:

    标签: spring jsp spring-mvc spring-webflow


    【解决方案1】:

    您需要将代码更改为:

        <td>
            <input type="submit" value="Siguiente" name="_eventId_gotoPageTwo">
        </td>
    

    当您使用锚点 href 时,您将 _eventId 作为参数传递,因此您拥有 _eventId=gotoPageTwo

    而现在“_eventId”被编码在按钮字段的名称中,因此当提交表单时,“gotoPageTwo”事件将在流的当前状态下发出信号。

    另外,将表格更改为

        <form:form method="post"  modelAttribute="proyecto">
    

    【讨论】:

    • 这是一个很好的提示,我把按钮名称中的 = 和 _ 混淆了,但是不幸的是它不起作用。我一直保持流的第一个状态,flowexecutionKey 从 e1s1 更改为 e2s1。谢谢。
    • 上下文文件中的2个问题:1)为什么你有2个flowControllers? 2)viewResolver bean 怎么样?(显示细节)
    • 1) 我已经做了很多测试,也许我添加了最后一个,但我之前添加了一个 2) 查看编辑。
    • 好的,不用作视图的动作属性由 flowController 控制。另外,我建议使用弹簧形式标签。我进行了编辑以在答案中提出相同的建议。移除多个 flowController 定义。
    • 我搬到了 Spring Form Library,现在它可以工作了。谢谢!但这是否意味着不使用这个标签库就无法做到呢?
    猜你喜欢
    • 1970-01-01
    • 2012-12-19
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 1970-01-01
    相关资源
    最近更新 更多