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一起使用?
简单修复:您不能将默认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 /").