mex*_*ue1 2 spring-mvc spring-webflow-2
我有一个HandlerInterceptor来添加一些"全局"模型变量.有用.
现在,出于同样的原因,我尝试在Spring Web Flow中重用它.
但 HandlerInterceptors在Spring Web Flow下将ModelAndView参数设置为NULL(无法解释原因,但这是事实).
我在FlowHandlerMapping bean中引用了我的拦截器:
<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>
Run Code Online (Sandbox Code Playgroud)
如何将变量添加到模型中?
有一个解决方法,例如请求参数?
从Spring Webflow 2开始,ModelAndView不再生成该对象(请参阅SpringSource论坛上的这篇文章(和帖子)).
该FlowHandlerAdapter手柄()函数不会再产生ModedAndView(它只是返回null),即使该功能是:
public ModelAndView handle(HttpServletRequest request,
HttpServletResponse response, Object handler)
Run Code Online (Sandbox Code Playgroud)
因此覆盖此函数毫无意义,但此函数ServletExternalContext通过调用其方法创建一个对象,该对象包含所有流变量:
protected ServletExternalContext createServletExternalContext(
HttpServletRequest request, HttpServletResponse response)
Run Code Online (Sandbox Code Playgroud)
通过重写此函数,您可以使用此流变量完成所需的操作.
要做到这一点,只需创建一个扩展的类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;
}
}
Run Code Online (Sandbox Code Playgroud)
您有FlowHandlerAdapterwebflow-context.xml文件中定义的对象,如下所示:
<bean class="org.springframework.webflow.mvc.servlet.FlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
只需将其替换为:
<bean class="my.package.MyFlowHandlerAdapter">
<property name="flowExecutor" ref="flowExecutor"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4303 次 |
| 最近记录: |