gpt4 book ai didi

spring-mvc - 使用 HandlerInterceptor 通过 Spring Web Flow 添加模型属性

转载 作者:行者123 更新时间:2023-12-04 09:11:23 25 4
gpt4 key购买 nike

我有一个 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>

如何向模型添加变量?

是否有解决方法,例如请求参数?

最佳答案

从 Spring Webflow 2 开始,ModelAndView不再生成对象(请参阅 SpringSource 论坛上的 this post(和线程))。


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并注册您的属性(property)。

因为您可以访问 HttpServletRequestHttpServletResponse对象,这个方法可以像 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>

关于spring-mvc - 使用 HandlerInterceptor 通过 Spring Web Flow 添加模型属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9687084/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com