从 Spring Webflow 2 开始,ModelAndView
不再生成对象(请参阅SpringSource 论坛上的这篇文章(和线程))。
handle ( FlowHandlerAdapter
) 函数不再生成 ModedAndView(它只是返回 null),即使此函数是:
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object handler)
所以重写这个函数是没有意义的,但是这个函数ServletExternalContext
通过调用它的方法创建了一个对象,它保存了所有的流变量:
protected ServletExternalContext createServletExternalContext(
HttpServletRequest request, HttpServletResponse response)
通过覆盖这个函数,你几乎可以用这个流变量做你想做的事。
为此,只需创建一个扩展类FlowHandlerAdapter
,注册它而不是 FlowHandlerAdapter 并覆盖该createServletExternalContext
函数。
基本上你ServletExternalContext.getSessionMap()
用来访问SharedAttributeMap
和注册你的属性。
由于您可以访问HttpServletRequest
和HttpServletResponse
对象,因此此方法可以像函数一样HandlerInterceptorAdapter.postHandle
起作用。
请参阅下面的示例。
我省略了如何使用通用方式为HandlerInterceptor
MVC 和这个对象重用相同的代码,但是通过实现HandlerInterceptor
.
MyFlowHandlerAdapter :
package my.package;
public class MyFlowHandlerAdapter extends FlowHandlerAdapter {
@Override
protected ServletExternalContext createServletExternalContext(
HttpServletRequest request,
HttpServletResponse response) {
ServletExternalContext context =
super.createServletExternalContext(request,response);
context.getSessionMap().put("myproperty", "myvalue");
return context;
}
}
您FlowHandlerAdapter
在 webflow-context.xml 文件中定义了对象,如下所示:
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
只需将其替换为:
<bean class="my.package.MyFlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>