Spring mvc 使用HandlerInterceptor向SpringWebFlow添加模型属性
我有一个HandlerInterceptor来添加一些“全局”模型变量。它起作用了 现在,出于同样的原因,我尝试在SpringWebFlow中重用它 但是HandlerInterceptors在SpringWebFlow下将ModelAndView参数设置为NULL(不知道为什么,但这是事实) 我在FlowHandlerMappingbean中引用了我的拦截器:Spring mvc 使用HandlerInterceptor向SpringWebFlow添加模型属性,spring-mvc,spring-webflow-2,Spring Mvc,Spring Webflow 2,我有一个HandlerInterceptor来添加一些“全局”模型变量。它起作用了 现在,出于同样的原因,我尝试在SpringWebFlow中重用它 但是HandlerInterceptors在SpringWebFlow下将ModelAndView参数设置为NULL(不知道为什么,但这是事实) 我在FlowHandlerMappingbean中引用了我的拦截器: <bean class="org.springframework.webflow.mvc.servlet.FlowHandler
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerMapping">
<property name="order" value="0" />
<property name="flowRegistry" ref="flowRegistry" />
<property name="interceptors">
<list>
<ref bean="myInterceptor" />
</list>
</property>
</bean>
如何向模型中添加变量
是否有解决方法,例如使用请求参数?
ModelAndView
在拦截器处理Ajax请求时可以为null
只需检查
ModelAndView
是否为空。如果没有,那是因为拦截器正在处理一个视图模型,所以您可以在此时添加变量。从SpringWebflow 2开始,不再生成ModelAndView
对象(请参阅SpringSource论坛上的(和线程)
FlowHandlerAdapter
handle()函数不再生成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>
无控制器:这是一个网络流!:-)实际上,我找到了一个“干净”的解决方法:我创建了一个@Service注释类,该类由HandlerInterceptor为MVC组件调用,在流内部为SWF组件调用。这在某种程度上避免了代码重复。嗨,我在SpringWebFlow中集成拦截器时遇到了一个问题,你能帮我吗。