从 Spring Webflow 2 开始,不再生成 ModelAndView 对象(请参阅 SpringSource 论坛上的 this post(和线程)。
FlowHandlerAdapterhandle() 函数不再生成 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 函数非常相似。
请参阅下面的示例。
我省略了如何使用通用方式为 MVC 和这个对象的 HandlerInterceptor 重用相同的代码,但通过实现 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;
}
}
您在 webflow-context.xml 文件中定义了 FlowHandlerAdapter 对象:
<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>