使用Spring WebFlow的Apache Tiles通配符

use*_*914 7 java jsp tiles spring-webflow

Apache Tiles 2.1.3具有通配符功能,其中tile定义包含星号:

<definition name="flow/*" extends=".mainTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>
Run Code Online (Sandbox Code Playgroud)

这里解释,但基本上这个布局用于"flow"目录中的任何JSP.

问题是Spring Webflow用Tiles产生了无限递归:

org.springframework.webflow.execution.FlowExecutionException: Exception thrown in state 'createAccount' of flow 'jsp/flow'
Caused by: java.lang.IllegalStateException: Exception occurred rendering view null
Caused by: java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)

我最终插入了许多单独的Tiles定义,而不是一个通配符定义(在这里插入frowny face).

Tiles通配符如何与Spring WebFlow一起使用?

use*_*914 6

简单修复:您不能将默认Web流视图名称与通配符一起使用,因为您无法像这样创建通配符Tiles定义:

<definition name="*" extends=".flowTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>
Run Code Online (Sandbox Code Playgroud)

如果您提供如下的纯"*"定义,Tiles系统将进入(看似)无限循环:

name="*" 
Run Code Online (Sandbox Code Playgroud)

这样做的方法是提供这样的定义:

<definition name="flow/*" extends=".flowTemplate">
    <put-attribute name="header" value="/WEB-INF/jsp/header.jsp"  />
    <put-attribute name="body" value="/WEB-INF/jsp/flow/{1}.jsp"  />
</definition>
Run Code Online (Sandbox Code Playgroud)

然后强制您的Web Flow视图名称到该表单,如下所示:

<view-state id="myView" model="myView" view="flow/myView">
    <transition on="back" to="previousView" />
    <transition on="next" to="nextView" />
</view-state>
Run Code Online (Sandbox Code Playgroud)

默认视图名称是视图ID,在本例中为"myView".您无法为视图提供"flow/myView"的ID,但您可以单独指定视图名称

view="flow/myView"
Run Code Online (Sandbox Code Playgroud)

这将把正确的值提供给Tiles解析器.我确信Tiles视图命名和Web Flow视图分辨率还有其他皱纹,但这解决了我的问题.

一定要引用正确的URL(即,根据需要注入"flow /").