1

我正在研究网络流(SWF2)。实体是使用 Roo 生成的。其中一个 webflow 视图 multi-instance.jspx 可能会被多次调用,以允许同一实体 (MyClass) 的多个持久实例。

我想保留这些持久实体的列表,以便稍后在流程中引用它们。到目前为止,我已经尝试了以下方法。

我的简化版本flow.xml如下所示:

<on-start>
    <evaluate expression="new java.util.ArrayList()" result="flowScope.myList" result-type="java.io.Serializable"/>
</on-start>

<view-state id="multi-instance" view="multi-instance" model="myClass">
    <binder>
        <binding property="field1"/>
        <binding property="field2"/>
    </binder>
    <on-entry>
        <evaluate expression="new com.test.MyClass()" result="flowScope.myClass" />
    </on-entry>
    <transition on="another_instance" to="multi-instance"/>
    <transition on="success" to="confirm"/>
    <transition on="cancel" to="abort"/>
    <on-exit>
        <evaluate expression="myClass.persist()"/>
        <evaluate expression="flowScope.myList.add(myClass)"/>
    </on-exit>
</view-state>

和视图状态也被confirm定义。看起来像这样:abortflow.xmlconfirm.jspx

<div xmlns:spring="http://www.springframework.org/tags" xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions" xmlns:form="http://www.springframework.org/tags/form" xmlns:util="urn:jsptagdir:/WEB-INF/tags/util" xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<jsp:output omit-xml-declaration="yes" />
<form:form>
    <c:forEach items="${myList}" var="instance">
        <li>${instance.getField1()} ${instance.getField2()}</li>     
</c:forEach>
    <div class="submit">
        <input type="submit" id="success" name="_eventId_success" value="success"/>
        <input type="submit" id="cancel" name="_eventId_cancel" value="cancel" />
    </div>
</form:form>    
</div>

所以对于这个问题:

每当我点击confirm.jspx时,网络返回都会显示 org.springframework.webflow.engine.impl.FlowExecutionImpl.wrap(FlowExecutionImpl.java:569) 抛出异常。

编辑:Apache 日志更有启发性。以下是调用堆栈顶部的片段:

SEVERE: Servlet.service() for servlet jsp threw exception org.apache.jasper.JasperException: 
/WEB-INF/views/myflow/confirmation.jspx(6,7)
The function getField1 must be used with a prefix when a default namespace is not specified
    at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)

我不确定 ArrayList 方法是否可行;我相信我在某处读到 flowScope.myClass 实例,正如它在multi-instance-state 中定义的那样,被 GC 拾取或至少超出范围。我不知道。如果有人能对那个特定的话题有所了解,我会很激动。

(如果您碰巧知道保存这些持久实体列表的更好方法,请随时告诉我!)提前致谢!:)

更新: 我可以像这样计算列表中的元素数量:

<c:choose>
    <c:when test="${myList != null}">myList exists, it contains <c:out value="${fn:length(myList)}" /> items!</c:when>
    <c:otherwise>myList doesn't exist.</c:otherwise>
</c:choose>

它显示的元素数量与我插入的相同。但是,当我这样做时:

<c:forEach items="${myList}" var="instance">
    <c:if test="${instance != null}">
        <li>${instance.field1} ${instance.field2}</li>
    </c:if>
</c:forEach>

什么都没有显示。(当省略空测试时,我可以确认 <li> 元素的数量是正确的。另请注意,我正在尝试直接访问属性,如此处所示:jstl/jsp - iterating over a vector of beans ) 关于这里的范围,我不知道该怎么想,但很明显我无法通过 ArrayList 访问我的实体。

4

1 回答 1

1

首先,关于您关于变量范围的问题,我建议您查看 SWF 文档的第4.4节,其中描述了所有不同的可用范围。

流范围变量存在于流的整个生命周期中。因此,在流程退出之前,您的 myClass 变量不会消失。但是请记住,<on-entry>每次进入该视图状态时,您的表达式都会分配一个新实例。

其次,我认为您的解决方案可能走在正确的轨道上。我要注意几点:

  1. 您在<on-exit>元素中坚持并添加到您的列表中——这意味着当您离开状态时,这两件事总是会发生,包括当您进行cancel转换时。这可能不是你想要的。有关的:
  2. <transition on="another_instance" to="multi-instance"/>实际上是退出视图状态并重新进入它,触发<on-exit>and<on-entry>逻辑。只需执行 . 即可保持相同的状态<transition on="another_instance">。这样做将执行您在转换中的任何逻辑,然后重新渲染视图而不实际更改状态。
  3. 您可能需要考虑使用<var>标签来初始化变量......您正在使用的<evaluate expression="new ..."/>工作但使用<var>可能更清洁。另外,没必要说result-type="java.io.Serializable"result-type当您需要将返回类型转换为其他类型时应该使用它。

最后,您得到的错误看起来与 webflow 无关。JSTL/EL 允许您访问 bean 属性但不允许访问方法,并且您正在尝试调用方法。有关更多信息,请参阅此问题

于 2011-06-01T20:45:17.210 回答